//十字链表作为存储结构,存储表示随机稀疏矩阵,进行两矩阵的相加运算 #include<stdio.h> #include<stdlib.h> typedef struct sex { int row,col,val; struct sex *right,*dowm; }Node; Node * Init(int m, int n) { int t; Node *cp; m>=n?t=m:t=n; cp=(Node *)malloc( (t+1)*sizeof(Node) ); //开辟一串连续的内存空间 (*cp).row=m; (*cp).col=n; (*cp).val=t; //此表头结点的值域用来记录行列的最大值,以便于后面的开辟空间 for(int i=1;i<=t;i++) { cp[i].right=cp+i; cp[i].dowm=cp+i; //构成带表头结点的空循环单链表 } return cp; } void CreatCrossList(Node *cp) { int t; Node *s,*temp; printf("输入非零元的个数t;"); scanf("%d",&t); printf("输入非零元的坐标及元素值!/n"); for(int i=0;i<t;i++) { s=(Node *)malloc( sizeof(Node)); scanf("%d%d%d",&s->row,&(*s).col,&s->val); temp=cp+s->row; if( temp->right!=cp+s->row ) while( temp->right!=cp+s->row && temp->right->col<=s->col ) temp=temp->right; s->right=temp->right; temp->right=s; //修改行链表插入位置 temp=cp+s->col; if( temp->dowm!=cp+s->col ) while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row ) temp=temp->dowm; s->dowm=temp->dowm; temp->dowm=s; //修改列链表插入位置 } } void output(Node *cp) { Node *temp; printf("/n稀疏矩阵如下:/n"); for(int i=1;i<=cp->row;i++) { temp=cp+i; while( temp->right!=cp+i ) { printf("(%d,%d %d)",temp->right->row,temp->right->col,temp->right->val); temp=temp->right; } printf("/n"); } } void Insert(Node *cp, Node *s) { //此插入函数的作用是:生成目标矩阵 Node *temp; temp=cp+s->row; //修改行链表指针 if( temp->right!=cp+s->row ) while( temp->right!=cp+s->row && temp->right->col<=s->col ) temp=temp->right; s->right=temp->right; temp->right=s; temp=cp+s->col; //修改列链表指针 if( temp->dowm!=cp+s->col ) while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row ) temp=temp->dowm; s->dowm=temp->dowm; temp->dowm=s; } void addition(Node *cp1, Node *cp2, Node *cp3) { int i; Node *w,*p,*q; for( i=1; i<=cp2->row && i<=cp3->row; i++) { p=cp2+i; q=cp3+i; while( p->right!=cp2+i && q->right!=cp3+i ) { w=(Node *)malloc( sizeof(Node) ); w->row=p->right->row; if( p->right->col==q->right->col ) { w->col=p->right->col; w->val=p->right->val+q->right->val; //相同位置上的元素值相加 p=p->right; q=q->right; if( w->val ) Insert(cp1,w); //把非零元插入到目标矩阵中 } else if( p->right->col<q->right->col ) { w->col=p->right->col; w->val=p->right->val; p=p->right; Insert(cp1,w); //把cp2中的非零元插入到目标矩阵中 } else { w->col=q->right->col; w->val=q->right->val; q=q->right; Insert(cp1,w); //把cp2中的非零元插入到目标矩阵中 } } if( p->right==cp2+i ) while( q->right!=cp3+i ) { w=(Node *)malloc( sizeof(Node) ); w->row=q->right->row; w->col=q->right->col; w->val=q->right->val; q=q->right; Insert(cp1,w); //把cp3中剩余的非零元插入目标矩阵中 } else if( q->right==cp3+i ) while( p->right!=cp2+i ) { w=(Node *)malloc( sizeof(Node) ); w->row=p->right->row; w->col=p->right->col; w->val=p->right->val; p=p->right; Insert(cp1,w); //把cp2中剩余的非零元插入到目标矩阵中 } else ; //两个矩阵同一行中同时结束 } if( i>cp2->row) while(i<=cp3->row) { //把cp3中剩余行中的非零元插入到目标矩阵中 q=cp3+i; while( q->right!=cp3+i ) { w=(Node *)malloc( sizeof(Node) ); w->row=q->right->row; w->col=q->right->col; w->val=q->right->val; q=q->right; Insert(cp1,w); } i++; //继续下一行 } else if(i>cp3->row) while( i<=cp2->row ) { p=cp2+i; while( p->right!=cp2+i ) { w=(Node *)malloc( sizeof(Node) ); w->row=p->right->row; w->col=p->right->col; w->val=p->right->val; p=p->right; Insert(cp1,w); } i++; //继续下一行 } } int main() { Node *cp1, *cp2, *cp3; int a, b; printf("输入稀疏矩阵cp2的行列数:"); scanf("%d%d",&a,&b); cp2=Init(a,b); printf("输入稀疏矩阵cp3的行列数:"); scanf("%d%d",&a,&b); cp3=Init(a,b); cp2->row>=cp3->row?a=cp2->row:a=cp3->row; cp2->col>=cp3->col?b=cp2->col:b=cp3->col; cp1=Init(a,b); //开始初始化结果矩阵 printf("/n创建稀疏矩阵cp2:/n"); CreatCrossList(cp2); printf("/n创建稀疏矩阵cp3:/n"); CreatCrossList(cp3); output(cp2); output(cp3); addition(cp1,cp2,cp3); printf("/n/n/n两矩阵相加后"); output(cp1); return 0; }