三元组压缩存储结构的稀疏矩阵的转置运算
题目:构建矩阵的三元组顺序表压缩存储结构;实现三元组压缩存储结构的矩阵的创建、输出,简单转置和快速转置。
#include <stdio.h>
#define MAXSIZE 200
typedef struct{
int row,col;
int e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];
int m,n,len;
}TSMatrix;
void Init(TSMatrix*T){
T->len=0;
T->data[1].row=0;
T->data[1].col=0;
}
//三元组压缩存储
void Input(TSMatrix*A,int *b){
int i,j=1,r=6,c=7;
A->m=r;A->n=c;
for(i=0;i<42;i++)
if(b[i]!=0){
A->data[j].e=b[i];
A->data[j].row=i/c+1;
A->data[j].col=(i+1)%c;
A->len++;
j++;
}
A->len=j-1;
}
//简单转置
void Transpose_TSM(TSMatrix*A,TSMatrix*B){
B->m=A->n;B->n=A->m;B->len=A->len;
int i,j=1,k;
if(B->len>0){
for(k=1;k<=A->n;k++)
for(i=1;i<=A->len;i++)
if(A->data[i].col==k)
{
B->data[j].row=A->data[i].col;
B->data[j].col=A->data[i].row;
B->data[j].e=A->data[i].e;
j++;
}
}
}
//快速转置
void FastTranspose_TSM(TSMatrix*A,TSMatrix*B){
int col,t,p,q;
int num[MAXSIZE],position[MAXSIZE];
B->m=A->n;B->n=A->m;B->len=A->len;
if(B->len){
for(col=1;col<=A->n;col++)
num[col]=0;
for(t=1;t<=A->n;t++)
num[A->data[t].col]++; //数组下标计数法
position[1]=1;
for(col=2;col<=A->n;col++)
position[col]=position[col-1]+num[col-1];
for(p=1;p<=A->len;p++)
{
col = A->data[p].col;
q=position[col];
B->data[q].row=A->data[p].col;
B->data[q].col=A->data[p].row;
B->data[q].e=A->data[p].e;
position[col]++;
}
}
}
void Output(TSMatrix*T,int *b,int r,int c){
int i,j,x;
for(i=0;i<r*c;i++)
b[i]=0;
for(i=1;i<=T->len;i++){
x=(T->data[i].row-1)*c+T->data[i].col-1;
b[x]=T->data[i].e;
}
printf("Output: \n");
for(i=0;i<r*c;i++){
printf("%2d ",b[i]);
if((i+1)%c==0)
printf("\n");
}
}
int main(){
int a[60],i;
int c[10]={0};
TSMatrix A,B;
FILE *fp;
if((fp=fopen("Matrix.txt","r"))==NULL){
printf("Cannot open file!");
return;
}
for(i=0;i<42;i++)
fscanf(fp,"%d",&a[i]);
fclose(fp);
Init(&A);
Input(&A,a);
Output(&A,a,A.m,A.n);
Transpose_TSM(&A,&B);
printf("\nAfter transpose:\n");
Output(&B,a,B.m,B.n);
FastTranspose_TSM(&A,&B);
printf("\nAfter fast-transpose:\n");
Output(&B,a,B.m,B.n);
return 0;
}
文件: