数据结构实验4-2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验2稀疏矩阵的表示和转置
实验人:学号:时间:2019.4.8
一、实验目的
1.掌握稀疏矩阵的三元组顺序表存储结构
2.掌握稀疏矩阵的转置算法。
二、实验内容
采用三元组表存储表示,求稀疏矩阵M的转置矩阵T。(算法5.1)
三、实验步骤:
1.构建稀疏矩阵M。
2.求稀疏矩阵M的转置矩阵T。
3.输出稀疏矩阵M和稀疏矩阵T。
四、算法说明
1.首先应输入矩阵的行数、列数和非零个数。
2.其次输入你所构建的稀疏矩阵,采用三元组顺序表存储表示,并判别给出的两个矩
阵的行、列数进行稀疏矩阵的转置时要做到,将每个三元组的i,j相互调换;并且重排三元组之间的次序便可实现矩阵的转置。
3.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的转置。
五、测试结果
六、分析与探讨
这次实验是稀疏矩阵的表示和转置编写的程序题,但是有关稀疏矩阵的写法在我平时上课时我就感觉有点难消化,以及对于矩阵的相关知识和三元组表的相关知识方面已经有些遗忘了。所以在编写实验内容之前我把数据结构书上有关稀疏矩阵的内容反反复复又看了两遍,了解了三元组顺序表、行逻辑链接的顺序表以及十字表的方法。在这次程序编写中我用到了三元组顺序表的方法。首先,根据实验内容采用三元组表存储表示,求稀疏矩阵M的转置矩阵T所围绕的程序算法5.1进行编程以及调试;其次,根据课程设计的要求进行实验目的以及实验意义的分析;最后,根据实验步骤对主函数main 进行编写,将项目设计的算法思想,基本算法,主函数调用一一呈现出来。主函数中主要包含构建稀疏矩阵M,输出构建稀疏矩阵M以及转置矩阵T三个部分。在整个课程设计中总是在编写程序中发生一些很小的错误,比如对元素缺少定义、缺个分号以及大小写方面。在编写的时候总会很粗心,有时会很没耐性,但都被我一一克服了,同时还有认真仔细,尽量保证不出现错误,看到自己的代码错误少了,也会更有信心和动力。最后,编程时要注意要有条理,这样有利于修改错误,减少时间的花费。
七、附录:源代码
源代码列在附录中,要求程序风格清晰易理解,有充分的注释。有意义的注释行不
少于30%。
#include
#define MAXSIZE 5
#define MAXMN 200
#define OK 1
typedef struct
{
int i,j; //该非零元的行下标和列下标
int e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数、列数和非零个数
}TSMatrix; //行逻辑连接的顺序表
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{ //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵 T
T.mu= M.nu; T.nu= M.mu; T.tu= M.tu;
if(T.tu){
int col,num[100],cpot[100],q;
for(col=1;col<=M.nu;++col) num[col]=0;
for(int t=1;t<=M.tu;++t) ++num[M.data[t].j]; //求M中每一列含非零元素个数
cpot[1]=1; //求第col列中第一个非零元在b.data中的序号
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;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]; //转置矩阵T中同一行的非零元的起始位置自增1
}
}
return OK;
}
int main()
{
TSMatrix M,T;
printf("请输入矩阵M的行数、列数、非零元的个数:");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
//求稀疏矩阵M的转置矩阵T
printf("请输入稀疏矩阵M:\n");
for(int i=1;i<=M.tu;i++)
{
scanf("%d%d%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
}
printf("稀疏矩阵M如下:\n");
printf("i\tj\te\n");
for (int t=1;t<=M.tu;t++)
{
printf("%d\t%d\t%d\n",M.data[t].i,M.data[t].j,M.data[t].e); //输出稀疏矩阵M
}
FastTransposeSMatrix(M,T); //调用函数将稀疏函数进行转置得到转置矩阵
printf("转置矩阵T 如下:\n");
printf("i\tj\te\n");
for (int t=1;t<= T.tu;t++)
printf("%d\t%d\t%d\n",T.data[t].i,T.data[t].j,T.data[t].e);
//输出转置矩阵T
return 0;
}