数据结构—三元组表法实现稀疏矩阵的转置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#define N 100
typedef struct
{
int i,j;
int e;
}tsMatrix;
typedef struct
{
tsMatrix data[N];/*最大长度为N */
int m,n,tu; //行、列、非零元素的个数
}TSMatrix;
void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)
/*基于矩阵的三元组表示,采用一次定位快速转置法,将矩阵A转置为矩阵B*/
{
int col,p,q,t;
int num[N],position[N];
B->m=A.n;B->n=A.m;B->tu=A.tu;
if(B->tu)
{
for(col=1;col<=A.n;++col)
num[col]=0;
for(t=1;t<=A.tu;++t)
++num[A.data[t].j]; //采用数组计数法计算每一列的非零元素的个数
position[1]=1;
for(col=2;col<=A.n;++col) //求col列中第一个非零元素在B.data[]中的位置
position[col]=position[col-1]+num[col-1];
for(p=1;p<=A.tu;++p) //将被转置的三元组表A扫描一次,实现矩阵转置
{
col=A.data[p].j;
q=position[col];
B->data[q].i=A.data[p].j; //行列互换,元素赋值
B->data[q].j=A.data[p].i;
B->data[q].e=A.data[p].e;
++position[col]; //令position[col]指向A中本列下一个非零元素在B中的存储位置
}
}
}
void outputTSMatrix(TSMatrix *M)
{
int p,q;
int t=1;
for(p=1;p<=M->m;p++)
{
for(q=1;q<=M->n;q++)
{
if(M->data[t].i==p&&M->data[t].j==q)
{
printf("%d ",M->data[t].e);
t++;
}
else printf("0 ");
}
printf("\n");
}
}
void main()
{
TSMatrix A,T;int k;
printf("请输入矩阵的大小\n:");
printf("它的行:");scanf("%d",&A.m);
printf("它的列:");scanf("%d",&A.n);
printf("请输入非零元素的个数:");scanf("%d",&A.tu);
printf("请输入三元组表(格式为:行号 列号 元素值):\n");
for(k=1;k<=A.tu;k++)
{
scanf("%d %d %d",&A.data[k].i,&A.data[k].j,&A.data[k].e);
}
printf("原矩阵:\n");
outputTSMatrix(&A);
FastTransposeTSMatrix(A,&T);
printf("转置后的矩阵:\n");
outputTSMatrix(&T);
}