#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR 0;
#define OK 1;
#define MAXSIZE 10
#define ElemType int


typedef struct...{
int i; //该非零元的行下标
int j; //该非零元的列下标
ElemType e; //元素
}Triple;


typedef struct...{
Triple data[MAXSIZE+1];
int mu;//矩阵的行数
int nu;//矩阵的列数
int tu;//矩阵的非零元个数
}TSMatrix;
//插入元素到稀疏矩阵中
int Insert(TSMatrix &M,int set)...{
int i,j,e,k;
scanf("%d%d%d",&i,&j,&e);
for(k=1;k<=MAXSIZE;k++)...{
if(M.data[k].i==i&&M.data[k].j==j)...{
printf("输入错误,该位置已经有元素了! ");
return ERROR;
}
}
M.data[set].i=i;
M.data[set].j=j;
M.data[set].e=e;
return OK;
}
//快速转置矩阵
//M为原矩阵,T为新矩阵
int FTSMatrix(TSMatrix M,TSMatrix &T)...{
int col; //表示M中的第col列
int num[MAXSIZE+1]; //表示M中第col列中非零元素的个数
int cpot[MAXSIZE+1]; //表示该元素应该插入的位置
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)...{
for(col=1;col<=T.tu;col++)...{
num[col]=0; //初始化每行含有非零元的个数
}
for(int t=1;t<=M.tu;t++)...{
++num[M.data[t].j]; //j中记录的是元素所在的列.这个变量刚好又可以当作T行中含有的元素个数
}
cpot[1]=1;
for(col=2;col<=M.nu;col++)...{
cpot[col]=cpot[col-1]+num[col-1];//计算下一个存储位置
}
//开始转置
for(int p=1;p<=M.tu;p++)...{
col=M.data[p].j;
T.data[cpot[col]].i=M.data[p].j;
T.data[cpot[col]].j=M.data[p].i;
T.data[cpot[col]].e=M.data[p].e;
cpot[col]++;
}
}
return OK;
}
//仅仅打印非零元
void Print(TSMatrix M)...{
for(int i=1;i<11;i++)...{
printf("%d %d %d ",M.data[i].i,M.data[i].j,M.data[i].e);
}
}
//打印所有的元素
void PrintAll(TSMatrix M)...{
int getElem(TSMatrix M,int m,int n);
printf(" ");
for(int m=0;m<M.mu;m++)...{
for(int n=0;n<M.nu;n++)...{
if(m==0)...{
printf("%3d",n);
}else if(n==0)...{
printf("%3d:",m);
}else...{
printf("%3d",getElem(M,m,n));
}
}
printf(" ");
}
}
//返回指定位置的元素
int getElem(TSMatrix M,int m,int n)...{
for(int k=1;k<=MAXSIZE;k++)...{
if(M.data[k].i==m&&M.data[k].j==n)...{
return M.data[k].e;
}
}
return ERROR;
}

void main()...{
TSMatrix M;
TSMatrix T;
M.mu=11;
M.nu=12;
M.tu=MAXSIZE;
printf("输入行下标/列下标/元素: ");
for(int i=1;i<11;i++)...{
printf("输入第%d个元素:",i);
if(!Insert(M,i))
i--;
}
printf("打印原始稀疏矩阵 ");
PrintAll(M);
printf("开始转置稀疏矩阵 ");
FTSMatrix(M,T);
printf("打印转置稀疏矩阵 ");
PrintAll(T);
}

被折叠的 条评论
为什么被折叠?



