数组实验代码
#include <stdio.h>
#include <iostream>
#define ERROR -1
#define MAXSIZE 12500 //非零元个数最大值MAXSIZE
#define MAXRC 21 //各行第一个非零元位置最大值MAXRC
#define OK 1
typedef int ElemType;
typedef struct
{
int i,j;
ElemType e;
} Triple;
typedef struct
{
Triple data[MAXSIZE+1]; //非零元三元组表
int rpos[MAXRC+1]; //各行第一个非零元的位置表
int mu,nu,tu; //矩阵的行数、列数和非零元个数
} RLSMatrix;
//创建
void CreatSMatrix(RLSMatrix &M) //建立以“带行链接信息”的三元组顺序表示的稀疏矩阵
{
for(int i=1; i<=MAXRC+1; i++)
M.rpos[i]=0; //令所有的位置都为0
printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):");
scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
for(int i=1; i<=M.tu; i++)
{
printf("请用三元组形式输入矩阵的元素(行 列 非零元素):");
scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
for(int i=1,j=1; i<=M.mu; i++) //求M.rpos[i]
{
M.rpos[i]=j;
while(M.data[j].i==i && j<=M.tu) j++; //若某一行的元素多于1个时
}
}
//相加
bool AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q) //矩阵相加
{
if(M.mu!=N.mu||M.nu!=N.nu)return ERROR;
int i,j,k=1;
Q.mu=M.mu;
Q.nu=M.nu;
for(i=1,j=1; i<=M.tu&&j<=N.tu;)
{
//按行优先,故分以下几种情况
if(M.data[i].i==N.data[j].i) //两元素同一行
{
if(M.data[i].j==N.data[j].j) //两元素同一行且同一列(同位置)
{
Q.data[k].i=M.data[i].i;
Q.data[k].j=M.data[i].j;
Q.data[k].e=M.data[i].e+N.data[j].e;
i++;
j++;
k++;
}
else if(M.data[i].j<N.data[j].j) //两元素同一行,但M中的元素列数较小
{
Q.data[k].i=M.data[i].i;
Q.data[k].j=M.data[i].j;
Q.data[k].e=M.data[i].e;
k++;
i++;
}
else if(M.data[i].j>N.data[j].j) //两元素同一行,但M中的元素列数较大
{
Q.data[k].i=N.data[j].i;
Q.data[k].j=N.data[j].j;
Q.data[k].e=N.data[j].e;
k++;
j++;
}
}
else if(M.data[i].i<N.data[j].i) //M中的元素行数较小
{
Q.data[k].i=M.data[i].i;
Q.data[k].j=M.data[i].j;
Q.data[k].e=M.data[i].e;
k++;
i++;
}
else if(M.data[i].i>N.data[j].i) //M中的元素行数较大
{
Q.data[k].i=N.data[j].i;
Q.data[k].j=N.data[j].j;
Q.data[k].e=N.data[j].e;
k++;
j++;
}
}
if(i!=M.tu+1) //计算最后的元素
for(; i<=M.tu; i++)
{
Q.data[k].i=M.data[i].i;
Q.data[k].j=M.data[i].j;
Q.data[k].e=M.data[i].e;
k++;
}
if(j!=N.tu+1)
for(; j<=N.tu; j++)
{
Q.data[k].i=N.data[j].i;
Q.data[k].j=N.data[j].j;
Q.data[k].e=N.data[j].e;
k++;
}
for(i=1,j=1; i<=Q.mu; i++) //求Q.rpos[i]
{
Q.rpos[i]=j;
while(Q.data[j].i==i && j<=Q.tu) //若某一行的元素多于1个时
j++;
}
return OK;
}
//相减
void SubtSMatrix(RLSMatrix M,RLSMatrix &N,RLSMatrix &Q)
{
int i=1;
for(; i<=N.tu; i++)
{
N.data[i].e=-N.data[i].e;
}
AddSMatrix(M,N,Q);
}
//输出
void PrintSMatrix(RLSMatrix M)
{
int k,l,n;
for(k=1,n=1; k<=M.mu; k++)
{
for(l=1; l<=M.nu; l++)
{
if(M.data[n].i==k && M.data[n].j==l)
{
printf("%5d",M.data[n].e);
n++;
}
else
printf("%5d",0);
}
printf("\n");
}
printf("\n");
}
//销毁
int Destory_SMatrix(RLSMatrix &M)
{
M.mu=M.nu=M.tu=0;
return 1;
}
//------------------主函数------------------
int main()
{
RLSMatrix A,B,C;
int flag;
while(1)
{
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf(" 稀疏矩阵的加、减、乘 \n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf(" 1、稀疏矩阵的加法 \n");
printf(" 2、稀疏矩阵的减法 \n");
printf(" 3、退出程序 \n");
printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
printf("注意:稀疏矩阵的行列不能超过20!!!\n");
printf("输入要进行的运算功能的编号:");
scanf("%d",&flag);
if(flag==3)
{
printf(" \n程序已退出!!! \n");
exit(0);
}
switch(flag)
{
case 1: //加法
CreatSMatrix(A);
printf("矩阵A=\n");
PrintSMatrix(A);
CreatSMatrix(B);
printf("矩阵B=\n");
PrintSMatrix(B);
if(A.mu==B.mu && A.nu==B.nu)
{
printf("A+B=\n");
AddSMatrix(A,B,C);
PrintSMatrix(C);
}
else
printf("错误!两矩阵的行列数不一致\n");
break;
case 2://减法
CreatSMatrix(A);
printf("矩阵A=\n");
PrintSMatrix(A);
CreatSMatrix(B);;
printf("矩阵B=\n");
PrintSMatrix(B);
if(A.mu==B.mu && A.nu==B.nu)
{
printf("A-B=\n");
SubtSMatrix(A,B,C);
PrintSMatrix(C);
}
else
printf("错误!两矩阵的行列数不一致\n");
break;
default:
printf("输入错误!\n");
}
Destory_SMatrix(A);
Destory_SMatrix(B);
Destory_SMatrix(C);
}
return 0;
}