资源描述:
《矩阵相加(十字链表)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、矩阵相加(十字链表)/*Note:YourchoiceisCIDE*/#include"stdio.h"#include"stdlib.h"#defineLEN(OLink*)malloc((M->mu+1)*sizeof(OLink))#defineLDN(OLink*)malloc((M->nu+1)*sizeof(OLink))#defineLRN(structOLNode*)malloc(sizeof(structOLNode))typedefstructOLNode{inti,j,e;//非0元的行数、列数、值str
2、uctOLNode*right,*down;//非0元所在的行表、列表的后继链域}*OLink;typedefstruct{OLink*rhead,*chead;//行表、列表的向量基址intmu,nu,tu;//稀疏矩阵的行数、列数、非0元个数}CrossList;voidCreateSMatrix_OL(CrossList*M)//创建稀疏矩阵(用十字链表表示){OLinkp,q;intm,n,k;q=LRN;if(!q)printf("内存分配失败!");printf("请输入矩阵的行数,列数,非零元个数:(用空格隔
3、开,按回车结束,下同)");scanf("%d%d%d",&M->mu,&M->nu,&M->tu);M->rhead=LEN;M->chead=LDN;if((!M->rhead)
4、
5、(!M->chead))printf("内存分配失败!");for(m=1;m<=M->mu;++m)M->rhead[m]=NULL;//初始化行列头指针向量for(n=1;n<=M->nu;++n)M->chead[n]=NULL;//各行列链表为空链表for(k=1;k<=M->tu;++k){p=LRN;if(!p)printf
6、("内存分配失败!");printf("请输入第%d个非0元素的行数,列数,值:",k);//可任意次序输入非0元scanf("%d%d%d",&p->i,&p->j,&p->e);if((M->rhead[p->i]==NULL)
7、
8、(M->rhead[p->i]->j>p->j)){p->right=M->rhead[p->i];M->rhead[p->i]=p;}else//查询在行表中的插入位置{for(q=M->rhead[p->i];(q->right!=NULL)&&(q->right->jj);q=
9、q->right);p->right=q->right;q->right=p;//完成行插入}if((M->chead[p->j]==NULL)
10、
11、(M->chead[p->j]->i>p->i)){p->down=M->chead[p->j];M->chead[p->j]=p;}else//查询在列表中的插入位置{for(q=M->chead[p->j];(q->down!=NULL)&&(q->down->ii);q=q->down);p->down=q->down;q->down=p;//完成列插入}}}void
12、Print_List(CrossListM)//输出十字链表所表示的稀疏矩阵{inti,k,n;OLinkp;for(p=M.rhead[1],i=1;i<=M.mu;++i,p=M.rhead[i]){for(k=1;k<=M.nu;++k){if(p!=NULL){if(k==p->j){n=p->e;p=p->right;}elsen=0;}elsen=0;printf("%6d",n);}printf("");}}CrossList*AddCrossList(CrossList*A,CrossListB)//实现矩
13、阵相加{intj,i;OLinkpa,pb,pre,p,q,*hl;pa=A->rhead[1];pb=B.rhead[1];pre=NULL;//令pa和pb指向A和B的第一行的第一个非0元素的结点hl=(OLink*)malloc((A->nu+1)*sizeof(OLink));if(!hl)printf("内存分配失败!");for(j=1;j<=A->nu;++j)hl[j]=A->chead[j];//hl初始化for(i=1;i<=A->mu;++i,pa=A->rhead[i],pb=B.rhead[i],
14、pre=NULL)//pa和pb指向每一行的第一个非0元结点,直至最后一行{while(pb!=NULL)//处理B的一行,直至本行中无非0元素的结点{if((pa==NULL)
15、
16、(pa->j>pb->j))//在A中插入一个pb所指结点的复制接点{p=LRN;if(!p)