稀疏矩阵一次快速转置汇编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电学院
数据结构实验报告稀疏矩阵一次定位快速转置
班级:
班内序号:
学生姓名:
指导教师:
时间:
目录
一、实验目的 (2)
二、实验内容 (2)
三、数据结构及算法思想 (2)
1、对各个模块进行功能的描述 (2)
2、模块之间关系及其相互调用的图示 (3)
五、详细设计及运行结果 (3)
1、设计源代码: (3)
2、运行结果: (5)
六、调试情况,设计技巧及体会 (5)
一、实验目的
1、进一步理解数组这个我们十分熟悉的结构,并了解在计数机内部是如何处理数组的。
2、熟悉并掌握特殊矩阵的定义和分类,并掌握它们的一种压缩存储方法。
3、理解并运用三元组表示方法压缩稀疏矩阵,通过“一次定位快速转置”法实现稀疏矩阵的转置。
二、实验内容
运用“一次定位快速转置”实现对一个已知行、列及非零元素个数的稀疏矩阵的三元组表表示的转置。
三、数据结构及算法思想
“一次定位快速转置”即将被转置的三元组表A的元素一次定位到三元组表B的正确位置上,具体做法为:用position[col]的初值表示三元组A中第col列中第一个非零元素的正确位置,当三元组A中第col列有一个元素加入到三元组表B时,则position[col]= position[col]+1,使position[col]始终指向三元组表A中第col列中下一个非零元素在三元素表B中的正确位置。
四、模块划分
1、对各个模块进行功能的描述
本次设计共分为三个模块,分别是输入模块、转置模块、显示模块。各
个模块功能如下表。
2、模块之间关系及其相互调用的图示
图1
五、详细设计及运行结果
1、设计源代码:
#include"stdio.h"
#include"malloc.h"
#define MAXSIZE 1000
typedef struct
{
int row,col; int e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1]; int m,n,len;
}TSMatrix;
void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B)
{
int col,t,p,q;
int num[MAXSIZE],position[MAXSIZE];
B->len=A.len; B->n=A.m; B->m=A.n;
if(B->len)
{
for(col=1;col<=A.n;col++)
num[col]=0;
for(t=1;t<=A.len;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]++;
}
}
}
main()
{
TSMatrix M;
TSMatrix *N=(TSMatrix *)malloc(sizeof(TSMatrix));
int i;
printf("请输入稀疏矩阵的行列数和非零元素的个数:\n");
scanf("%d%d%d",&M.m,&M.n,&M.len);
printf("请输入非零元素的位置下标和元素值:\n");
for(i=1;i<=M.len;i++)
scanf("%d%d%d",&M.data[i].row,&M.data[i].col,&M.data[i].e);
printf("\n稀疏矩阵的三元组表示:");
for(i=1;i<=M.len;i++)
printf("\n%d %d %d",M.data[i].row,M.data[i].col,M.data[i].e);
FastTransposeTSMatrix(M,N);
printf("\n转置后的三元组:");
for(i=1;i<=N->len;i++)
printf("\n%d %d %d",N->data[i].row,N->data[i].col,N->data[i].e);
getch();
}
2、运行结果:
图 2
六、调试情况,设计技巧及体会
通过这次稀疏矩阵的“一次定位快速转置”设计的练习,我更充分掌握和理解了数组这一数据结构类型,并学习了特殊矩阵的压缩存储方法,体会到完一个程序,只是完成一个设计的一小部分,后期的调试和验证也是重要的一部分,这次设计完成代码后编译都没错,但运行结果却不正确,通过调试后才的找出错误,运行成功,但经过一些数据的验证却又发现问题,最后才发现是有个地方少输入一个“=”的原因,经过改正后结果就正确了,所以一个设计的完成是需要不断的改进、调试和验证的,其中耐心和细心更是不可缺少的。更重要的是通过这次实践操作学会了完成一个设计的基本方法和步骤,拿到一个问题不能急于开始书写代码要将问题理清楚、找清思路、分好模块再开始敲代码,代码只是实现一个功能的工具,只有好的解决问题的思路,才能做出好的程序。