稀疏矩阵快速转置 数据结构实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌航空大学实验报告
课程名称:数据结构实验名称:实验五稀疏矩阵的存储和快速转置班级:080611 学生姓名:学号:08
指导教师评定:签名:
题目:假设稀疏矩阵A采用三元组表表示,编写程序实现该矩阵的快速转置
要求:输入一个稀疏矩阵A,由程序将其转换成三元组表存储;转置后的三元组表,由程序将其转换成矩阵形式后输出。
一、需求分析
1.用户可以根据自己的需求输入任意一个稀疏矩阵,通过程序将其转换成三元组存储方
式;
2.并且能够完成矩阵的转置功能,要求需要使用的方法是快速转置的方法。
3.最后要够显示原矩阵和转置后的矩阵让用户能进行比较。
4.程序执行的命令包括:
(1)构造稀疏矩阵M (2)求转转矩阵T (3)显示(打印)矩阵
二、概要设计
⒈为实现上述算法,需要线性表的抽象数据类型:
ADT SparseMatrix {
数据对象:D={a ij:|a ij∈TermSet,i=1…m,m≥0,j=1…n,n≥0
m和n分别成为矩阵的行数和列数 }
数据关系:R={Row,Col}
Row ={|1≤i≤m,1≤j≤n-1 }
Col ={|1≤i≤m-1,1≤j≤n }
基本操作:
CreateSMtrix(& M)
操作结果:创建稀疏矩阵M。
DestroySMaix(&M)
初始条件:稀疏矩阵M已存在。
操作结果:销毁稀疏矩阵M。
PrintSMatrix(L)
初始条件:稀疏矩阵M已经存在。
操作结果:输出稀疏矩阵M。
CopySMatrix(M,&T)
初始条件:稀疏矩阵M已经存在。
操作结果:由稀疏矩阵M复制得到T。
TransposeSMatrix(M,&T)
初始条件:稀疏矩阵M已经存在。
操作结果:求稀疏矩阵M的转转矩阵T。
}ADT SparseMatrix
2. 本程序有三个模块:
⑴主程序模块
main(){
初始化;
{
接受命令;
显示结果;
}
}
⑵矩阵压缩存储单元模块:实现链表抽象数据类型操作,即函数的定义模块;
三、详细设计
⒈元素类型,结点类型
typedef struct {
int i,j;
int e;
}Triple;
typedef struct{
Triple data[MAXSIZE+1];
int mu,nu,tu;
} Tsmatrix;
2.对抽象数据类型中的部分基本操作的伪码算法如下:
Tsmatrix * creatarray(Tsmatrix *M)
{ int m,n,p=1;
int c;
printf("please input the array A:\n");
for(m=1;m<=a;m++)
for(n=1;n<=b;n++)
{ scanf("%d",&c);
if(c!=0)
{ M->data[p].e=c;
M->data[p].i=m;
M->data[p].j=n;
p++;
}
}
M->tu=p; M->mu=a; M->nu=b;
printf("yuan lai san yuan zu de biao shi wei :\n\n");
for(m=1;m<=M->tu;m++)
printf("%3d%3d%3d\t",M->data[m].i,M->data[m].j,M->data[m].e);
printf("\n");
return M;
}
/*三元组快速转置*/
Tsmatrix * fasttrans(Tsmatrix *M,Tsmatrix *T)
{ int p,col,q,t,m;
int num[100];
int cpot[100];
T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
if(T->tu!=0)
{
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;
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];
}
}
printf("\n\nzhuan zhi hou de san yuan zu biao shi wei :\n\n");
for(m=1;m<=T->tu;m++)
printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e);
printf("\n");
return T;
}
/*输出三元组函数*/
void print(Tsmatrix *T,int x,int y)
{ int m,n,p=1;
int d;
for(m=1;m<=x;m++)
{ printf("\n");
for(n=1;n<=y;n++)
{ if(T->data[p].i==m&&T->data[p].j==n)
{ d=T->data[p].e;
p++;
}
else d=0;
printf("%6d",d);
}
}
}
}3.主函数和其他函数的伪码算法
void main()
{ Tsmatrix *M,*T;