稀疏矩阵实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
稀疏矩阵基本操作
班级:计算机科学与技术(2)班
小组成员:
日期:2012年4月17日
1.需求分析
【实验目的】熟悉抽象数据类型的表示和实现方法。抽象数据类型需借助固有数据类型来表示和实现,及利用高级程序设计语言中已存在的数据类型来说明新的结构,用已经实现的操作来组合新的操作,具体实现细节则依赖于所用的语言的功能。通过本次实习还可以帮助读者复习高级语言的使用方法。掌握数组的特点及基本操作,如存储、输出、乘积、转置等,,以便在实际问题背景下灵活应用。【基本要求】
1.用C++/C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.分析算法,要求给出具体的算法分析结果,包括时间复杂度和空间复杂度,并简要给出算法设计小结和心得。
2.概要设计
栈的抽象数据类型
ADT Matrix {
数据对象:D={aij| i=1,2,…,m;j=1,2,…,n;
ai∈ElemSet,m 、n分别称为矩阵的行数和列数}数据关系:R={Row,Col}
Row={
Col={ 基本操作: CreatSMatrix(&M) 操作结果:构造一个稀疏矩阵。 Destroy SMatix (&M) 初始条件:稀疏矩阵M已存在。 操作结果:销毁稀疏矩阵M。 PrintSMtrix(&M) 初始条件:稀疏矩阵已存在。 操作结果:输出稀疏矩阵M。 CompSMtrix(M,&T) 初始条件:稀疏矩阵M已存在。 操作结果:由稀疏矩阵M复制得到T。 AddSMtrix(M,N,&Q) 初始条件:稀疏矩阵M和N的行数与列数相等。 操作结果:求稀疏矩阵的和Q=M+N。 SubtMtrix(M,N,&Q) 初始条件:稀疏矩阵M和N的行数与列数对应相等。 操作结果:求稀疏矩阵的差Q=M-N。 MultSMtrix(M,N,&Q) 初始条件:稀疏矩阵的M的列数等于N的的行数。 操作结果:求稀疏矩阵的差Q=M x N。 TransposeSMatrix(M,&T) 初始条件:栈S已存在且非空。 操作结果:删除S的栈顶元素,并用e返回其值。 }ADT SparseSMatrix 3.详细设计 //------------稀疏矩阵的三元组顺序表存储表示------------------- #define MAXSIZE 12500 typedef struct{ int i,j; //该飞了那个元素的行下标和列下标 ElemType e; }Triple; Typedef struct{ Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 int mu,nu,tu; //矩阵的行数、列数和非零元素的个数 }TSMatrix; 4.测试结果: M= 0 0 4 0 0 3 7 0 0 0 0 5 0 8 0 4 0 0 2 10 N= 0 0 0 6 0 7 0 0 9 0 4 0 0 0 8 5.附录: 源程序: Matrix.h //函数申明 #include #define MAXSIZE 100 //非零元个数的最大值 typedef struct triple { int i,j; // 行下标,列下标 int e; // 非零元素值 }triple; typedef struct tsmatrix { triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用 int mu,nu,tu; //矩阵的行数、列数和非零元个数 }rlsmatrix; createsmatrix(rlsmatrix *M); //创建稀疏矩阵M void transposesmatrix(rlsmatrix M,rlsmatrix *T); //求矩阵的快速转置 multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T);//求矩阵乘积Q=M x N void printmatrix(rlsmatrix M); //输出 Matrix.c //函数定义 createsmatrix(rlsmatrix *M) //创建稀疏矩阵M { int e,i,m,n; M->data[0].i=0; // 为以下比较顺序做准备 printf("请输入矩阵的行数,列数,和非零元素的个数\n"); printf("行数:"); scanf("%d",&M->mu); printf("列数:"); scanf("%d",&M->nu); printf("非零元素个数:"); scanf("%d",&M->tu); for(i=1;i<=M->tu;i++) { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值\n",i,M->mu,M->nu); printf("行数:"); scanf("%d",&m); printf("列数:"); scanf("%d",&n); printf("元素值:"); scanf("%d",&e); if(m<1||m>M->mu||n<1||n>M->nu) //行或列超出范围 { printf("行或列超出范围,现退出程序,请核对后在输入"); getch(); exit(); } if(m { printf("行或列的顺序有错"); getch(); exit(); } M->data[i].i=m; M->data[i].j=n; M->data[i].e=e;