今天下午也就那出来想了想,写了写
#include<stdio.h>
#define MAX 100
struct Triple{
int i,j;
int e;
};
struct TSMatrix{
Triple date[MAX+1];//非零三元组表,date[0]不用
int mu,nu,tu;//矩阵的行数,列数和非零圆个数
};
/*创建稀疏矩阵*/
int CreatSMatrix(TSMatrix &M)
{
int i;
Triple T;
int flag=0;
printf("please input the TSMatrix's line low and amount\n");
scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
if(M.tu>MAX)//如果非零圆太多,退出
return 0;
M.date[0].i=0;
for(i=0;i<M.tu;i++)
{
do
{
printf("请按行输入第%d个非零元素在的行,列,元素值\n");
scanf("%d %d %d ",&T.i,&T.j,&T.e);
if(T.i<1||T.i>M.mu||T.j<1||T.j>M.nu)
flag=1;
}while(flag);//输入值范围不对重新输入
M.date[i]=T;
}
return 0;
}
/*比较函数*/
int comp(int a,int b)
{
if(a<b)
return -1;
if(a==b)
return 1;
}
/*稀疏矩阵加法运算函数*/
int AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q)//M+N=Q
{
int m=1,n=1,q=0;//m,n,q 是矩阵元素个数
if(M.mu!=N.mu||M.nu!=N.nu)//如果行列不相等
return 0;
Q.mu=M.mu;
Q.nu=M.nu; //设置Q的行数和列数
while(m<=M.tu&&n<=N.tu)//当两个矩阵的元素都没有处理完的时候
{ switch (comp(M.date[m].i,N.date[n].i))//比较两行当前元素的行值关系
{
case -1:Q.date[++q]=M.date[m++];//矩阵M的行值小,将M的值赋给Q
break;
case 0:switch(comp(M.date[m].j,N.date[n].j))//,行值相等。继续比较当前元素的列值关系
{
case -1:Q.date[++q]=M.date[m++]; //矩阵M的列值较小,将M赋给Q
break;
case 0:Q.date[++q]=M.date[m++];//MN矩阵当前非零元的行列军相等,将其想加赋给Q
Q.date[q].e+=N.date[n++].e;//想加M+N
if(Q.date[q].e==0)//两元素之和为0,不存入稀疏矩阵
{
q--;
}
case 1:Q.date[++q]=N.date[n++];//矩阵N的列值小,将N的值赋给矩阵Q
}
break;
case 1:Q.date[++q]=N.date[n++];//矩阵N的行值小,将N的行值赋给矩阵Q
}//以下循环最多执行一个,,,
while(m<=N.tu)//矩阵N的元素已经全部处理完毕,开始处理N的元素
Q.date[++q]=M.date[m++];
while(n<=N.tu)//矩阵M的元素已经全部处理完毕,开始处理M的元素
Q.date[++q]=N.date[n++];
if(q>MAX)//非零元太多
return -1;
else
Q.tu=q; //矩阵Q的非零元个数
return 0;
}
}
/*输出函数*/
void ShowSMatrix(TSMatrix M)
{
int i,j,k=1;//非零元的计数器k
Triple *p=M.date+1;// 创建一个指向M第一个元素的指针
for(i=1;i<M.mu;i++)
for(j=1;j<M.nu;j++)//循环
{
if(k<M.tu&&p->i==i&&p->j==j)//如果p指向的非零元为当前循环所在处理的非零元
{
printf("%5d",(p++)->e);//输出
k++;//计数器+1
}
else
printf("%5d",0);//p指向的元素不是当前循环在处理的元素,输出0
printf("\n");
}
}
int main()
{
TSMatrix A,B,C;
printf("创建A矩阵\n");
CreatSMatrix(A);
printf("创建B矩阵\n");
CreatSMatrix(B);
AddSMatrix(A,B,C);
ShowSMatrix(C);
return 0;
}
有不对的地方还请大家指教