稀疏矩阵相加(十字链表实现)
2010-12-19 13:40
549 查看
//十字链表作为存储结构,存储表示随机稀疏矩阵,进行两矩阵的相加运算 #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; }
相关文章推荐
- 数据结构之---C/C++实现稀疏矩阵的十字链表
- 利用稀疏矩阵的“三元组表”存储结构,实现两个矩阵的相加。
- 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
- 稀疏矩阵(十字链表存储)6种操作的实现
- 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)
- 11.十字链表 实现 稀疏矩阵 及 矩阵相加
- 稀疏矩阵的十字链表实现:行列链表
- 源代码——十字链表实现稀疏矩阵
- 三元组十字链表下稀疏矩阵的加、转、乘实现
- C++实现稀疏矩阵的十字链表表示法
- 第九周 项目3 稀疏矩阵的三元组表示的实现及应用(矩阵相加)
- 稀疏矩阵的三元组表示的实现及应用(矩阵相加)
- 稀疏矩阵的三元组表示的实现及应用(2)——采用三元组存储稀疏矩阵,设计两个稀疏矩阵相加的运算算法
- 第九周项目3--稀疏矩阵的三元组表示的实现及应用--(2)两个稀疏矩阵相加的运算
- 稀疏矩阵相加(十字链表存储)
- 稀疏矩阵的加法(用十字链表实现A=A+B)
- 稀疏矩阵的加法(用十字链表实现A=A+B)
- 第9周 项目3 - 稀疏矩阵的三元组表示的实现及应用
- 第九周项目3-稀疏矩阵三元组表示的实现及应用(1)
- 【数据结构与算法】数组应用3:稀疏矩阵压缩(Java实现)