1.问题描述
建立ADT稀疏矩阵定义,调用矩阵转置运算,并显示结果。从键盘输入稀疏矩阵的元素,利用三元组表进行存储,从屏幕显示稀疏矩阵的元素;然后调用稀疏矩阵(三元组存储结构)转置算法,将稀疏矩阵进行转置运算,并从屏幕显示转置后的稀疏矩阵的元素。
2.代码实现(代码中已注释)
//导入头文件
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
//定义三元组
typedef struct{
int i;//行
int j;//列
int e;//元素
}Triple;
typedef struct{
Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用
int mu;//矩阵行数
int nu;//矩阵列数
int tu;//矩阵中非零元个数
}TSMatrix;
//创建稀疏矩阵
TSMatrix createMatrix(){
TSMatrix M;//创建临时稀疏矩阵
printf("请输入一个稀疏矩阵的三元组表示:\n");
printf("请输入矩阵的行数、列数和非零元素的个数:");
scanf("%d %d %d",&(M.mu),&(M.nu),&(M.tu));
int k=1;
while(k<=M.tu){
printf("请输入第%d个非零元素的行号、列号和值:",k);
scanf("%d %d %d",&(M.data[k].i),&(M.data[k].j),&(M.data[k].e));
k++;
}
return M;//返回创建好的稀疏矩阵
}
//快速转置
void FastTransposeSMatrix(TSMatrix M,TSMatrix *T){
int num[MAXSIZE];
int cpot[MAXSIZE];
int q,p,col,t;
T->mu=M.mu;//行数
T->nu=M.nu;//列数
T->tu=M.tu;//非零元素个数
if(T->tu){
for(col=1;col<=M.nu;col++){
num[col]=0;
}
for(t=1;t<=M.tu;t++){
++num[M.data[t].j];//求M中每一列非零元素个数
}
cpot[1]=1;
//求第col列中第一个非零元在b.data中的序号
for(col=2;col<=M.nu;col++){
cpot[col]=cpot[col-1]+num[col-1];
}
for(p=1;p<=M.tu;p++){
col=M.data[p].j;
q=cpot[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].e=M.data[p].e;
cpot[col]++;
}
}
}
//以矩阵形式输出
void outMatrix(TSMatrix T){
int k=1;
for(int i=1;i<=T.mu;i++){
for(int j=1;j<=T.nu;j++){
if(i==T.data[k].i&&j==T.data[k].j){ //指定矩阵位置
printf("%d ",T.data[k].e);//输出元素
k++;
}else{
printf("%d ",0);//输出元素 0
}
}
printf("\n");//换行
}
}
int main(){
TSMatrix M,T;//创建稀疏矩阵,M为初始稀疏矩阵,T为稀疏矩阵转置后的矩阵
M=createMatrix();//创建稀疏矩阵
printf("构造好的矩阵如下:\n");//换行
outMatrix(M); //输出显示
FastTransposeSMatrix(M,&T);//快速转置
printf("\n转置后的稀疏矩阵的三元组表示为:\n");
int k=1;
while(k<=T.tu){
printf("(%d,%d,%d)\n",(T.tu),(T.data[k].i),(T.data[k].j),(T.data[k].e));
k++;
}
printf("\n转置后的矩阵如下:\n");
outMatrix(T); //输出显示
}