淘宝自动确认收货15天:请C语言高手帮忙编写两个稀疏矩阵相加的程序,急!!!

来源:百度文库 编辑:高校问答 时间:2024/04/29 03:45:45
要求:只输入非0元素,以带行逻辑压缩存储,两个矩阵相加,再以矩阵形式打印. 急!
书上没有关于相加的,只有乘法.
带行逻辑的相加比相乘麻烦多了.
要求:
1. 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。
2. 分别输入矩阵的非零元素
3. 实现两个矩阵相加的运算
4. 还原成矩阵形式打印出计算结果.
注意:是"带行逻辑连接信息",如果是一般的三元组顺序表我会做,但他要求带行标识,即标识出每行第一个非0元的位置
在相加和输入的过程中,都得用到行标识才行.

这个程序能实现矩阵的加减乘。
从中删除你不需要的部分你会吧。
#include<iostream.h>
#include<malloc.h>
#define TRUE 1
#define ERROR 0
#define OK 1
#define MAXISIZE 100
typedef int Elemtype ;
typedef int Status ;
struct Triple
{
int i,j; //行下标,列下标
Elemtype e; //非零元数的值
};
struct TSMatrix
{
Triple data[MAXISIZE+1];
int mu,nu,tu; //矩阵的行数,列数,非零元数
};
Status CreateSMatrix(TSMatrix &M)
{
int i,m,n;
Elemtype e;
Status k;
cout<<"输入矩阵的行数,列数,非零元数:\n";
cin>>M.mu>>M.nu>>M.tu;
M.data[0].i=0;
for(i=1;i<=M.tu;i++)
{
do
{
cout<<"输入第"<<i<<"个非零元素所在的行(1~"<<M.mu<<"),列(1~"<<M.nu<<"),元素值:\n";
cin>>m>>n>>e;
k=0;
if(m<1||m>M.mu||n<1||n>M.nu)
{ k=1;
cout<<"元素的行列数输入错误!\n";}
if(m<M.data[i-1].i||m==M.data[i-1].i&&n<=M.data[i-1].j)
k=1;
}while(k);
M.data[i].i=m;
M.data[i].j=n;
M.data[i].e=e;
}
return OK;
}
void DestroySMatrix(TSMatrix &M)
{
M.mu=0;
M.nu=0;
M.tu=0;
}

void PrintSMatrix(TSMatrix M)
{
int i;
cout<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元数\n";
cout<<"行 列 元素值\n";
for(i=1;i<=M.tu;i++)
cout<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
Status Cmp(int a,int b)
{ if(a<b) return 1;
else if(a==b) return 0;
else return -1;
}
Status AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe;
if(M.mu!=N.mu||M.nu!=N.nu)
return ERROR;
Q.mu=M.mu;
Q.nu=M.nu;
Mp=&M.data[1];
Np=&N.data[1];
Me=&M.data[M.tu];
Ne=&N.data[N.tu];
Qh=Qe=Q.data;
while(Mp<=Me&&Np<=Ne)
{ Qe++;
switch(Cmp(Mp->i,Np->i))
{
case 1: *Qe=*Mp;
Mp++;
break;
case 0: switch(Cmp(Mp->j,Np->j))
{
case 1: *Qe=*Mp;
Mp++;
break;
case 0: *Qe=*Mp;
Qe->e+=Np->e;
if(!Qe->e)
Qe--;
Mp++;
Np++;
break;
case -1: *Qe=*Np;
Np++;
}
break;
case -1: *Qe=*Np;
Np++;
}
}
if(Mp>Me)
while(Np<=Ne)
{
Qe++;
*Qe=*Np;
Np++;
}
if(Np>Ne)
while(Mp<=Me)
{
Qe++;
*Qe=*Mp;
Mp++;
}
Q.tu=Qe-Qh;
return OK;
}
Status SubSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,l;
for(i=1;i<=N.tu;i++)
N.data[i].e*=-1;
l=AddSMatrix(M,N,Q);
return l;
}
Status MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)
{
int i,j,h=M.mu,l=N.nu,Qn=0;
Elemtype *Qe;
if(M.nu!=N.mu)
return ERROR;
Q.mu=M.mu;
Q.nu=N.nu;
Qe=(Elemtype *)malloc(h*l*sizeof(Elemtype));
for(i=0;i<h*l;i++)
*(Qe+i)=0;
for(i=1;i<=M.tu;i++)
for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*l+N.data[j].j-1)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++)
for(j=1;j<=N.nu;j++)
if(*(Qe+(i-1)*l+j-1)!=0)
{
Qn++;
Q.data[Qn].e=*(Qe+(i-1)*l+j-1);
Q.data[Qn].i=i;
Q.data[Qn].j=j;
}
free(Qe);
Q.tu=Qn;

return OK;
}
void main()
{char a;
int h;
TSMatrix A,B,C;
cout<<"创建矩阵A:\n";
CreateSMatrix(A);
PrintSMatrix(A);
cout<<"创建矩阵B:\n";
CreateSMatrix(B);
PrintSMatrix(B);
cout<<"选择操作:\n"<<"A.两稀疏矩阵的和\n"<<"B.两稀疏矩阵的差\n"<<"C.两稀疏矩阵的积\n"<<"Q.退出\n";
cin>>a;
while(a!='Q')
{
switch(a)
{
case 'A':
h=AddSMatrix(A,B,C);
if(h==1)
{cout<<"两稀疏矩阵的和为:\n";
PrintSMatrix(C);
}
else cout<<"该两稀疏矩阵不能求和!\n";
break;
case 'B':
h=SubSMatrix(A,B,C);
if(h==1)
{ cout<<"两稀疏矩阵的差为:\n";
PrintSMatrix(C);
}
else cout<<"该两稀疏矩阵不能求差!\n";
break;
case 'C':
h=MultSMatrix(A,B,C);
if(h==1)
{cout<<"两稀疏矩阵的积为:\n";
PrintSMatrix(C);
}
else cout<<"两稀疏矩阵不能求积!\n";
break;
default: cout<<"输入错误!请重新输入\n";
}cin>>a;
}DestroySMatrix(A);
DestroySMatrix(B);
DestroySMatrix(C);
}

1. 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。
2. 分别输入矩阵的非零元素
3. 实现两个矩阵相加的运算
4. 还原成矩阵形式打印出计算结果.
注意:是"带行逻辑连接信息",如果是一般的三元组顺序表我会做,但他要求带行标识,即标识出每行第一个非0元的位置
在相加和输入的过程中,都得用到行标识才行.

满意答案的like其实是clear,还有在输入行列和值的时候要用逗号隔开,不然会出现死循环

数据结构教材上有伪代码的吧