稀疏矩阵,不知道哪错了,运行到"请输入相加:1、相减:2、相乘:3、退出:4"就没有了。。求解答
#include <stdio.h>#include <stdlib.h>
#define MAXSIZE 12500
//三元组结构
typedef struct
{
int i,j; //矩阵行下标和列下标
int e; //值
}Triple;
//矩阵结构
typedef struct
{
Triple data[MAXSIZE];
int rops[MAXSIZE+1]; //存放各行第一个非零元在矩阵中的位置
int mu,nu,tu; //矩阵的行数、列数、非零元个数
}matrix;
void Init(matrix *M)
{
int i;
int u,v;
int p[8][8];
if(M->mu<1||M->nu<1||M->tu>M->mu*M->nu)
{
printf("出错\n");
}
for(u=1;u<=M->mu;u++)
for(v=1;v<=M->nu;v++)
p[u][v]=0;
for(i=1;i<=M->tu;i++)
{
printf("第%d个非零元的行号:",i);
scanf("%d",&M->data[i].i);
printf("\n");
printf("第%d个非零元得列号:",i);
scanf("%d",&M->data[i].j);
printf("\n");
printf("第个非零元的值:",i);
scanf("%d",&M->data[i].e);
p[M->data[i].i][M->data[i].j]=M->data[i].e;
}
printf("\n");
printf("您创建的矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
void Add(matrix *M,matrix *T,matrix *G)
{
G->mu=M->mu;
G->nu=M->nu;
G->tu=0;
int g,m,t;
int u,v;
int p[8][8];
g=m=t=1;
int sum;
for(u=1;u<=M->mu;u++)
for(v=1;v<=T->nu;v++)
p[u][v]=0;
if(M->mu!=T->mu||M->nu!=T->nu)
{
printf("维数不等\n");
}
while(m<=M->tu&&t<=T->tu)
{
if(M->data[m].i==T->data[t].i) //行下标相等时
{
if(M->data[m].j==T->data[t].j)
{
sum=M->data[m].e+T->data[t].e;
if(sum!=0)
{
G->data[g].i=M->data[m].i;
G->data[g].j=M->data[m].j;
p[G->data[g].i][G->data[g].j]=sum;
G->tu++;
g++;
m++;
t++;
}
else //矩阵相加为零时,不做存储操作
{
m++;
t++;
}
}
}
}
while(M->data[m].e!=0&&T->data[t].e==0) //插入M的剩余元素
{
G->data[g].i=M->data[m].i;
G->data[g].j=M->data[m].j;
p[G->data[g].i][G->data[g].j]=M->data[m].e;
G->tu++;
m++;
g++;
}
while(T->data[t].e!=0&&M->data[m].e==0) //插入T剩余的元素
{
G->data[g].i=T->data[t].i;
G->data[g].j=T->data[t].j;
p[G->data[g].i][G->data[g].j]=T->data[t].e;
G->tu++;
t++;
g++;
}
printf("\n");
printf("相加后矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
void Jian(matrix *M,matrix *T,matrix *G)
{
G->mu=M->mu;
G->nu=M->nu;
G->tu=0;
int sum;
int u,v;
int p[8][8];
int m,t,g;
m=t=g=1;
for(u=1;u<=M->mu;u++)
for(v=1;v<=T->nu;v++)
p[u][v]=0 ;
if(M->mu!=T->mu||M->nu!=T->nu)
{
printf("维数不等\n");
}
while(m<=M->tu&&t<=T->tu)
{
if(M->data[m].i==T->data[t].i) //行下标相等时
{
if(M->data[m].j==T->data[t].j)
{
sum=M->data[m].e-T->data[t].e;
if(sum!=0)
{
G->data[g].i=M->data[m].i;
G->data[g].j=M->data[m].j;
p[G->data[g].i][G->data[g].j]=sum;
G->tu++;
g++;
m++;
t++;
}
else //矩阵相减为零时,不做存储操作
{
m++;
t++;
}
}
}
}
while(M->data[m].e!=0&&T->data[t].e==0) //插入M的剩余元素
{
G->data[g].i=M->data[m].i;
G->data[g].j=M->data[m].j;
p[G->data[g].i][G->data[g].j]=M->data[m].e;
G->tu++;
m++;
g++;
}
while(T->data[t].e!=0&&M->data[m].e==0) //插入T剩余的元素
{
G->data[g].i=T->data[t].i;
G->data[g].j=T->data[t].j;
p[G->data[g].i][G->data[g].j]=-(T->data[t].e);
G->tu++;
t++;
g++;
}
printf("\n");
printf("相减后矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
void Cheng(matrix *M,matrix *T,matrix *G)
{
int k,w,q,x,mrow,trow,gcol;
int tmp[MAXSIZE]; //累加器
int num[MAXSIZE]; //记录矩阵的各行的第一个非零元的位置
int m,t,g;
m=t=g=1;
w=1;
int u,v;
int p[8][8];
for(u=1;u<=M->mu;u++)
for(v=1;v<=T->nu;v++)
p[u][v]=0 ;
if(M->nu!=T->mu)
{
printf("这个矩阵不能相乘\n");
}
G->mu=M->mu;
G->nu=T->nu;
G->tu=0;
if(M->tu*T->tu!=0)
{
for(mrow=1;mrow<M->mu;mrow++) //清零
{
num[mrow]=0;
}
for(w=1;w<=M->tu;w++) //M中的非零个数
{
k=M->data[w].i;
num[k]++;
}
M->rops[1]=1; //第一行第一个非零元的位置在data[]的第一位
for(mrow=2;mrow<=M->mu;mrow)
{
M->rops[mrow]=M->rops[mrow-1]+num[mrow-1];
}
printf("\n");
printf("矩阵M\n");
for(mrow=1;mrow<=M->mu;mrow++)
{
printf("第%d行的第一个非零元在data中的序号是(%d)\n",mrow,M->rops[mrow]);
}
//记录矩阵T中各行非零元的个数
for(trow=1;trow<T->mu;trow++) //清零
{
num[trow]=0;
}
for(w=1;w<=T->tu;w++) //T中的非零个数
{
k=T->data[w].i;
num[k]++;
}
T->rops[1]=1; //第一行第一个非零元的位置在data的第一位
for(trow=2;trow<=T->mu;trow++)
{
T->rops[trow]=T->rops[trow-1]+num[trow-1];
}
printf("\n");
printf("矩阵T\n");
for(trow=1;trow<=T->mu;trow++)
{
printf("第%d行的第一个非零元在data中的序号是(%d)\n",mrow,T->rops[mrow]);
}
for(mrow=1;mrow<=M->mu;mrow++)
{
for(k=1;k<=T->nu;k++) //当前行个元素累加器清零
{
tmp[k]=0;
}
G->rops[mrow]=G->tu+1;
for(w=M->rops[mrow];w<M->rops[mrow+1];w++) // 矩阵G各行的第一个非零元在data中的位置
{
trow=M->data[w].j;
if(trow<T->mu)
{
x=T->rops[trow+1];
}
else
x=T->tu+1;
for(q=T->rops[trow];q<x;q++)
{
gcol=T->data[q].j;
tmp[gcol]+=M->data[w].e*T->data[q].e; //对应非零元累加
}
}
for(gcol=1;gcol<=G->nu;gcol++) //压缩存储
{
if(tmp[gcol])
{
G->data[G->tu+1].i=mrow;
G->data[G->tu+1].j=gcol;
p[G->data[G->tu+1].i][G->data[G->tu+1].j]=tmp[gcol];
G->tu++;
}
}
}
}
printf("\n");
printf("相乘后矩阵如下:\n");
for(u=1;u<=M->mu;u++)
{for(v=1;v<=M->nu;v++)
{ printf("%d ",p[u][v]);}
printf("\n");
}
}
int main()
{
matrix *M=(matrix*)malloc(sizeof(matrix));
matrix *T=(matrix*)malloc(sizeof(matrix));
matrix *G=(matrix*)malloc(sizeof(matrix));
int tag=1;
int n;
printf("请输入第一个矩阵的行数和列数:");
scanf("%d%d",&(M->mu),(&M->nu));
printf("非零元的个数:");
scanf("%d",&(M->tu));
Init(M);
printf("\n");
printf("请输入第二个矩阵的行数列数:");
scanf("%d%d",&(T->mu),(&T->nu));
printf("非零元的个数:");
scanf("%d",&(T->tu));
Init(T);
printf("\n");
while(tag)
{
printf("请输入相加:1、相减:2、相乘:3、退出:4");
printf("\n");
scanf("%d",&n);
switch(n)
{
case 1:Add(M,T,G);break;
case 2:Jian(M,T,G);break;
case 3:Cheng(M,T,G);break;
case 4:tag=0;
}
}
return 0;
}