当前位置:文档之家› 数据结构三元组稀疏矩阵

数据结构三元组稀疏矩阵

数据结构三元组稀疏矩阵
数据结构三元组稀疏矩阵

一、课程设计的目的

1.将C++语言理论基础实例化。

2.掌握关于编程的技巧和方法。

3.培养解决综合性实际问题的能力。

二、课程设计任务

题目:稀疏矩阵A,B的和

题目要求:稀疏矩阵A,B用三元组顺序表存储。

三元组表C存放结果矩阵

A,B的和存到C中。

题目:用三元组C存放以三元组顺序表做存储结构的稀疏矩阵A,B的和

一、题目分析

三元组表C是结果矩阵,其中元素仍行优先排列,

按元素的行列去找A中的三元组,若有,则加入C,同时,这个元素

如果在B中也有,则加上B的这个元素值,否则这个值就不变;

如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。两

个稀疏矩阵的非零元素按三元组表形式存放,

二、程序代码

#include

#include

#define max 10

typedef struct

{int i,j;

int v;

}spnode;

typedef struct

{int mu,nu,tu;

spnode data[max];

}spmatrix;

addmatrix(spmatrix *a,spmatrix *b)

{spmatrix *c;

int p=0;q=0;col;

c=(spmatrix*)malloc(sizeof(spmatrix));

c->mu=a->mu;

c->nu=a->nu;

c->tu=0;

while (ptu&&qtu)

{

if((a-> data[p].i==B-> data[q].i)&&(A-> data[p].j==B-> data[q].j)) { col=a-> data[p].v+B-> data[q].v;

if(col!=0)

{ c-> data[c-> tu].i=a-> data[p].i;

c-> data[c-> tu].j=a-> data[p].j;

c-> data[c-> tu++].v=col;

}

p++;

q++;

}

if ((a-> data[p].i==b-> data[q].i)&&(a-> data[k].j data[l].j))

{ c-> data[c-> tu].i=a-> data[p].i;

c-> data[c-> tu].j=a-> data[p].j;

c-> data[c-> tu++].v=a-> data[p].v;

p++;

}

if ((a-> data[p].i==b-> data[q].i)&&(a-> data[k].j >b-> data[l].j))

{ c-> data[c-> tu].i=a-> data[p].i;

c-> data[c-> tu].j=a-> data[p].j;

c-> data[c-> tu++].v=a-> data[p].v;

q++;

}

}

while (ptu)

{ c-> data[c-> tu].i=a-> data[p].i;

c-> data[c-> tu].j=a-> data[p].j;

c-> data[c-> tu++].v=a-> data[p].v;

p++;

}

while(qtu)

{ c-> data[c-> tu].i=b-> data[q].i;

c-> data[c-> tu].j=b-> data[q].j;

c-> data[c-> tu++].v=b-> data[q].v;

q++;

}

}

void Setmatrix(SPMatrix* p)

{

int n;

cout<<"请输入矩阵行数、列数及非0元个数"<

cin>>p->mu>>P->nu>>p->tu;

cout<<"三元组表"<

for(n=1;n<=p->tu;n++)

cin>>p->data[n].i>>p->data[n].j>>p->data[n].v;

}

void main()

{

spmatrix a;

spmatrix b;

int i,j,k = 1;

spmatrix *c;

Setmatrix(&a);

Setmatrix(&b);

c = addmatrix(&a,&b);

cout<<"三元组表c"<

for (i = 1; i <= c->mu; ++i)

{

for (j = 1;j <= c->nu ; ++j)

{

if (pc->data[k].i == i && pc->data[k].j == j)

{ cout<data[k].v);

k++;

}

}

}

free(c);

}

三、运行结果

四、总结

三元组存储的矩阵的加法关键在于算法的分析。而数据结构比较C语言层次性更强。写算法的时候不是很难,就是对主函数的写法有点模糊。总

体上讲,实践将理论具体化,也更容易进一步的学习。

数据结构实验五矩阵的压缩存储与运算学习资料

数据结构实验五矩阵的压缩存储与运算

第五章矩阵的压缩存储与运算 【实验目的】 1. 熟练掌握稀疏矩阵的两种存储结构(三元组表和十字链表)的实现; 2. 掌握稀疏矩阵的加法、转置、乘法等基本运算; 3. 加深对线性表的顺序存储和链式结构的理解。 第一节知识准备 矩阵是由两个关系(行关系和列关系)组成的二维数组,因此对每一个关系上都可以用线性表进行处理;考虑到两个关系的先后,在存储上就有按行优先和按列优先两种存储方式,所谓按行优先,是指将矩阵的每一行看成一个元素进行存储;所谓按列优先,是指将矩阵的每一列看成一个元素进行存储;这是矩阵在计算机中用一个连续存储区域存放的一般情形,对特殊矩阵还有特殊的存储方式。 一、特殊矩阵的压缩存储 1. 对称矩阵和上、下三角阵 若n阶矩阵A中的元素满足= (0≤i,j≤n-1 )则称为n阶对称矩阵。对n阶对称矩阵,我们只需要存储下三角元素就可以了。事实上对上三角矩阵(下三角部分为零)和下三角矩阵(上三角部分为零),都可以用一维数组ma[0.. ]来存储A的下三角元素(对上三角矩阵做转置存储),称ma为矩阵A的压缩存储结构,现在我们来分析以下,A和ma之间的元素对应放置关系。 问题已经转化为:已知二维矩阵A[i,j],如图5-1, 我们将A用一个一维数组ma[k]来存储,它们之间存在着如图5-2所示的一一对应关系。 任意一组下标(i,j)都可在ma中的位置k中找到元素m[k]= ;这里: k=i(i+1)/2+j (i≥j) 图5-1 下三角矩阵 a00 a10 a11 a20 … an-1,0 … an-1,n-1

k= 0 1 2 3 …n(n- 1)/2 …n(n+1)/2-1 图5-2下三角矩阵的压缩存储 反之,对所有的k=0,1,2,…,n(n+1)/2-1,都能确定ma[k]中的元素在矩阵A中的位置(i,j)。这里,i=d-1,(d是使sum= > k的最小整数),j= 。 2. 三对角矩阵 在三对角矩阵中,所有的非零元素集中在以主对角线为中心的带内状区域中,除了主对角线上和直接在对角线上、下方对角线上的元素之外,所有其它的元素皆为零,见图5-3。 图5-3 三对角矩阵A 与下三角矩阵的存储一样,我们也可以用一个一维数组ma[0..3n-2]来存放三对角矩阵A,其对应关系见图5-4。 a00 a01 a10 a11 a12 … an-1,n-2 an-1,n-1 k= 0 1 2 3 4 … 3n-3 3n-2 图5-4下三角矩阵的压缩存储 A中的一对下标(i,j)与ma中的下标k之间有如下的关系: 公式中采用了C语言的符号,int()表示取整,‘%’表示求余。

数据结构稀疏矩阵基本运算实验报告

课程设计 课程:数据结构 题目:稀疏矩阵4 三元组单链表结构体(行数、列数、头) 矩阵运算重载运算符优 班级: 姓名: 学号: 设计时间:2010年1月17日——2010年5月XX日 成绩: 指导教师:楼建华

一、题目 二、概要设计 1.存储结构 typedef struct{ int row,col;//行,列 datatype v;//非0数值 }Node; typedef struct{ Node data[max];//稀疏矩阵 int m,n,t;//m 行,n 列,t 非0数个数 … … 2.基本操作 ⑴istream& operator >>(istream& input,Matrix *A)//输入 ⑵ostream& operator <<(ostream& output,Matrix *A){//输出 ⑶Matrix operator ~(Matrix a,Matrix b)//转置 ⑷Matrix operator +(Matrix a,Matrix b)//加法 ⑸Matrix operator -(Matrix a,Matrix b)//减法 ⑹Matrix operator *(Matrix a,Matrix b)//乘法 ⑺Matrix operator !(Matrix a,Matrix b)//求逆 三、详细设计 (1)存储要点 position[col]=position[col-1]+num[col-1]; 三元组表(row ,col ,v) 稀疏矩阵((行数m ,列数n ,非零元素个数t ),三元组,...,三元组) 1 2 3 4 max-1

实现稀疏矩阵(采用三元组表示)的基本运算实验报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告 一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求: (1)生成如下两个稀疏矩阵的三元组 a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组; (3)输出a + b 的三元组; (4)输出 a * b 的三元组; 三实验内容: 稀疏矩阵的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; ai,j∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系: R={ Row , Col } Row ={ | 1≤i≤m , 1≤j ≤n-1} Col ={| 1≤i≤m-1,1≤j ≤n} 基本操作:

CreateSMatrix(&M) 操作结果:创建稀疏矩阵 M PrintSMatrix(M) 初始条件:稀疏矩阵M已经存在 操作结果:打印矩阵M DestroySMatrix(&M) 初始条件:稀疏矩阵M已经存在 操作结果:销毁矩阵M CopySMatrix(M, &T) 初始条件:稀疏矩阵M已经存在 操作结果:复制矩阵M到T AddSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q) 初始条件:稀疏矩阵M、N已经存在 操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T) 初始条件:稀疏矩阵M已经存在 操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q) 初始条件:稀疏矩阵M已经存在

数据结构课程设计-特殊矩阵计算器

特殊矩阵计算器 1、特殊矩阵计算器 问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。 ② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。③各运算若可行,则打印结果;若不可行,则给出提示信息。④各运算需自己实现,禁止调用语言内建或第三方类库的矩阵 API。 涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。 #include<> #include<> #define max 100 typedef struct{ int row,col;//定义矩阵行数、列数 int a[max][max]; }Matrix; //存储结构 typedef struct{ int array[max]; int n; //定义矩阵的阶 }M; Matrix A,B,C,D; M p; //*************矩阵的压缩存储*********************// int CompressMatrix(int m,int i,int j,int n){ int k;

if(m==1){ if(i<=j) k=(2*n-i+1)*i/2+(j-i)+1; else k=0; return k; } if(m==2){ if(i>=j) k=i*(i+1)/2+j+1; else k=0; return k; } if(m==3){ if(i>=j) k=i*(i+1)/2+j; else k=j*(j+1)/2+i; return k; } if(m==4){ if(i!=j) k=0; else k=i+1;

数据结构与算法 特殊矩阵和稀疏矩阵

常熟理工学院 《数据结构与算法》实验指导与报告书 _2017-2018_____学年第__1__ 学期 专业:物联网工程 实验名称:特殊矩阵和稀疏矩阵 实验地点: N6-210 指导教师:聂盼红 计算机科学与工程学院 2017

实验五特殊矩阵和稀疏矩阵 【实验目的】 1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址; 2、掌握对称矩阵的压缩存储表示; 3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。 【实验学时】 2学时 【实验预习】 回答以下问题: 1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。 若n阶矩阵A中的元素满足下述性质:a ij=a ji,则称为n阶对称矩阵。 sa[k]与矩阵元素a ij之间存在着一一对应的关系: 若i>=j,k=i*(i+1)/2+j; 若i

的关系。(注意C程序中,i,j,k均从0开始) (2)调试程序与运行。对称矩阵存储下三角部分即i>=j。 对称矩阵为3,9,1,4,7 9,5,2,5,8 1,2,5,2,4 4,5,2,1,7 7,8,4,7,9 参考程序如下: #include<> #define N 5 int main() { int upper[N][N]= {{3,9,1,4,7}, {9,5,2,5,8}, {1,2,5,2,4}, {4,5,2,1,7}, {7,8,4,7,9} }; /*对称矩阵*/ int rowMajor[15]; /*存储转换数据后以行为主的数组*/ int Index; /*数组的索引值*/ int i,j; printf("Two dimensional upper triangular array:\n"); for (i=0; i

数据结构三元组完成版

#include #include typedef int ElemType; // 稀疏矩阵的三元组顺序表存储表示 #define MAXSIZE 100 // 非零元个数的最大值 typedef struct { int i,j; // 行下标,列下标 ElemType e; // 非零元素值 }Triple; typedef struct { Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用 int mu,nu,tu; // 矩阵的行数、列数和非零元个数 }TSMatrix; // 创建稀疏矩阵M int CreateSMatrix(TSMatrix *M) { int i,m,n; ElemType e; int k; printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; // 为以下比较顺序做准备 for(i = 1; i <= (*M).tu; i++) { do { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu); scanf("%d,%d,%d",&m,&n,&e); k=0; // 行或列超出范围

if(m < 1 || m > (*M).mu || n < 1 || n > (*M).nu) k=1; if(m < (*M).data[i-1].i || m == (*M).data[i-1].i && n <= (*M).data[i-1].j) // 行或列的顺序有错 k=1; }while(k); (*M).data[i].i = m; //行下标 (*M).data[i].j = n; //列下标 (*M).data[i].e = e; //该下标所对应的值 } return 1; } // 销毁稀疏矩阵M,所有元素置空 void DestroySMatrix(TSMatrix *M) { (*M).mu=0; (*M).nu=0; (*M).tu=0; } // 输出稀疏矩阵M void PrintSMatrix(TSMatrix M) { int i; printf("\n%d行%d列%d个非零元素。\n",M.mu,M.nu,M.tu); printf("%4s%4s%8s\n", "行", "列", "元素值"); for(i=1;i<=M.tu;i++) printf("%4d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e); } // 由稀疏矩阵M复制得到T int CopySMatrix(TSMatrix M,TSMatrix *T) { (*T)=M; return 1; } // AddSMatrix函数要用到 int comp(int c1,int c2) { int i; if(c1

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵 一、问题描述 假若在n m ?阶中,有t 个元素不为零,令n m t ?=δ称为矩阵的稀疏因子。通常认为≤δ0.05时称为稀疏矩阵。稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。 二、基本要求 1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出; 2、编写算法,完成稀疏矩阵的转置操作; 3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作; 4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。 三、测试数据 1、转置操作的测试数据: ??????? ? ?00200013000010020100 2、相加操作的测试数据: ??????? ? ?002000130000100 20100 ??????? ??00200010000210030300 3、相乘操作的测试数据: ?????? ? ??000000030040 0021 ??????? ??001002000021 四、算法思想 1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。 2、稀疏矩阵转置的算法思想 将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。 3、稀疏矩阵相加的算法思想 比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。 4、稀疏矩阵相乘的算法思想 两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v和N.data[q].v 的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。为便于操作,应对每个元素设一累计和的变量,其初值是零,然后扫描数组M,求得相应元素的乘积并累加到适当的求累计和的变量上。由于T中元素的行号和M中元素的行号一致,又M中元素排列是以M的行序为主序的,由此可对T进行逐行处理,先求得累计求和的中间结果(T的一行),然后再压缩存储到Q.data中去。 五、模块划分 1、Status CreateM(TSMatrix *M, int a[],int row, int col),创立三元组; 2、void PrintM(TSMatrix M),按数组方式输出; 3、void PrintM3(TSMatrix M),按三元组方式输出; 4、Status TransposeSMatrix(TSMatrix M, TSMatrix *T),稀疏矩阵的转置; 5、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵加法; 6、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵相乘; 7、main(),主函数。 六、数据结构//(ADT) 1、三元组结构类型 typedef struct { int i,j; ElemType e; } Triple; 2、稀疏矩阵 typedef struct { Triple data[MAXSIZE+1];

稀疏矩阵的运算(完美版)

专业课程设计I报告(2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主

控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。 2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输

数据结构 创建一个三元组程序 C语言

数据结构创建一个三元组程序C语言 #include #include #define OK 1 #define ERROR 0 typedef int Status; typedef int ElemType; typedef ElemType *Triplet; Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3); Status DestroyTriplet(Triplet &T); Status get(Triplet T,int i,ElemType &e); Status put(Triplet &T,int i,ElemType e); Status IsAscending(Triplet T); Status IsDescending(Triplet T); Status Max(Triplet T,ElemType &e); Status Min(Triplet T,ElemType &e); void PrintE(ElemType e); void PrintT(Triplet T); int main() { Triplet T; int e; Status flag; flag = InitTriplet(T,90,95,100); if(flag) { printf("初始化成功!\nT中元素是:"); PrintT(T); } else { printf("初始化失败!"); } flag = get(T,1,e); if(flag) { printf("第1个元素的值为:%d\n",e);

数据结构矩阵的转置

/* c1.h (程序名) */ #include #include #include /* malloc()等*/ #include /* INT_MAX等*/ #include /* EOF(=^Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函数结果状态代码*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行*/ typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等*/ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ /* c5-2.h 稀疏矩阵的三元组顺序表存储表示*/ #define MAXSIZE 100 /* 非零元个数的最大值*/ typedef struct { int i,j; /* 行下标,列下标*/ ElemType e; /* 非零元素值*/ }Triple; typedef struct { Triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/ int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*/ }TSMatrix; /* bo5-2.c 三元组稀疏矩阵的基本操作,包括算法5.1(9个) */ Status CreateSMatrix(TSMatrix *M) { /* 创建稀疏矩阵M */ int i,m,n; ElemType e; Status k; printf("请输入矩阵的行数,列数,非零元素数:"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; /* 为以下比较顺序做准备*/ for(i=1;i<=(*M).tu;i++)

数据结构课后习题及解

数据结构课后习题及解析第五章

第五章习题 5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。已知A的基地址为 1000,计算: 数组A共占用多少字节; 数组A的最后一个元素的地址; 按行存储时元素A 36 的地址; 按列存储时元素A 36 的地址; 5.2 设有三对角矩阵A n×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= a ij , 求: (1)用i,j表示k的下标变换公式; (2)用k表示i,j的下标变换公式。 5.3假设稀疏矩阵A和B均以三元组表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放 结果矩阵。 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个 辅助向量空间。 5.5写一个在十字链表中删除非零元素a ij 的算法。 5.6画出下面广义表的两种存储结构图示: ((((a), b)), ((( ), d), (e, f))) 5.7求下列广义表运算的结果: (1)HEAD[((a,b),(c,d))]; (2)TAIL[((a,b),(c,d))]; (3)TAIL[HEAD[((a,b),(c,d))]]; (4)HEAD[TAIL[HEAD[((a,b),(c,d))]]]; (5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];

实习题 若矩阵A m×n 中的某个元素a ij 是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该 矩阵中的一个马鞍点。假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。 第五章答案 5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。 【解答】(1)k=2(i-1)+j (2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余) 5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。 【解答】算法(一) FastTransposeTSMatrix(TSMartrix A, TSMatrix *B) {/*把矩阵A转置到B所指向的矩阵中去,矩阵用三元组表表示*/ int col,t,p,q; int position[MAXSIZE]; B->len=A.len; B->n=A.m; B->m=A.n; if(B->len>0) { position[1]=1; for(t=1;t<=A.len;t++) position[A.data[t].col+1]++; /*position[col]存放第col-1列非零元素的个数, 即利用pos[col]来记录第col-1列中非零元素的个数*/ /*求col列中第一个非零元素在B.data[ ]的位置,存放在position[col]中*/ for(col=2;col<=A.n;col++) position[col]=position[col]+position[col-1]; for(p=1;p

数据结构三元组项目报告

数据结构项目报告 项目题目:三元组 项目成员: 日期:2012年4月1号 1.题目与要求 1.1问题提出 详细叙述本项目所要实现的问题是创建一个三元组并且实现一些有关三元组的操作。 1.2 本项目涉及的知识点 指针,数值,函数的调用 1.3功能要求 1创建一个三元组并且给它们赋值。 2如果三元组存在,把三元组释放并且赋空。 3根据给的一个位置,来找出三元组里面这个位置的值并且返回。 4判断三元组里面的值是否按递增排列. 5判断三元组里面的值是否按递减排列。 6求三元组里面数值的最大值. 7求三元组里面数值的最小值。 8根据给的一个位置,改变三元组这个位置的值。 2.功能设计 2.1总体设计 运用函数调用的方式将整个程序连接起来,使其变得完整,具体见代码。 2.2详细设计 本程序可分八个小模块。第1个小模块实现创建一个三元组并且给它们赋值;第2个小模块实现如果三元组存在,把三元组释放并且赋空;第3个小模块实现根据给的一个位置,来找出三元组里面这个位置的值并且返回;第个4小模块实现判断三元组里面的值是否按递增排列;第5个小模块实现判断三元组里面的值是否按递减排列;第个6小模块实现求三元组里面数值的最大值;第7个小模块实现求三元组里面数值的最小值;第8个小模块实现根据给的一个位置,改变三元组这个位置的值。 模块一:创建一个三元组并且给它们赋值,函数为Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3)

T是个整形二级指针,v1,v2,v3整形变量,通过(ElemType *)malloc(3*sizeof(ElemType))申请一个连续的空间给(*T),然后v1,v2,v3的值分别赋给它们。 模块二:如果三元组存在,把三元组释放并且赋空,函数为Status DestroyTriplet(Triplet *T) T是个整形二级指针,如果(*T)存在,则通过free()把它释放并且把它赋空。 模块三:根据给的一个位置,来找出三元组里面这个位置的值并且返回,函数为Status Get(Triplet T,int i,ElemType *e) T是个整形二级指针,整形i表示那个位置,*e表示要返回i位置的值,把(*T)【i-1】赋给*e。 模块四:判断三元组里面的值是否按递增排列,函数为Status IsAscending(Triplet T) T是个整形二级指针,判断它们一个是否比一个大。 模块五:判断三元组里面的值是否按递减排列,函数为Status IsDescending(Triplet T) T是个整形二级指针,判断它们一个是否比一个小。 模块六:求三元组里面数值的最大值,函数为Status Max(Triplet T,ElemType *e) T是个整形二级指针,*e是用来返回最大的值,通过一个一个的比较来实现 模块七:求三元组里面数值的最小值,函数为Status Min(Triplet T,ElemType *e) T是个整形二级指针,*e是用来返回最小的值,通过一个一个的比较来实现 模块八:根据给的一个位置,改变三元组这个位置的值,函数为Status Put(Triplet T,int i,ElemType e) T是个整形二级指针,整形i表示那个位置,*e表示要赋值给i位置的值,把*e赋给(*T)【i-1】。 3.项目总结与思考 完成这个项目,让我发现自己很容易犯一些小错误,例如用一个指针表示它所指向的值,容易丢失*,通过这项目让我了解二级指针的使用。 源程序如下: #include #include #include #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status; typedef int ElemType; typedef int *Triplet; Status InitTriplet(Triplet *T,ElemType v1,ElemType v2,ElemType v3) { (*T)=(ElemType *)malloc(3*sizeof(ElemType)); if(!(*T)) exit(OVERFLOW); (*T)[0]=v1;(*T)[1]=v2;(*T)[2]=v3; return OK; } Status DestroyTriplet(Triplet *T) { free((*T));

数据结构C语言版-稀疏矩阵的三元组顺序表存储表示和实现

typedef int ElemType; // 稀疏矩阵的三元组顺序表存储表示 #define MAXSIZE 100 // 非零元个数的最大值 typedef struct { int i,j; // 行下标,列下标 ElemType e; // 非零元素值 }Triple; typedef struct { Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用 int mu,nu,tu; // 矩阵的行数、列数和非零元个数 }TSMatrix; // 创建稀疏矩阵M int CreateSMatrix(TSMatrix *M) { int i,m,n; ElemType e; int k; printf("请输入矩阵的行数,列数,非零元素个数:(逗号)\n"); scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu); (*M).data[0].i=0; // 为以下比较顺序做准备 for(i = 1; i <= (*M).tu; i++) { do { printf("请按行序顺序输入第%d个非零元素所在的行(1~%d)," "列(1~%d),元素值:(逗号)\n", i,(*M).mu,(*M).nu); scanf("%d,%d,%d",&m,&n,&e); k=0; // 行或列超出范围 if(m < 1 || m > (*M).mu || n < 1 || n > (*M).nu) k=1; if(m < (*M).data[i-1].i || m == (*M).data[i-1].i && n <= (*M).data[i-1].j) // 行或列的顺序有错 k=1; }while(k);

数据结构(C语言版)第三版__清华大学出版社_习题参考答案

附录习题参考答案 习题1参考答案 1.1.选择题 (1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.) A. 1.2.填空题 (1). 数据关系 (2). 逻辑结构物理结构 (3). 线性数据结构树型结构图结构 (4). 顺序存储链式存储索引存储散列表(Hash)存储 (5). 变量的取值范围操作的类别 (6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系 (7). 关系网状结构树结构 (8). 空间复杂度和时间复杂度 (9). 空间时间 (10). Ο(n) 1.3 名词解释如下: 数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。 数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。 数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。 数据类型:是指变量的取值范围和所能够进行的操作的总和。 算法:是对特定问题求解步骤的一种描述,是指令的有限序列。 1.4 语句的时间复杂度为: (1) Ο(n2) (2) Ο(n2) (3) Ο(n2) (4) Ο(n-1) (5) Ο(n3) 1.5 参考程序: main() { int X,Y,Z; scanf(“%d, %d, %d”,&X,&Y,Z); if (X>=Y) if(X>=Z) if (Y>=Z) { printf(“%d, %d, %d”,X,Y,Z);} else { printf(“%d, %d, %d”,X,Z,Y);}

稀疏矩阵的运算(完美版)

专业课程设计I报告( 2011 / 2012 学年第二学期) 题目稀疏矩阵的转换 专业软件工程 学生姓名张鹏宇 班级学号 09003018 指导教师张卫丰 指导单位计算机学院软件工程系 日期 2012年6月18号

指导教师成绩评定表

附件: 稀疏矩阵的转换 一、课题内容和要求 1.问题描述 设计程序用十字链表实现稀疏矩阵的加、减、乘、转置。 2.需求分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 二、设计思路分析 (1)设计函数建立稀疏矩阵,初始化值。 (2)设计函数输出稀疏矩阵的值。 (3)构造函数进行两个稀疏矩阵相加,输出最终的稀疏矩阵。 (4)构造函数进行两个稀疏矩阵相减,输出最终的稀疏矩阵。 (5)构造函数进行两个稀疏矩阵的相乘,输出最终的稀疏矩阵。 (6)构造函数进行稀疏矩阵的转置,并输出结果。 (7)退出系统。 三、概要设计 为了实现以上功能,可以从3个方面着手设计。 1.主界面设计 为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。本系统主控菜单运行界面如图所示。

2.存储结构设计 本系统采用单链表结构存储稀疏矩阵的具体信息。其中:全部结点的信息用头结点为指针数组的单链表存储。 3.系统功能设计 本系统除了要完成稀疏矩阵的初始化功能外还设置了4个子功能菜单。稀疏矩阵的初始化由函数i typedef int ElemType 实现。建立稀疏矩阵用void Creat()实现,依据读入的行数和列数以及非零元素的个数,分别设定每个非零元素的信息。4个子功能的设计描述如下。 (1)稀疏矩阵的加法: 此功能由函数void Xiangjia( )实现,当用户选择该功能,系统即提示用户初始化要进行加法的两个矩阵的信息。然后进行加法,最后输出结果。 (2)稀疏矩阵的乘法: 此功能由函数void Xiangcheng( )实现。当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。然后进行相乘,最后得到结果。 (3)稀疏矩阵的转置: 此功能由函数void Zhuanzhi( )实现。当用户选择该功能,系统提示用户初始

数据结构(C语言版)三元组的基本操作

#include #include "h1.h" void main() { Triplet p; ElemType e,v1,v2,v3; int i; char select; printf("输入三个数,建立一个三元组\n"); scanf("%d%d%d",&v1,&v2,&v3); if (InitTriplet(p,v1,v2,v3)==OVERFLOW) printf("分配失败,退出程序!"); else do { printf("1:取三元组第i个元素\n"); printf("2:判断三元组元素是否递增\n"); printf("3:求最大值\n"); printf("4:置换第i个元素\n"); printf("0:结束!\n"); printf("请输入选择!\n"); getchar(); scanf("%c",&select); switch (select) {case '1': printf("\ni="); scanf("%d",&i); if (get(p,i,e)==ERROR) printf("i值不合法\n"); else printf("第%d个元素的值为:%d\n",i,e); break; case '2': if (IsAscend(p)==1) printf("三元组递增有序\n"); else printf("三元组非递增有序\n"); break; case '3': Max(p,e); printf("最大值是:%d\n",e);break; case '4': printf("\ni="); scanf("%d",&i); printf("\nx="); scanf("%d",&e); if (put(p,i,e)==ERROR) printf("i值不合法\n"); else printf("置换第%d个元素后的3个元素分别为:%d,%d,%d\n",i,p[0],p[1],p[2]);break; case '0':

数据结构矩阵相关操作的课程设计

课程设计 题目矩阵乘法 教学院计算机学院 专业09计算机科学与技术 班级 姓名 指导教师 年月日

目录 1 概述 (3) 2 设计目的 (3) 3 设计功能说明 (3) 4 详细设计说明 (3) 5 流程图 (4) 6 调试及结果 (5) 1程序调试 (5) 2运行编译连接过程......................................................... 5-8 7 总结 (9) 附录...........................................................................10-24 参考文献 (25) 成绩评定表 (26)

1 概述 数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。为学生后继课程的学习打下良好的基础。 2 设计目的 《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。促使学生养成良好的编程习惯。 1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。 2.培养学生综合运用所学知识独立完成程序课题的能力。 3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。 3 设计功能分析 本设计的功能如下: 1、对于用户给定的矩阵相乘可以进行存储,并且用户可以更改 2、根据用户的要求可以选择相应的功能加减乘及转置 3、然后显示用户输入的矩阵进行运算并得到结果后保存到文件 4 详细设计说明 本程序用数据存储的方式建立矩阵。然后用相加,减,乘,转置的方式计算出

相关主题
文本预览
相关文档 最新文档