qq_28677089 2016-01-13 00:44 采纳率: 0%
浏览 1825

求各位大神帮我看看这个稀疏矩阵应用的C++代码

#include

#include

#include

#define MAXSIZE 100 int num[100];

typedef struct OLNode{
int i,j;
int e;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct {

int mu,nu,tu;
OLink *rhead,*chead;
}CrossList;

int CreateSMatix_OL(CrossList &M){ int i,j,e;
OLink q;
OLink p;
printf("请输入稀疏矩阵的行数,列数,非零元素的个数:\n");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLNode));
M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLNode));
for( i=1;
i<=M.mu;
i++)M.rhead[i]=NULL;
for( i=1;
i<=M.nu;
i++)M.chead[i]=NULL;
printf("请输入元素的行 列 值。最后输入0 0 0为结束\n");
scanf("%d%d%d",&i,&j,&e);
while(i!=0){ p=(OLink)malloc(sizeof(OLNode));
p->i=i;
p->j=j;
p->e=e;
if(M.rhead[i]==NULL||M.rhead[i]->j>j){p->right=M.rhead[i];
M.rhead[i]=p;
} else{ q=M.rhead[i];
while(q->right&&q->right->jright;
p->right=q->right;
q->right=p;
} if(M.chead[j]==NULL||M.chead[j]->i>i){p->down=M.chead[j];
M.chead[j]=p;
}

else{ q=M.chead[j];
while(q->down&&q->down->idown;
p->down=q->down;
q->down=p;
}

scanf("%d%d%d",&i,&j,&e);
}

return 1;
}//创建十字链表

int Compare(int a1,int b1,int a2,int b2){ if(a1>a2)return 1;
else if(a1 else if(b1>b2)return 1;
if(b1 else return 0;
}
int SMatrix_ADD(CrossList *A,CrossList *B){ OLNode *pa,*pb,*pre,*p,*cp[100];
int i,j,t;
t=A->tu+B->tu;
for(j=1;
j<=A->nu;
j++)cp[j]=A->chead[j];
for(i=1;
i<=A->mu;
i++){ pa=A->rhead[i];
pb=B->rhead[i];
pre=NULL;
while(pb)
{

if(pa==NULL||pa->j>pb->j)
{ p=(OLink)malloc(sizeof(OLNode));
if(!pre)A->rhead[i]=p;
else pre->right=p;
p->right=pa;
pre=p;
p->i=i;
p->j=pb->j;
p->e=pb->e;
if(!A->chead[p->j]){ A->chead[p->j]=cp[p->j]=p;
p->down=NULL;
}

else{ cp[p->j]->down=p;
cp[p->j]=p;
}

pb=pb->right;
}

else if(pa->jj){pre=pa;
pa=pa->right;
} else if(pa->e+pb->e)
{ t--;
pa->e+=pb->e;
pre=pa;
pa=pa->right;
pb=pb->right;
} else { t=t-2;
if(!pre)A->rhead[i]=pa->right;
else pre->right=pa->right;
p=pa;
pa=pa->right;
if(A->chead[p->j]==p)A->chead[p->j]=cp[p->j]=p->down;
else cp[p->j]->down=p->down;
free(p);
pb=pb->right;
}

}

}

A->mu=A->mu>B->mu?A->mu:B->mu;
A->nu=A->nu>B->nu?A->nu:B->nu;
return 1;
} //十字链表相加

int ShowMAtrix(CrossList *A){ int col;
OLink p;
for(col=1;col<=A->mu;col++)
if(A->rhead[col]){p=A->rhead[col];
while(p){printf("%3d%3d%3d\n",p->i,p->j,p->e);
p=p->right;
} }

return 1;
} //十字链表显示

int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q) { int i, j, e;
//中间变量

OLink p0, q0, p, pl, pla;
//中间变量

//检查稀疏矩阵M的列数和N的行数是否对应相等

if(M.nu != N.mu) { printf ( "稀疏矩阵A的列数和B的行数不相等,不能相乘。\n" );
return 0;
}

Q.mu = M.mu, Q.nu = N.nu, Q.tu = 0;

if(!(Q.rhead = (OLink *)malloc((Q.mu + 1) * sizeof(OLink)))) exit(-2);
if(!(Q.chead = (OLink *)malloc((Q.nu + 1) * sizeof(OLink)))) exit(-2);

for(i = 1;
i <= Q.mu;
i++) Q.rhead[i] = NULL;

for(i = 1;
i <= Q.nu;
i++) Q.chead[i] = NULL;
//稀疏矩阵相乘

for(i =1;
i <= Q.mu;
i++) for(j = 1;
j <= Q.nu;
j++) {

p0 = M.rhead[i], q0 = N.chead[j], e = 0;
while(p0&&q0) { if( p0->j > q0->i) q0 = q0->down;
//M的列大于N的行,则N的列指针后移

if(p0->j < q0->i) p0 = p0->right;
//M的列小于N的行,则M的行指针右移

else { e += p0->e * q0->e;
q0 = q0->down, p0 = p0->right;
//移动指针 } }

if(e)//乘积不为0

{ if(!(p = (OLink)malloc(sizeof(OLNode)))) exit(-2);
Q.tu++;
//非零元素增加

p->i = i, p->j = j, p->e = e, p->right = NULL, p->down = NULL;
//赋值,指针后移 //将p插入十字链表 //行插入

if(Q.rhead[i] == NULL) //若p为该行的第1个结点

Q.rhead[i] = pl = p;
//p插在该行的表头且pl指向p(该行的最后一个结点)

else pl->right = p, pl = p;
//插在pl所指结点之后,pl右移

//列插入
if(Q.chead[j] == NULL) //若p为该列的第一个点

Q.chead[j] = p;
//该列的表头指向p

else {

pla = Q.chead[j];
//pla指向j行的第1个结点

while(pla->down) pla = pla->down;
//pla指向j行最后一个结点

pla->down = p;
} } }

return 1;
} }}//十字链表相乘

void TurnSMatrix_OL(CrossList &M)
{ int col,row;
OLink p,q;
for(col=1;
col<=M.mu;
col++) { q=p=M.rhead[col];

while(q){ row=p->i;
p->i=p->j;
p->j=row;
q=p->right;
p->right=p->down;
p->down=q;
} }

}//十字链表转置

int DestroySMatrix_OL(CrossList &M) { int i;
//中间变量

OLink p, q;
//中间变量

if(!M.rhead || !M.chead) return 1;
//M不存在

else {//M存在 if(M.chead)//所有列链表头指针置为空

for(i = 1;
i <= M.nu;
i++)
M.chead[i] = NULL;
if(M.rhead)//按行释放节点

for(i = 1;
i <= M.mu;
i++) { p = M.rhead[i];
while(p) { q = p, p = p->right;
free(q);
}

}

//释放行和列链表头指针指向基址

free(M.rhead);
free(M.chead);
//返回

return 1;
}

}//十字链表销毁

int main(){ int n,i;
//TSMatrix M,T,S;

CrossList MM,TT,SS;

printf("请你选择操作:\n1:创建稀疏矩阵。\n2:退出\n(1|2):");
scanf("%d",&n);
switch(n){ case 1:{CreateSMatix_OL(MM); ShowMAtrix(&MM);

printf("已经选择创建稀疏矩阵,请选择操作\n 1:稀疏矩阵转置\n 2:稀疏矩阵相加\n 3:稀疏矩阵相乘\n 4:退出\n(1|2|3|4):");
scanf("%d",&i);
switch(i){

case 1: TurnSMatrix_OL(MM);
ShowMAtrix(&MM);
break;

case 2: printf("请你输入另一个稀疏矩阵:");
CreateSMatix_OL(TT);
SMatrix_ADD(&MM,&TT);
ShowMAtrix(&MM);
break;

case 3:printf("请你输入另一个稀疏矩阵:");
CreateSMatix_OL(TT);
MultSMatrix_OL(MM,TT,SS);
ShowMAtrix(&SS);
break;
case 4:exit(0);

}};
break;
case 2:exit(0);

default :printf("erorr");
} }

编译没问题 但就是输出不了。有可能是十字链表显示那段代码出错

  • 写回答

1条回答 默认 最新

  • ysuwood 2016-01-13 06:54
    关注
     点击发表框工具栏上面的代码片图标,把代码放到代码片里,否则粘贴过来,容易出现错误,格式也很乱。
    象这句话这样的格式就对了。
    
    
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮