DSP

以十字链表为存储结构实现矩阵相加

2019-07-13 19:59发布

以十字链表为存储结构,编写程序,将稀疏矩阵B加到稀疏矩阵A。第一行输入四个正整数,分别为稀疏矩阵A和稀疏矩阵B的行数m、列数n、稀疏矩阵A非零元素个数t1和稀疏矩阵B的非零元素个数t2。接下来的t1+t2行三元组表示,其中第一个元素表示非零元素所在的行值,第二个元素表示非零元素所在的列值,第三个元素表示非零元素的值。输出相加后的矩阵三元组。3 4 3 21 1 11 3 12 2 21 2 12 2 31 1 11 2 11 3 12 2 5#include #include typedef struct olnode { int row,col,num; struct olnode *down,*right; }olnode,*olink; typedef struct crosslist { int mu,nu,tu; olnode *rhead[100],*chead[100]; }crosslist; void init(crosslist *M) { int m, n,t1,i;//输入行列数,以及每个矩阵的非零元素数 scanf("%d%d%d",&m,&n,&t1); M->mu = m; M->nu = n; M->tu = t1; for(i = 1;i <= m;i++) { M->rhead[i] = NULL; } for(i = 1;i <= n;i++) { M->chead[i] = NULL; } } void add(crosslist *M) { int i,m,n,e,t2; olink p,q; scanf("%d",&t2); for(i=1;i<=M->tu;i++) { p=(olink)malloc(sizeof(olnode)); scanf("%d%d%d",&m,&n,&e); p->row=m; p->col=n; p->num=e; //插入到头节点之后 if(M->rhead[m] == NULL||M->rhead[m]->col > n)//节点在矩阵之外的情况 { p->right = M->rhead[m]; M->rhead[m] = p; } else { for(q = M->chead[n];(q->down)&&q->down->col < n;q = q->down); p->down = q->down; q->down = p; } } int flag = 0; for(i = 0;i < t2;i++) { scanf("%d%d%d",&m,&n,&e); for(q = M->rhead[m];q;q = q->right) { if(q->col == n) { q->num = e + q->num; flag = 1; break; } } if(flag == 0) { olink p = (olink )malloc(sizeof(olnode)); p->row=m; p->col=n; p->num=e; if(M->rhead[m] == NULL||M->rhead[m]->col > n)//插入到头节点之后 { p->right = M->rhead[m]; M->rhead[m] = p; } else { for(q = M->rhead[m];(q->right)&&q->right->col < n;q = q->right); p->right = q->right; q->right = p; } } flag = 0; } } void getout(crosslist* a) { olink p; int i; for(i = 1;i <= a->mu;i++) { if(a->rhead[i] == NULL) { continue; } else { p = a->rhead[i]; while(p) { if(p->num == 0) { p = p->right;//注意会陷入死循环; continue; } printf("%d %d %d ",p->row,p->col,p->num); p = p->right; } } } } int main() { crosslist *a; a = (crosslist* )malloc(sizeof(crosslist)); init(a); add(a); getout(a); return 0; }