稀疏矩阵十字链表(C语言)

发布时间:2016-12-11 19:56:14 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"稀疏矩阵十字链表(C语言)",主要涉及到稀疏矩阵十字链表(C语言)方面的内容,对于稀疏矩阵十字链表(C语言)感兴趣的同学可以参考一下。

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int ElemType; typedef struct OLNode { int i,j; ElemType e; struct OLNode *right,*down; }OLNode,*OLink; typedef struct { OLink *rhead,*chead; int mu,nu,tu; }CrossList; Status CreateSMatrix_OL(CrossList &M) { int x,y,z,k; printf("行数,列数,非零元个数(用逗号隔开):\n"); scanf("%d,%d,%d",&M.mu,&M.nu,&M.tu); if(!(M.rhead=(OLink*)malloc((M.mu+1)*sizeof(OLNode)))) exit(ERROR); if(!(M.chead=(OLink*)malloc((M.mu+1)*sizeof(OLNode)))) exit(ERROR); for(x=0;x<=M.mu;x++) M.rhead[x]=NULL; for(x=0;x<=M.nu;x++) M.chead[x]=NULL; printf("输入非零元素的位置和值(用逗号隔开):\n"); for(k=1;k<=M.tu;k++) { scanf("%d,%d,%d",&x,&y,&z); OLink p,q; if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(ERROR); p->i=x; p->j=y; p->e=z; if(M.rhead[x]==NULL||M.rhead[x]->j>y) { p->right=M.rhead[x]; M.rhead[x]=p; } else { for(q=M.rhead[x];(q->right)&&(q->right->j<y);q=q->right); p->right=q->right; q->right=p; } if(M.chead[y]==NULL||M.chead[y]->i>x) { p->down=M.chead[y]; M.chead[y]=p; } else { for(q=M.chead[y];(q->down)&&(q->down->i<x);q=q->down); p->down=q->down; q->down=p; } } return OK; } Status PrintSMatrix_OL(CrossList &M) { int k,m; OLink p; for(k=1;k<=M.mu;k++) { p=M.rhead[k]; for(m=1;m<=M.nu;m++) { if((p)&&(m==p->j)) { printf("%-4d",p->e); p=p->right; } else printf("%-4d",0); } printf("\n"); } return OK; } Status AddSMatrix_OL(CrossList &M,CrossList &N) { int k,m; OLink p,pa,pb,pre,hl[30]; for(k=1;k<=M.nu;k++) hl[k]=M.chead[k]; for(m=1;m<=M.mu;m++) { pa=M.rhead[m]; pb=N.rhead[m]; pre=NULL; while(pb) { if(!(p=(OLink)malloc(sizeof(OLNode)))) exit(ERROR); p->e=pb->e; p->i=pb->i; p->j=pb->j; if(pa==NULL||pa->j>pb->j) { if(pre==NULL) M.rhead[p->i]=p; else pre->right=p; if(pa) { p->right=pa; pre=p; } else p->right=NULL; if(M.chead[p->j]==NULL) { M.chead[p->j]=p; p->down=NULL; } else { p->down=hl[p->j]->down; hl[p->j]->down=p; } hl[p->j]=p; pb=pb->right; } else if(pa!=NULL&&pa->j<pb->j) { pre=pa; pa=pa->right; } else if(pa->j==pb->j) { pa->e+=pb->e; if(!(pa->e)) { if(pre==NULL) M.rhead[pa->i]=pa->right; else pre->right=pa->right; p=pa; pa=pa->right; if(M.chead[p->j]==p) M.chead[p->j]=hl[p->j]=p->down; else hl[p->j]->down=p->down; free(p); pb=pb->right; } else { pa=pa->right; pb=pb->right; } } } } return OK; } int main() { CrossList M,N; CreateSMatrix_OL(M); printf("输出矩阵M:\n"); PrintSMatrix_OL(M); printf("\n"); CreateSMatrix_OL(N); printf("输出矩阵N:\n"); PrintSMatrix_OL(N); printf("\n"); AddSMatrix_OL(M,N); printf("输出矩阵M+N:\n"); PrintSMatrix_OL(M); printf("\n"); system("pause"); return OK; }

上一篇:ATM银行系统
下一篇:多套日历的编码怎么设计数据表?

相关文章

相关评论