宜~煲剧~
[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
// 稀疏矩阵的十字链表存储与输出。 #include <stdio.h> #include <stdlib.h> #define MaxRow 10 #define MaxCol 10 typedef int Etype; typedef struct OLnode { int i,j; /* 行号、列号域 */ Etype e; /* 数据域 */ struct OLnode *right,*down; /* 行向的、列向的指针域 */ } OLnode; /* 数据元素结点类型 */ typedef struct { OLnode *rh[MaxRow],*ch[MaxCol]; int mu,nu,tu; }Crosslist; /* 十字链表行、列表头 */ /* 函数声明 */ void creatMatrix(Crosslist *M); void out_M(Crosslist M); void TransMatrix(Crosslist *a , Crosslist *b); Crosslist ma,mb,mc; int z; /* 主函数 */ int main(){ creatMatrix(&ma); printf("\n 【创建的十字链接矩阵如下】\n"); out_M(ma); TransMatrix(&ma , &mb); out_M(mb); TransMatrix(&mb,&mc); out_M(mc); return 0; } /* main */ /* 十字链表的输出 */ void out_M(Crosslist M) { int i; OLnode *p; //char ch; /* 输出矩阵的总行数、总列数、非零元素总个数 */ printf("\n矩阵行数m=%d 列数n=%d 非0元素个数t=%d \n",M.mu,M.nu,M.tu); for(i=1; i<=M.mu; i++) { p=M.rh[i]; /* 指向第i行 */ printf(" i=%d",i); if(p){ while(p){ printf(" (%3d%3d%4d) ",p->i,p->j,p->e); p=p->right; } } printf("\n"); } } /* 创建十字链表 */ void creatMatrix(Crosslist *M) { int m,n,t,row,col,i,j; Etype va; OLnode *p,*q,*s; /* 输入矩阵的总行数、总列数、非零元素总个数 */ printf("\n 矩阵行数m,列数n,非零元素个数t(逗号隔开)=?"); scanf("%d,%d,%d",&m,&n,&t); for(i=1; i<=m;i++) M->rh[i]=NULL; for(j=1; j<=n;j++) M->ch[j]=NULL; M->mu=m; M->nu=n; M->tu=t; /* 建立成空十字链表 */ /* 以下为非零元素的逐一输入和插入 */ for(i=1;i<=M->tu;i++) { printf(" (0行列放弃,下标从1开始) 行号i,列号j,值e(逗号隔开)=?"); scanf("%d,%d,%d",&row,&col,&va); p=(OLnode *)malloc(sizeof(OLnode)); p->i=row; p->j=col; p->e=va; /* 在第row行上链接 */ q=M->rh[row]; s=q; while(q!=NULL && q->j < col) { s=q; q=q->right; } p->right=q; if(q==M->rh[row]) M->rh[row]=p; else s->right=p; /* 在第col列上链接 */ q=M->ch[col]; while(q && q->i < row) { s=q; q=q->down; } p->down=q; if(q==M->ch[col]) M->ch[col]=p; else s->down=p; } /* for */ }/* creatMatrix */ void TransMatrix(Crosslist *a , Crosslist *b) { size_t i=0; OLnode* p=NULL; OLnode* q=NULL; OLnode* next=NULL; OLnode* row[MaxRow]; b->mu=a->nu; b->nu=a->mu; b->tu=a->tu; for (i=1;i<=b->mu;++i) { b->ch[i]=NULL; row[i]=NULL; } for (i=0;i<=b->nu;++i) b->rh[i]=NULL; for (i=1;i<=a->mu;++i) { if ((q=a->rh[i])==NULL) continue; next=b->ch[i]; while (q!=NULL) { int pMark=0; p=(OLnode* )malloc(sizeof(OLnode)); if (p==NULL) exit(0); p->i=q->j; p->j=q->i; p->e=q->e; p->right=NULL; if (next!=NULL) next->down=p; else b->ch[i]=p; pMark=p->i; if (row[pMark]!=NULL) row[pMark]->right=p; else b->rh[pMark]=p; next=p; row[pMark]=p; p=p->down; q=q->right; } next->down=NULL; } }
[此贴子已经被作者于2017-11-22 22:49编辑过]