实验内容:
定义一个 10*10 的稀疏矩阵,试定义一个三元组结构,以行优先的形式存储上述矩阵,并实现:
(1) 上述三元组存储的矩阵的转置
(2) 输出原始 10*10 矩阵及其三元组表示
(3) 输出转置后的 10*10 矩阵及其三元组表示
#include <stdio.h>
#include <string.h>//memset函数必要头文件
#define OK 1
#define MAXSIZE 100 //假设非零元个数的最大值为100
typedef int status;
/*三元组顺序表存储*/
typedef struct {
int i,j; //该非零元的行下标和列下标
int e; //值
}Triple;
typedef struct {
Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零元个数
}TSMatrix;
/*对三元组赋值*/
status Inittsmarix(TSMatrix *M)
{
M->mu=10;//矩阵基本信息,行列以及非零个数
M->nu=10;
M->tu=16;
int i,j;
for(i=1;i<=5;i++)//手动输入数据,下同
{
M->data[i].i=i;
M->data[i].j=i;
}
M->data[1].e=2;
M->data[2].e=1;
M->data[3].e=1;
M->data[4].e=5;
M->data[5].e=3;
M->data[6].i=10;
M->data[6].j=10;
M->data[6].e=8;
M->data[7].i=6;
M->data[7].j=3;
M->data[7].e=3;
M->data[8].i=7;
M->data[8].j=4;
M->data[8].e=8;
M->data[9].i=9;
M->data[9].j=7;
M->data[9].e=2;
M->data[10].i=10;
M->data[10].j=2;
M->data[10].e=1;
M->data[11].i=2;
M->data[11].j=5;
M->data[11].e=5;
M->data[12].i=3;
M->data[12].j=8;
M->data[12].e=1;
M->data[13].i=6;
M->data[13].j=8;
M->data[13].e=3;
return OK;
}
/*转置矩阵*/
status TransposeSMatrix(TSMatrix M,TSMatrix *T){
//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
T->mu = M.nu;//基本信息的复制,行列数值交换
T->nu = M.mu;
T->tu = M.tu;
if(T->tu)//非零元不为零时
{
int q = 1;
int col,p;
for(col = 1;col <= M.nu; ++col)
for(p = 1; p <= M.tu; ++p)
if(M.data[p].j == 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;
++q;
}
}
return OK;
}
int main()
{
TSMatrix M,T;
int i,j;
int matris[10][10];//生成一个二维数组便于矩阵具象化
memset(matris,0,sizeof(matris));//对数组元素全部初始化为0
Inittsmarix(&M);//初始化三元组
for(i=1;i<14;i++)
matris[M.data[i].i-1][M.data[i].j-1]=M.data[i].e;//把三元组信息传入数组
printf("Before:\n");
for(j=0;j<10;j++)
{
for(i=0;i<10;i++)//用两个循环遍历二维数组
printf("%d ",matris[j][i]);//打印数组元素
printf("\n");
}
for(i=1;i<14;i++)
printf("%d %d %d\n",M.data[i].i,M.data[i].j,M.data[i].e);
TransposeSMatrix(M,&T);//转置三元组
printf("\n");
printf("later:\n");
memset(matris,0,sizeof(matris));//把二维数组重置为0
for(i=1;i<14;i++)
matris[T.data[i].i-1][T.data[i].j-1]=T.data[i].e;
for(j=0;j<10;j++)
{
for(i=0;i<10;i++)
printf("%d ",matris[j][i]);//打印转置后的稀疏矩阵
printf("\n");
}
for(i=1;i<14;i++)
printf("%d %d %d\n",T.data[i].i,T.data[i].j,T.data[i].e);
}
代码中用的是转置算法,下面附上快速转置的伪代码:
/*快速转置*/
status FastTransposeSMatrix(TSMatrix M, TSMatrix *T){
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
int col,t,p;
T->mu = M.nu;
T->nu = M.mu;
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];
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];
}//for
}//if
return OK;
}