宜~拒绝~

[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编辑过]
