《数据结构》读书笔记 第五章 矩阵的顺序三元表存储

开始恢复写程序了,快正常了~这次的程序很难的,而且系列性啊……最让我惊诧的是看到了别人的减法算法,太牛了……

Matrix.h:定义了基本操作

#include <iostream>

using namespace std;
enum {OK=-1,WRONG=0,MAX=100};
typedef int Status;
typedef int Elem;

struct Triple
{
 int i,j;
 Elem e;
};

struct TMatrix
{
 Triple *data;
 int mu,nu,tu;
};

Status CreateMatrix(TMatrix &M)
{
 int i,k;
 cout<<"请输入矩阵的行数、列数、非零元素的个数:";
 cin>>M.mu>>M.nu>>M.tu;
 M.data=new Triple[M.tu+1];
 if(M.data==NULL)
  return WRONG;
 M.data[0].i=0;
 for(i=1;i<=M.tu;i++)
 {
  do
  {
   cout<<"请按顺序输入第"<<i<<"个元素的行、列、值:";
   cin>>M.data[i].i>>M.data[i].j>>M.data[i].e;
   if(M.data[i].i>M.mu||M.data[i].j>M.nu||M.data[i].j<1||M.data[i].i<1||M.data[i].e==0)
    k=-1;
   if(M.data[i].i<M.data[i-1].i||M.data[i].i==M.data[i-1].i&&M.data[i].j<=M.data[i].j)
    k=-1;
  }while(!k);
 }
 return OK;
}

void Print(TMatrix M)
{
 int i;
 cout<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元素"<<endl;
 cout<<"行 "<<"列 "<<"元素值 "<<endl;
 for(i=1;i<=M.tu;i++)
 {
  
  cout<<" "<<M.data[i].i<<"  "<<M.data[i].j<<"  "<<M.data[i].e<<endl;
 }
}

void PrintMatrix(TMatrix M)
{
 int i,j,k=1;
 Triple *p;
 p=&M.data[1];
 if(M.tu)
 {
  for(i=1;i<=M.mu;i++)
  {
   for(j=1;j<=M.nu;j++)
    if(k<=M.tu&&p->i==i&&p->j==j)
    {
     cout.width(3);
     cout<<p->e;
     p++;
     k++;
    }
    else
    {
     cout.width(3);
     cout<<0;
    }
   cout<<endl;
  }
 }
}

void DestroyMatrix(TMatrix &M)
{
 delete M.data;
 M.mu=M.nu=M.tu=0;
}

Status CopyMatrix(TMatrix M,TMatrix &T)
{
 T=M;
 return OK;
}
int comp(int c1,int c2)
{
 if(c1<c2)
  return -1;
 if(c1==c2)
  return 0;
 return 1;
}

Status AddMatrix(TMatrix M,TMatrix N,TMatrix &Q)
{
 int m=1,n=1,q=1;
 if(M.mu!=N.mu||M.nu!=N.nu)
  return WRONG;
 Q.mu=M.mu;
 Q.nu=M.nu;
 Q.data=new Triple[M.tu+N.tu+1];
 if(Q.data==NULL)
  return WRONG;
 while(m<=M.tu&&n<=N.tu)
 {
  switch(comp(M.data[m].i,N.data[n].i))
  {
  case -1:
   Q.data[q++]=M.data[m++];
   break;
  case 1:
   Q.data[q++]=N.data[n++];
   break;
  case 0:
   switch(comp(M.data[m].j,N.data[n].j))
   {
    case -1:
     Q.data[q++]=M.data[m++];
     break;
    case 1:
     Q.data[q++]=N.data[n++];
     break;
    case 0:
     Q.data[q].i=N.data[n].i;
     Q.data[q].j=N.data[n].j;
     Q.data[q].e=M.data[m++].e+N.data[n++].e;
     q++;
     break;
   }
  }
 }
 while(m<=M.tu)
 {
  Q.data[q++]=M.data[m++];
 }
 while(n<=N.tu)
 {
  Q.data[q++]=N.data[n++];
 }
 Q.tu=q-1;
 return OK;
}

Status SubtMatrix(TMatrix M,TMatrix N,TMatrix &Q)
{
 int i;
 Q.mu=M.mu;
 N.nu=N.nu;
 Q.data=new Triple[M.tu+N.tu+1];
 for(i=1;i<=M.tu;i++)
  M.data[i].e*=-1;
 AddMatrix(M,N,Q);
 return OK;
}

main.cpp:主程序

#include "Matrix.h"

int main()
{
 TMatrix T,T1,T2;
 
 cout<<"创建T1"<<endl;
 CreateMatrix(T1);
 cout<<"输出T1"<<endl;
 PrintMatrix(T1);
 cout<<"创建T2"<<endl;
 CreateMatrix(T2);
 cout<<"输出T2"<<endl;
 PrintMatrix(T2);
 AddMatrix(T1,T2,T);
 cout<<"输出T1+T2:"<<endl;
 PrintMatrix(T);
 cout<<"输出T1-T2:"<<endl;
 SubtMatrix(T1,T2,T);
 PrintMatrix(T);
 Print(T);
 return 0; 
}

Leave a Reply

Your email address will not be published. Required fields are marked *