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

问题描述

求各位大神帮我看看这个稀疏矩阵应用的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%3dn",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");
} }

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

解决方案

 点击发表框工具栏上面的代码片图标,把代码放到代码片里,否则粘贴过来,容易出现错误,格式也很乱。
象这句话这样的格式就对了。

时间: 2024-09-10 08:36:20

c++-求各位大神帮我看看这个稀疏矩阵应用的C++代码的相关文章

测试-贪吃蛇语法有问题 求各位大神帮帮忙

问题描述 贪吃蛇语法有问题 求各位大神帮帮忙 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #include<time.h> const char Shead = '@';//蛇头 const char Sbody = '#';//蛇身 const char Sfood = '*';//食物 const char Snode = '.';//地图

求大神帮我解释一下liquid语言的jekyll代码

问题描述 求大神帮我解释一下liquid语言的jekyll代码 <div class="well"> <h4>Recent posts</h4> <ul class="posts" span="recent"> {% for post in site.posts limit:5 %} <li> <span>{{ post.date | date_to_string }}<

exception-java基础问题,求各位大神帮回答!

问题描述 java基础问题,求各位大神帮回答! 我程序运行返回错误是Exception in thread "main" java.lang.ClassCastException: Item cannot be cast to java.lang.Comparable. 求大神告知解决办法.... public class LinkListTest { public static void main(String[] args) { SortedSet oo = new TreeSet

asp.net-跪求各位大神帮我看看哪错了吧

问题描述 跪求各位大神帮我看看哪错了吧 基于asp.net开发的,数据库是sql server2005.无法将信息添加到数据库中. 添加按钮click事件代码如下: protected void Button1_Click(object sender, EventArgs e) { string sql; sql = "insert into shipinxinxi(mingcheng,leibie,danjia) values('"+mingcheng.Text.ToString()

database-自学数据库我碰到的这种问题?不知道从何下手?求各位大神帮帮忙!

问题描述 自学数据库我碰到的这种问题?不知道从何下手?求各位大神帮帮忙! 1.设一个关系为R(A,B,C,D,E),它的最小函数依赖集为FD={A→B, C→D,(A,C) →E}则该关系的候选码是什么?该关系属于第几范式?为什么? 2.设一个关系为R(A,B,C,D,E),它的最小函数依赖集为FD={A→B, A→C,A→D,D →E}则该关系的候选码是什么?该关系属于第几范式?为什么?若要规范化为高一级范式,则将得到哪些关系?

求java大神帮看解答一下报错,在线等

问题描述 求java大神帮看解答一下报错,在线等 16:29:21,442 ERROR ContextLoader:215 - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userServiceImpl': Injection of resource fields failed; nested except

求各位大神 帮帮忙 assembly.CreateInstance()

问题描述 求各位大神 帮帮忙 assembly.CreateInstance() Assembly assembly = Assembly.GetExecutingAssembly(); var form = assembly.CreateInstance("HumanResources.成本报表.发货成本明细") as Form; form.MdiParent = ComClass.MainForm; form.Show(); 报调用目标发生了异常 求各位大神帮帮忙 解决方案 Hum

求php大神帮我解答 小弟快哭了

问题描述 求php大神帮我解答 小弟快哭了 这是老师布置的一个在线答题系统 我写的这个是其中的添加题库部分 可是 我最后的那个确认按钮 点击以后 并不会跳转到数据库语句 他总是返回上一步 也就是我没法将写好的题目内容保存进入数据库 我为此困扰了一周了 恳请各位大哥大姐帮帮我 小弟拜谢 解决方案 贴代码.. 图片完全没法看

求正则表达式大神帮我处理下面的问题!谢谢了

问题描述 求正则表达式大神帮我处理下面的问题!谢谢了 {"EmpBar":"上海","EmpAdd":"长宁","Table1":[{"_row":1,"EmpCode":"EF0001","ConName":"张三","Table2":[{"_row":1,"