三元组顺序表

//2022.10.11
#include <stdio.h>
#include <stdlib.h>

#define N 20
//定义三元组类型
typedef struct triple
{
int i,j;//行列下标
int e;//非零元的值
}triple;

//定义三元组顺序表的类型
typedef struct TS{
triple data[N+1];
int mu,nu,tu;//行数,列数,非零元个数
}TS;

TS M,T;//定义一个三元组顺序表



//三元组表的建立
void creat(){
int r,c,x;M.tu=0;//行 列 值 下表
printf("请输入稀疏矩阵的行数和列数:");
scanf("%d%d",&M.mu,&M.nu);
printf("请输入值:");
for(r=1;r<=M.mu;r++)
for(c=1;c<=M.nu;c++)
{
scanf("%d",&x);
if(x)
{
M.tu++;
M.data[M.tu].i=r;
M.data[M.tu].j=c;
M.data[M.tu].e=x;
}
}
}


//转置三元组表
void fasttrans(){
int num[N],cpot[N],col,p,q;
T.nu=M.mu;
T.mu=M.nu;
T.tu=M.tu;
if(T.tu)
{
for(col=1;col<=M.nu;col++)
num[col]=0;
for(p=1;p<=M.tu;p++)
{
col=M.data[p].j;
num[col]++;
}
cpot[1]=1;
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 output(TS A)
{
int p;
for(p=1;p<=A.tu;p++)
printf("%3d%3d%3d\n",A.data[p].i,A.data[p].j,A.data[p].e );
}

void main(){
creat();
printf("输出转置前的:\n");
output(M);
printf("输出转置后的:\n");
fasttrans();
output(T);
}