三元顺序表基本加法以及减法

来源:互联网 发布:模联会议软件 编辑:程序博客网 时间:2024/05/02 01:32

哎,数据结构的作业题,看来还是好弱,写了两小时,在加法那里算迷糊了,三元顺序表神马的,还是不知道拿来干嘛的,操作好难过的啊,贴下挫代码纪念纪念。

//三元组顺序表进行加法及乘法运算 #include<cstdio>#include<cstdlib>#include<cstring>#define max(a,b)(a>b?a:b)#define MAXSIZE 10005 typedef struct{//定义三元顺序表的元素内涵    int i,j;//所在行列    int e;//储存元素 }Triple; typedef struct{   Triple data[MAXSIZE];//三元顺序表    int rpos[MAXSIZE];//各行第一个非零元所在三元表中的位置(下标)    int r,c,n;//代表三元顺序表表示的矩阵的行,列以及元素个数 }Tmatrix;void getTmatrix(Tmatrix &T,int matrix[105][105],int m,int n){    T.n=0, T.r=m, T.c=n;    for(int i=1; i<=m; i++){        bool flag=true;        for(int j=1; j<=n; j++)if(matrix[i][j]){            T.data[++T.n].i=i;  T.data[T.n].j=j;  T.data[T.n].e=matrix[i][j];            if(flag)T.rpos[i]=T.n;//储存每一行第一个非零元下标             flag=false;          }        if(flag)T.rpos[i]=T.n+1;    }     T.data[T.n+1].i=0x3f3f3f3f, T.data[T.n+1].j=0x3f3f3f3f; } void add(Tmatrix A,Tmatrix B, Tmatrix &C){//三元顺序表矩阵加法运算     if(A.r!=B.r||A.c!=B.c){  printf("两矩阵尺寸不相同,不可相加!\n");  return; }     if(A.n==0&&B.n==0){    printf("该矩阵为空!\n");  return; }     int a=1, b=1;    C.n=0;  C.r=A.r;  C.c=A.c;    A.data[A.n+1].i=A.r+1;//为了方便后面程序使用,使其不用特判     B.data[B.n+1].i=B.r+1;     while(a<=A.n||b<=B.n){//从两个三元组顺序表同时开始记录          if(A.data[a].i==B.data[b].i){//两个三元组顺序表当前元素行标相同               if(A.data[a].j==B.data[b].j){//若列标也相同直接相加                    C.data[++C.n].e=A.data[a].e+B.data[b].e;                   C.data[C.n].i=A.data[a].i;  C.data[C.n].j=A.data[a].j;                   a++,b++;                       }              else if(A.data[a].j>B.data[b].j){//若列标不同,按顺序先加小的                    C.data[++C.n].e=B.data[b].e;                   C.data[C.n].i=B.data[b].i;  C.data[C.n].j=B.data[b].j;                   b++;               }              else if(A.data[a].j<B.data[b].j){                   C.data[++C.n].e=A.data[a].e;                   C.data[C.n].i=A.data[a].i;  C.data[C.n].j=A.data[a].j;                   a++;              }         }          else if(A.data[a].i<B.data[b].i){//行标小的先加                   C.data[++C.n].e=A.data[a].e;                  C.data[C.n].i=A.data[a].i;  C.data[C.n].j=A.data[a].j;                  a++;                              }         else if(A.data[a].i>B.data[b].i){                  C.data[++C.n].e=B.data[b].e;                  C.data[C.n].i=B.data[b].i;  C.data[C.n].j=B.data[b].j;                  b++;         }    }    printf("计算A+B后的矩阵为:\n");    for(int i=1,k=1; i<=C.r; i++){        for(int j=1; j<=C.c; j++){              if(C.data[k].i==i&&C.data[k].j==j)printf("%d ",C.data[k++].e);              else printf("0 ");        }         printf("\n");     }     printf("计算A+B后得到的三元顺序表C为:\n");    printf("i  j  e\n");     for(int i=1; i<=C.n; i++)printf("%d  %d  %d\n",C.data[i].i,C.data[i].j,C.data[i].e);    printf("-------------------\n");}void mul(Tmatrix A, Tmatrix B, Tmatrix& C){    if(A.c!=B.r){        printf("该两个矩阵不可以相乘\n");        return;        }    if(A.n*B.n==0){        printf("该矩阵为空\n");        return;     }        int ctemp[105];//用来统计次算一行中的每个元素与所在列的元素乘积,其实也就是按矩阵乘法原理统计相乘后一行的每个元素     C.r=A.r;  C.c=B.c;  C.n=0;    for(int arow=1; arow<=A.r; arow++){//处理A的每一行          memset(ctemp,0,sizeof(ctemp));//当前行的各个列上的累加器为0         C.rpos[arow]=C.n+1;//找到当前行第一个非零元素         int tp,tq;//用来保存每一行的最后一个元素在三元顺序表的位置          if(arow<A.r)tp=A.rpos[arow+1]-1;         else  tp=A.n;                  for(int p=A.rpos[arow]; p<=tp; p++){//开始进行对每行里的元素进行乘法运算                int brow=A.data[p].j;//根据矩阵乘法原则,A中的列标要找到B中对应的行标;               if(brow<B.r)tq=B.rpos[brow+1]-1;                else  tq=B.n;               for(int q=B.rpos[brow]; q<=tq; q++){                    int col=B.data[q].j;  //乘积元素在C中的列号                     ctemp[col]+=A.data[p].e*B.data[q].e;               }          } //求出了C中第arow行的非零元         for(int col=1; col<=C.c; col++)if(ctemp[col]){//非零               C.data[++C.n].e=ctemp[col];               C.data[C.n].i=arow;  C.data[C.n].j=col;          }    }    printf("计算A+B后的矩阵为:\n");    for(int i=1,k=1; i<=C.r; i++){        for(int j=1; j<=C.c; j++){              if(C.data[k].i==i&&C.data[k].j==j)printf("%d ",C.data[k++].e);              else printf("0 ");        }         printf("\n");     }    printf("计算A+B后得到的三元顺序表C为:\n");    printf("i  j  e\n");     for(int i=1; i<=C.n; i++)printf("%d  %d  %d\n",C.data[i].i,C.data[i].j,C.data[i].e);}int main(){   int s[105][105];   int m,n;   Tmatrix A,B,C,D;   printf("请先输入稀疏矩阵A的行列数:\n");    scanf("%d %d",&m,&n);   //稀疏矩阵A转化为三元顺序表:    printf("请输入具体的矩阵A:\n");    for(int i=1; i<=m; i++)      for(int j=1; j<=n; j++)scanf("%d",&s[i][j]);   //printf("已将稀疏矩阵A转化为三元顺序表的形式.\n");    getTmatrix(A,s,m,n);   //稀疏矩阵B转化为三元顺序表:   printf("请输入稀疏矩阵B的行列数:\n");    scanf("%d %d",&m,&n);   printf("请输入具体的矩阵B:\n");    for(int i=1; i<=m; i++)      for(int j=1; j<=n; j++)scanf("%d",&s[i][j]);   //printf("已经将稀疏矩阵B转化为三元顺序表的形式.\n");    getTmatrix(B,s,m,n);   printf("__________________________________\n");   printf("进行矩阵A+B运算:\n");   add(A,B,C);    printf("进行矩阵A*B运算:\n");   mul(A,B,D);       system("pause");   return 0;} 


原创粉丝点击