中国石油大学数据结构上机实验.docx
- 文档编号:29867121
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:13
- 大小:53.50KB
中国石油大学数据结构上机实验.docx
《中国石油大学数据结构上机实验.docx》由会员分享,可在线阅读,更多相关《中国石油大学数据结构上机实验.docx(13页珍藏版)》请在冰豆网上搜索。
中国石油大学数据结构上机实验
《数据结构》实验报告
学号
2015011512
姓名
胡明禹
专业
数学与应用数学
时间
2018.4.24
一、实验题目
实验5稀疏矩阵的转置
二、实验目的
1.稀疏矩阵的压缩存储方法
2.掌握稀疏矩阵的转置算法
三、算法设计分析
(一)实验内容
1.从键盘输入数据,建立稀疏矩阵的三元组顺序存储
2.实现稀疏矩阵的转置算法
3.输出原矩阵及转置后的矩阵
4.实现矩阵的快速转置算法
(二)总体设计
此处给出主要函数功能、及函数间调用关系的的描述。
例如:
①创建稀疏矩阵函数
②转置矩阵T函数③快速转置函数④输出函数⑤输出原矩阵和转置函数
其功能描述如下:
(1)主函数:
统筹调用各个函数以实现相应功能
Statusmain()
(2)①创建稀疏矩阵函数
StatusCreateSMatrix(TSMatrix&M)
{printf("请输入原矩阵:
\n");
printf("行数、列数:
");
scanf("%d%d",&M.mu,&M.nu);
printf("元素总数:
");
scanf("%d",&M.tu);
printf("输入各个对应压缩值:
\n");
for(inti=1;i<=M.tu;++i)
scanf("%d%d%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
returnOK;
}
②转置矩阵T函数
StatusTransposeSMatrix(TSMatrixM,TSMatrix&T)
{intp,q,col;
T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
if(T.tu)
{
q=1;
for(col=1;col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if(M.data[p].j==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;
++q;
}
}
printf("\n\n稀疏矩阵M转置成功。
\n\n");
returnOK;
}//TransposeSMatrix
③快速转置函数
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix&T)
{T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
intcol,t,q;
intnum[100],cpot[100];
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];//求cpot向量
for(intp=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];
}//for
}//if
printf("\n\n稀疏矩阵M快速转置成功。
\n\n");
returnOK;
}
④输出函数
StatusOutputOSMatrix(TSMatrix&M)
{printf("\n\n原稀疏矩阵\n");
printf("行数、列数、元素总数\n%d%d%d\n\n",M.mu,M.nu,M.tu);
printf("值\n");
for(intt=1;t<=M.tu;++t)
printf("%d%d%d\n",M.data[t].i,M.data[t].j,M.data[t].e);
returnOK;
}
⑤输出原矩阵和转置函数
StatusOutputTSMatrix(TSMatrix&M,TSMatrix&T)
{printf("\n\n原稀疏矩阵转置后的稀疏矩阵\n");
printf("行数、列数、元素总数行数、列数、元素总数\n%d%d%d%d%d%d\n\n",M.mu,M.nu,M.tu,T.mu,T.nu,T.tu);
printf("值值\n");
for(intt=1;t<=T.tu;++t)
printf("%d%d%d%d%d%d\n",M.data[t].i,M.data[t].j,M.data[t].e,T.data[t].i,T.data[t].j,T.data[t].e);
returnOK;
}
四、实验测试结果及结果分析
(一)测试结果(此处给出程序运行截图)
(二)结果分析
矩阵的快速转置方法的原理是:
如果能预先确定矩阵M中每一列(即T中每一行)的第一个非零元在b.data中(上面那图是b.data)恰当位置。
那么在对a.data中的三元组一次做转置时,便可直接放到b.data中恰当的位置上去。
五、实验总结
附录实验程序代码(该部分请加注释)
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#defineMAXSIZE12500//假设非零元个数的最大值为12500
#defineOK1
#defineERROR0
typedefintElemType;
typedefintStatus;
typedefstruct
{
inti,j;//该非零元的行下标和列下标
ElemTypee;//非零元对应的值
}Triple;
typedefstruct
{
Tripledata[MAXSIZE+1];//非零元三元组,data[0]未用
intmu,nu,tu;//矩阵的行数、列数和非零元个数
}TSMatrix;
StatusCreateSMatrix(TSMatrix&M)
{
//创建稀疏矩阵,从键盘输入数据,建立系数矩阵的三元组顺序存储
printf("请输入原矩阵:
\n");
printf("行数、列数:
");
scanf("%d%d",&M.mu,&M.nu);
printf("元素总数:
");
scanf("%d",&M.tu);
printf("输入各个对应压缩值:
\n");
for(inti=1;i<=M.tu;++i)//按照输入的元素总数,依次输入非零元的坐标以及值
scanf("%d%d%d",&M.data[i].i,&M.data[i].j,&M.data[i].e);
returnOK;
}
StatusTransposeSMatrix(TSMatrixM,TSMatrix&T)
{//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
intp,q,col;
T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
if(T.tu)
{
q=1;
for(col=1;col<=M.nu;++col)
for(p=1;p<=M.tu;++p)
if(M.data[p].j==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;
++q;
}
}
printf("\n\n稀疏矩阵M转置成功。
\n\n");
returnOK;
}//TransposeSMatrix
StatusFastTransposeSMatrix(TSMatrixM,TSMatrix&T)//快速转置
{
//采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
if(T.tu)
{
intcol,t,q;
intnum[100],cpot[100];
for(col=1;col<=M.nu;++col)
num[col]=0;//num数组的初始化
for(t=1;t<=M.tu;++t)
++num[M.data[t].j];//求M中每一列含有的非零元个数
cpot[1]=1;
for(col=2;col<=M.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];//求cpot向量
for(intp=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];
}//for
}//if
printf("\n\n稀疏矩阵M快速转置成功。
\n\n");
returnOK;
}//FastTransposeSMatrix
StatusOutputOSMatrix(TSMatrix&M)
{
//输出原矩阵,为了输出美观,调整了间距
printf("\n\n原稀疏矩阵\n");
printf("行数、列数、元素总数\n%d%d%d\n\n",M.mu,M.nu,M.tu);
printf("值\n");
for(intt=1;t<=M.tu;++t)
printf("%d%d%d\n",M.data[t].i,M.data[t].j,M.data[t].e);
returnOK;
}
StatusOutputTSMatrix(TSMatrix&M,TSMatrix&T)
{//输出原矩阵和转置矩阵,为了输出美观,调整了间距
printf("\n\n原稀疏矩阵转置后的稀疏矩阵\n");
printf("行数、列数、元素总数行数、列数、元素总数\n%d%d%d%d%d%d\n\n",M.mu,M.nu,M.tu,T.mu,T.nu,T.tu);
printf("值值\n");
for(intt=1;t<=T.tu;++t)
printf("%d%d%d%d%d%d\n",M.data[t].i,M.data[t].j,M.data[t].e,T.data[t].i,T.data[t].j,T.data[t].e);
returnOK;
}
voidmainmenu()//输出菜单,供用户进行操作选择
{
printf("\n菜单");
printf("\n****************************\n\n");
printf("*1.创建稀疏矩阵*\n");
printf("*2.稀疏矩阵转置*\n");
printf("*3.稀疏矩阵快速转置*\n");
printf("*4.输出原矩阵和转置矩阵*\n");
printf("*0.退出*\n");
printf("\n*****************************\n");
}
Statusmain()//主函数
{
TSMatrixM;
TSMatrixT;
intchoose;
while
(1)
{
mainmenu();
printf("\n请输入你的选择:
");
scanf("%d",&choose);
switch(choose)
{
case1:
//在此插入创建稀疏矩阵函数
system("cls");
CreateSMatrix(M);
system("PAUSE");
system("cls");
break;
case2:
//在此插入稀疏矩阵转置函数
system("cls");
TransposeSMatrix(M,T);
system("PAUSE");
system("cls");
break;
case3:
//在此调用稀疏矩阵快速转置函数
system("cls");
FastTransposeSMatrix(M,T);
system("PAUSE");
system("cls");
break;
case4:
//在此调用输出原稀疏矩阵以及转置矩阵函数
system("cls");
OutputTSMatrix(M,T);
system("PAUSE");
system("cls");
break;
case0:
//退出
exit(0);
break;
default:
//输入非法,提示用户重新输入
printf("\n输入错误,重新输入!
\n");
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国 石油大学 数据结构 上机 实验