稀疏矩阵实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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={|1<=i<=m,1<=j<=n-1}

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(mdata[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) //行或列的顺序有错

{

printf("行或列的顺序有错");

getch();

exit();

}

M->data[i].i=m;

M->data[i].j=n;

M->data[i].e=e;

相关文档
最新文档