题目:稀疏矩阵A、B均采用三元组顺序表表示,验证实现矩阵A快速转置算法,并设计、验证矩阵A、B相加得到矩阵C的算法。
(1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
(2) 设计算法将随机生成的稀疏矩阵转换成三元组顺序表形式存储。
(3) 设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。
(4) 输出随机生成的稀疏矩阵A、B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。
1、在本次实验中,首先,从键盘输入A,B矩阵的行数与列数并建立稀疏矩阵A和B的信息,然后使两个矩阵相加,再输出A,B矩阵三元组表,转置三元组表。
2. 演示程序以用户和计算机对话的方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上先后输入两个矩阵信息。
3. 程序执行的命令包括:
(1) 输入矩阵A的行数和列数;
(2) 输出A的三元组顺序表;
(3) 将A矩阵转置,并输出转置后的三元组表和矩阵;
(4) 输入矩阵B的行数和列数;
(5) 输出B的三元组顺序表;
(6) 将B矩阵转置,并输出转置后的三元组表和矩阵。
(7) 将矩阵A与B相加得到矩阵C
(8) 结束
#include<stdio.h>
#define MAXSIZE 1250
typedef int ElemType;
typedef struct{
int i,j;
ElemType e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
int a[10][10];
void toTSM(TSMatrix *M){ //三元组顺序表的创建
int p=1;
for(int i=1;i<=M->mu;i++){
for(int j=1;j<=M->nu;j++){
if(a[i][j]!=0){
M->data[p].i=i;
M->data[p].j=j;
M->data[p].e=a[i][j];
p++;
}
}
}
}
void print(TSMatrix M){ //输出稀疏矩阵
for(int i=1;i<M.mu;i++){
for(int j=1;j<=M.nu;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
}
void printT(TSMatrix Q){ //打印三元组表
for(int i=1;i<=Q.tu;i++){
printf("%d %d %d\n",Q.data[i].i,Q.data[i].j,Q.data[i].e);
}
}
void toTSMt(TSMatrix M,TSMatrix &T){ //三元组的转置
int num[MAXSIZE+1]; //用于记录T的每行的非零元个数
int cpot[MAXSIZE+1]; //记录T的每行第一个非零元所在三元组中的位置
int col,p,q,j,t;
T.nu=M.mu; T.mu=M.nu; T.tu=M.tu;
for(col=1;col<=T.mu;col++) num[col]=0; //初始化
for(t=1;t<=M.tu;t++) ++num[M.data[t].j]; //记录T的每行(M的每列)的个数
cpot[1]=1;
for(col =2;col<=T.mu;col++) cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=T.tu;p++){
col=M.data[p].j; q=cpot[col];
T.data[q].e=M.data[p].e;
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
++cpot[col];
}
}
void addTSMatrix(TSMatrix S1,TSMatrix S2,TSMatrix &S){ //三元组的加法
S.mu=S1.mu;
S.nu=S1.nu;
int k1=1,k2=1,count=0;
while(k1<=S1.tu && k2<=S2.tu){
if(S1.data[k1].i>S2.data[k2].i){
count++;
S.data[count].i=S2.data[k2].i;
S.data[count].j=S2.data[k2].j;
S.data[count].e=S2.data[k2].e;
k2++;
}else if(S1.data[k1].i<S2.data[k2].i){
count++;
S.data[count].i=S1.data[k1].i;
S.data[count].j=S1.data[k1].j;
S.data[count].e=S1.data[k1].e;
k1++;
}else{
if(S1.data[k1].j>S2.data[k2].j){
count++;
S.data[count].i=S2.data[k2].i;
S.data[count].j=S2.data[k2].j;
S.data[count].e=S2.data[k2].e;
k2++;
}else if(S1.data[k1].j<S2.data[k2].j){
count++;
S.data[count].i=S1.data[k1].i;
S.data[count].j=S1.data[k1].j;
S.data[count].e=S1.data[k1].e;
k1++;
}else{
if(S1.data[k1].e+S2.data[k2].e!=0){
count++;
S.data[count].i=S1.data[k1].i;
S.data[count].j=S1.data[k1].j;
S.data[count].e=S1.data[k1].e+S2.data[k2].e;
k1++;
k2++;
}else{
k1++;
k2++;
}
}
}
}
while(k1<=S1.tu){
count++;
S.data[count].i=S1.data[k1].i;
S.data[count].j=S1.data[k1].j;
S.data[count].e=S1.data[k1].e;
k1++;
}
while(k2<=S2.tu){
count++;
S.data[count].i=S2.data[k2].i;
S.data[count].j=S2.data[k2].j;
S.data[count].e=S2.data[k2].e;
k2++;
}
S.tu=count;
}
int main(){
TSMatrix M;
TSMatrix T;
TSMatrix S;
printf("请输入稀疏矩阵的行列数与非零元个数分别为 : ");
scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
//初始化稀疏矩阵
int x,y,value;
printf("请输入每个非零元的位置与值:\n");
for(int i=0;i<M.tu;i++){
scanf("%d %d %d",&x,&y,&value);
a[x][y]=value;
}
toTSM(&M);
printf("输出三元组如下:\n");
printT(M);
printf("\n");
printf("转置后的三元组为:\n");
toTSMt(M,T);
printT(T);
printf("\n");
//懒得创建新的一个三元组,这里直接用转置前后的两个三元组进行三元组的加法计算
printf("三元组相加结果为:\n");
addTSMatrix(M,T,S);
printT(S);
printf("\n");
}
运行结果