数据结构实验五矩阵的压缩存储与运算
第五章矩阵的压缩存储与运算
【实验目的】
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()表示取整,‘%’表示求余。
二、稀疏矩阵
在m×n的矩阵中,有t个非零元。令δ= ,称δ矩阵的稀疏因子,常认为δ≤0.05时称为稀疏矩阵。稀疏矩阵在工程中有着大量的应用,不少工程问题都可以转化为对稀疏矩阵的计算问题。如何进行稀疏矩阵的压缩存储呢?
为节省存储空间,应只存储非零元素。除了存储非零元的值之外,还必须记下所在行和列的位置(i,j),即一个三元组(i,j, )唯一确定了矩阵A的一个非零元素。
1. 三元组顺序表
以顺序存储结构来表示三元组表,则可称稀疏矩阵的一种压缩存储方式。
//稀疏矩阵的三元组顺序表存储表示。
#define MaxSize 10 //用户自定义
typedef int Datatype; //用户自定义
typedef struct{ //定义三元组
int i; //非零元的行下标
int j; //非零元的列下标
Datatype v; //非零元的数据值
}TriTupleNode;
typedef struct{
TriTupleNode data[MaxSize]; //非零元的三元组表
int m,n,t; //矩阵行,列及三元组表长度
}TriTupleTable;
2. 十字链表
当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构来表示三元组的线性表,采用纵横交叉的十字链表就比较好。
在十字链表中,每个非零元可用一个含五个域的结点表示,其中i, j和e三个域分别表示该非零元所在的行、列和非零元的值,向右域right用以链接同一行中下一个非零元。向下域down用以链接同一列中下一个非零元。同一行中的非零元通过right域链接成一个线性链表,每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵构成了一个十字交叉的链表,故称这样的存储结构为十字链表,如图5-5所示。
图5-5 稀疏矩阵M的十字链表
typedef int Datatype; //用户自定义
typedef struct OLNode{
int i,j; //该非零元的行和列下标
Datatype v;
Struct OLNode *right,*down //该非零元所在行表和列表的后继链域
}OLNode;*OLink;
typedef struct {
OLink *rhead,*chead
int mu,nu,tu;
}CrossList;
第二节用三元组表实现稀疏矩阵的基本操作
【问题描述】用三元组表实现稀疏矩阵的按列转置。
【数据描述】
typedef int Datatype; //用户自定义
typedef struct
{ //定义三元组
int i,j; // 非零元素的行下标和列下标
Datatype v;
}TriTupleNode;
typedef struct{ //定义三元组表
TriTupleNode data[MaxSize];
int m,n,t; //矩阵行,列及三元组表长度
}TriTupleTable;
【算法描述】
按照列序来进行转置。为了找到每一列中所有的非零元素,需要对其三元组表从第一行起整个扫描一遍。Status TransposeSMatrix(TriTupleTable a, TriTupleTable &b){
b.m=a.n;b.n=a.m;b.t=a.t;
if(b.t){
q=0;
for(col=1;col<=a.n;++col)
for(p=0;p<=a..t;++p)
if(a.data[p].j==col){
b.data[q].i=a.data[p].j;b.data[q].j=a.data[p].i;
b.data[q].v=a.data[p].v;++q;}
}
return OK;
}
【C源程序】
#include
#include
#define Ok 1
#define Maxsize 10 //用户自定义三元组最大长度
typedef struct{ /*定义三元组表*/
int i,j;
int v;
}TriTupleNode;
typedef struct{ /*定义三元组表*/
TriTupleNode data[Maxsize];
int m;
int n;
int t; /*矩阵行,列及三元组表长度*/
}TriTupleTable;
void InitTriTupleNode (TriTupleTable *a){ /*输入三元组表*/ int i,j,k,val,maxrow,maxcol;
char contiue;
maxrow=0;
maxcol=0;
i=j=0;
k=0;
while(i!=-1&&j!=-1){ /*rol=-1&&col=-1结束输入*/
printf("input row \n");
scanf("%d",&i);
printf("input col \n");
scanf("%d",&j);
printf("input value\n");
scanf("%d",&val);
a->data[k].i=i;
a->data[k].j=j;
a->data[k].v=val;
if (maxrow
if (maxcol } a->m=maxrow;a->n=maxcol;a->t=k-1; } void showMatrix(TriTupleTable *a){ /*输出稀疏矩阵*/ int p,q; int t=0; for(p=1;p<=a->m;p++) {for(q=1;q<=a->n;q++) { if (a->data[t].i==p&&a->data[t].j==q) {printf("%d ",a->data[t].v); t++; } else printf("0 "); } printf("\n" ); } } TransposeSMatrix(TriTupleTable *a,TriTupleTable *b) {int q,col,p; b->m=a->n;b->n=a->m;b->t=a->t; if(b->t) {q=0; for(col=1;col<=a->n;++col) for(p=0;p if(a->data[p].j==col) { b->data[q].i=a->data[p].j; b->data[q].j=a->data[p].i; b->data[q].v=a->data[p].v;++q; } } void main( void) {TriTupleTable *a,*b; InitTriTupleNode(a); showMatrix(a); /*转置前*/ TransposeSMatrix(a,b); showMatrix(b); /*转置后*/ } 【测试数据】 输入:输出: 1 2 0 0 1 4 0 4 3 0 7 2 3 0 0 0 0 8 0 0 0 0 7 8 【说明】 分析算法,主要的工作是在p和col的两重循环中完成,算法的时间复杂度为O(n*t)。如果非零元素个数t 和m*n同数量级时,算法的时间复杂度变为O(m*n2)。 【实验题】 1. 稀疏矩阵按行序进行转置。 2. 两个稀疏矩阵的相加运算。 第三节十字链表表示稀疏矩阵的基本操作 【问题描述】两个相同行数和列数的稀疏矩阵用十字链表实现加法运算 【数据描述】 typedef struct ele {/* 十字链表结点类型*/ int row, col; double val; struct ele *right, *down; }eleNode; 【算法描述】 (1) 若q->j>v->j,则需要在C矩阵的链表中插入一个值为bij的结点,,修改v=v->right。 (2) 如q->j (3) 若q->j = = v->j且q->e + v->e ! = 0,则需要在C矩阵的链表中插入一个值为aij+bij的结点,修改q=q->right,v=v->right。 重复(1)--(3)完成一行的操作。修改p=p->down,u=u->down后,再继续下一行。【C源程序】 #include #include typedef struct ele {/* 十字链表结点类型*/ int row,col; int val; struct ele *right,*down; }eleNode; /*建立一个元素全为零的稀疏矩阵的十字链表*/ eleNode *createNullMat(int m,int n) / * m行n列 */ {eleNode *h,*p; int k; h=(eleNode *)malloc(sizeof(eleNode)); /*十字链表头结点 */ h->row=m;h->col=n;h->val=0; / * 行数、列数和非零元素个数 */ h->right=(eleNode *)malloc(sizeof(eleNode)*n); h->down=(eleNode *)malloc(sizeof(eleNode)*m); for(p=h->down,k=0;k p->col=1000; / * 设矩阵不会超过1000列 */ p->right=p; / * 每个行链表是一个环 * / p->down=k } for(p=h->right,k=0;k p->row=1000; / * 设矩阵不会超过1000行 * / p->down = p; / * 每个列链表是一个环 * / p->right = k<n-1 ? p+1 : h->right; / *使全部列链表头结点构成环 * / } return h; } // int insertNode(eleNode *a ,int row,int col,double val){ /* 在十字链表中插入一个结点*/ eleNode *p,*q,*r,*u,*v; if(row>=a->row||col>=a->col) return -2; / * 不合理的行列号 * / r=(eleNode *)malloc(sizeof(eleNode)); r->row=row;r->col=col;r->val=val; p=a->down+row;q=p->right; while(q->col if(q->col==col) return -1; / * 该行已有col列元素 * / u=a->right+col;v=u->down; while(v->row if(v->row==row) return -1; / * 该列已有row行元素 * / p->right = r; r->right = q; / * 插入到行链中 * / u->down = r; r->down = v; / * 插入到列链中 * / a->val=val; return 0; / * 插入成功 * / } eleNode *readMat(){ /*输入数据建立十字链表*/ eleNode *h; int i,j,m,n; int v; printf("输入稀疏矩阵的行数和列数"); scanf("%d%d",&m,&n); h=createNullMat(m,n); printf("输入有非零元素的行号"); scanf("%d",&i); while(i>=0) / * 逐行输入非零元素 * / { printf("输入非零元素的列号"); scanf("%d",&j); while(j>=0) / * 输入一行非零元素 * / { printf("输入非零元素的值"); scanf("%d",&v); insertNode(h,i,j,v); printf("输入当前行下一个非零元素的列号(-1表示当前行一组数据结束)");scanf("%d",&j); } printf("输入下一行有非零元素的行号(-1表示输入结束)"); scanf("%d",&i); } return h; } void showMat(eleNode *a) {int row,col,i,j; eleNode *p; row=a->row; col=a->col; for (i=0;i { p=a->down+i; p=p->right; for(j=0;j { if(p->row==i&&p->col==j) {printf("%d ",p->val);p=p->right;} else printf("0 "); } } } eleNode *matAdd(eleNode *a,eleNode *b) {eleNode *r,*p,*q,*u,*v; r=createNullMat(a->row,a->col); p=a->down;u=b->down; do { / * 逐行相加 * / q=p->right;v=u->right; while(q!=p||v!=u) / * 两矩阵中有一个一行未结束循环 */ if(q->col==v->col){ / * 有相同列的元素 * / if(q->val+v->val!=0) / * 和非零插入 * / insertNode(r,q->row,q->col,q->val+v->val); q=q->right;v=v->right; } else if(q->col insertNode(r,q->row,q->col,q->val); q=q->right; } else{ / * 插入b的元素 * / insertNode(r,v->row,v->col,v->val); v=v->right; } p=p->down;u=u->down; }while(p!=a->down); return r; } void main() { eleNode *a,*b,*c; printf("a\n"); showMat(a); b=readMat(); printf("b\n"); showMat(b); c= matAdd(a,b); printf("c\n"); showMat(c); } 【测试数据】 输入a 矩阵: 4 0 0 0 输入b矩阵: 0 1 0 1 输出:4 1 0 1 0 5 0 9 0 –5 0 0 0 0 0 9 0 0 1 0 1 0 9 0 1 0 10 0 输入数据注意事项: (1)如上面a矩阵,应输入3行4列 (2)若某行有非零元素,则按下列格式(三元组格式)输入: 行号列号值列号值…列号值 -1,如a矩阵的第0行,应输入0 0 4 -1,最后的-1表示该行的一组数据输入结束。 (3)按以上格式逐行地输入数据,直到输入的行号的值为-1时,表示稀疏矩阵的全部数据输入结束。【说明】 从一个结点来看,进行比较、修改指针所需的时间是一个常数;整个运算过程在于对A和B的十字链表逐行扫描,其循环次数主要取决于A和B矩阵中非零元素的个数ta和tb;由此算法的时间复杂度为O(ta+tb)。【实验题】 1. 设矩阵采用十字链表存结构,试编写下列程序实现下列运算: del(hm,i,j,x) 删除第i行第 j列的结点。 revise(hm,i,j) 修改第i行第 j列的结点的数据值。 2. 上述例子采用的是新开辟c十字链表存放a矩阵和b矩阵之和,试用a存放a矩阵和b矩阵之和,改写上述例子。 第四节思考题 1. 假设稀疏矩阵A的大小是m×n,稀疏矩阵B的大小是n×1(一维向量),A和B均采用三元组表示,编程实现C=A×B,其结果C也采用三元组表形式输出。 【简要分析】本题的关键是要确定i行j列的元素在三元组表中的位置,由于B是一个一维向量,在用三元组表进行矩阵相乘时并不方便,可以先将B做转置存放后,一遍扫描A就可以实现乘法。 2.如果矩阵A中存在这样的一个元素A[i][j]满足以下条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称A[i][j]为矩阵A的一个鞍点;假设稀疏矩阵A(大小是m×n)已经用三元组表存放,编程实现求鞍点的算法,如果没有鞍点,也给出相应信息。 【简要分析】如果A采用二维数组存放,本题的解法是很容易的,只需要求出每行的最小元素,放入 min[0..m-1]中,再求出每列的最大元,放入max[0..n-1]之中,如果某元素A[i][j],既在min[i]中,又在max[j]中,则A[i][j]必是鞍点。对三元组存放的A,在求max数组时会有一些困难,可参考教材,增设一个cpot数组和一个num数组,用来记录A的列元素。 Chapter Five Compressed storage for Matrix and its algorithms Objectives 1. To understand implementation of two structures of sparse matrix, For example, Triple_Tuple_Tabl e and Cross-List. 2. To understand basic computation of addition, transformation, and multiplication for sparse matrix. 3. To be able to understand the structure of Order_List and Link_List in Linear_List. 暨南大学本科实验报告专用纸 课程名称数据结构实验成绩评定 实验项目名称习题6.37 6.38 6.39 指导教师孙世良 实验项目编号实验8 实验项目类型实验地点实验楼三楼机房学生姓名林炜哲学号2013053005 学院电气信息学院系专业软件工程 实验时间年月日午~月日午温度℃湿度(一)实验目的 熟悉和理解二叉树的结构特性; 熟悉二叉树的各种存储结构的特点及适用范围; 掌握遍历二叉树的各种操作及其实现方式。 理解二叉树线索化的实质是建立结点与其在相应序列中的前去或后继之间的直接联系,熟练掌握二叉树的线索化的过程以及在中序线索化树上找给定结点的前驱和后继的方法。 (二)实验内容和要求 6.37试利用栈的基本操作写出先序遍历的非递归形式的算法。 6.38同题6.37条件,写出后序遍历的非递归算法(提示:为分辨后序遍 历时两次进栈的不同返回点需在指针进栈时同时将一个标志进栈)。 6.39假设在二叉链表的结点中增设两个域:双亲域以指示其双亲结点; 标志域以区分在遍历过程中到达该结点时应继续向左或向右或访问该节点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。(三)主要仪器设备 实验环境:Microsoft Visual Studio 2012 (四)源程序 6.37: #include 数据结构实验五矩阵的压缩存储与运算 第五章矩阵的压缩存储与运算 【实验目的】 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()表示取整,‘%’表示求余。 实验报告 课程名称数据结构实验名称查找与排序的实现 系别专业班级指导教师11 学号实验日期实验成绩 一、实验目的 (1)掌握交换排序算法(冒泡排序)的基本思想; (2)掌握交换排序算法(冒泡排序)的实现方法; (3)掌握折半查找算法的基本思想; (4)掌握折半查找算法的实现方法; 二、实验内容 1.对同一组数据分别进行冒泡排序,输出排序结果。要求: 1)设计三种输入数据序列:正序、反序、无序 2)修改程序: a)将序列采用手工输入的方式输入 b)增加记录比较次数、移动次数的变量并输出其值,分析三种序列状态的算法时间复杂 性 2.对给定的有序查找集合,通过折半查找与给定值k相等的元素。 3.在冒泡算法中若设置一个变量lastExchangeIndex来标记每趟排序时经过交换的最后位置, 算法如何改进? 三、设计与编码 1.本实验用到的理论知识 2.算法设计 3.编码 package sort_search; import java.util.Scanner; public class Sort_Search { //冒泡排序算法 public void BubbleSort(int r[]){ int temp; int count=0,move=0; boolean flag=true; for(int i=1;i 数据结构实验五图子系统 实验五 实验题目:图子系统 指导老师:王春红 专业班级:计算机科学与技术系1105班姓名:李慧2011100521杜丽20111005122 白莹2011100523王媛2011100529 2013年 5月23日 实验类型综合实验室_软件实验室一__ 一、实验题目 1 图子系统 二、实验目的和要求 ,(掌握图的存储思想及其存储实现 ,(掌握图的深度、广度优先遍历算法思想及其程序实现 ,(掌握图的常见应用算法的思想及其程序实现。三、实验内容 实验内容二:所有顶点对的最短路径 1(设置4个村庄之间的交通,村庄之间的距离用各边上的权值来表示。现在要求从这4个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院最近。 2(设计分析 用有向加权图表示的交通图中,有向边 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include 实验报告五查找(学科:数据结构) 姓名单位班级学号实验日期成绩评定教师签名批改日期 实验名称:实验五查找 5.1 折半查找 【问题描述】 某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。 【基本信息】 (1)建立现有学生信息表,平均成绩已有序。 (2)输入插入学生的记录信息。 (3)用折半查找找到插入位置,并插入记录。 【测试数据】 自行设计。 【实验提示】 (1)用结构数组存储成绩信息表。 (2)对记录中的平均成绩进行折半查找。 【实验报告内容】 设计程序代码如下: #include low=1; hight=n; strcpy(y,s[0].name ); x=s[0].avg ; while(low<=hight) { mid=(low+hight)/2; if(x>s[mid].avg ) hight=mid-1; else low=mid+1; } for(k=0;k 1. 实验步骤: 先定义顺序表的结点: typedef struct { KeyType key; InfoType otherinfo; }ElemType; typedef struct { ElemType *R; int length; }SqList; 然后定义一个随机取数的函数,存到顺序表中: void CreateList(SqList &L,int n) 然后定义一个显示顺序表的函数,将顺序表中的数据显示出来: void ListTraverse(SqList L) 然后通过排序函数,将所有的数据按照从大到小的顺序排列: void BubbleSort(SqList &L) 实验结果: 测试数据: 38 86 9 88 29 18 58 27 排序后: 9 18 27 29 38 58 86 88 BubbleSort排序方法中数据的比较次数为:27 疑难小结: 这个程序的难点在于排序函数,总是把从第几个数开始排序以及怎样循环弄错。 源代码: #include #include 实验五 查找算法实现 1、实验目的 熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。 2、问题描述 查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。 3、基本要求 (1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。 (2)根据给定的数据建立平衡二叉树。 4、测试数据 随即生成 5、源程序 #include<> #include<> #include<> #define EQ(a,b) ((a)==(b)) #define LT(a,b) ((a)<(b)) #define LQ(a,b) ((a)>(b)) typedef int Keytype; typedef struct { Keytype key; //关键字域 }ElemType; typedef struct BSTnode { ElemType data; int bf; struct BSTnode *lchild,*rchild; }BSTnode,*BSTree; void InitBSTree(BSTree &T) {T=NULL; } void R_Rotate(BSTree &p) {BSTnode *lc; lc=p->lchild; p->lchild=lc->rchild; lc->rchild=p; p=lc; } void L_Rotate(BSTree &p) {BSTnode *rc; rc=p->rchild; p->rchild=rc->lchild; 《数据结构与算法分析》 实验报告书 学期:2014 - 2015 学年第 2 学期 班级:信息管理与信息系统2班 学号: 1310030217 姓名:田洪斌 实验类别:(★)基础型()设计型 实验时间: 成绩: 信息管理系 一、实验内容 实现程序,按满二叉树给元素编号并输入的方式构造二叉树。 二、实验目的 1、掌握二叉树的静态及操作特点; 2、掌握二叉树的各种遍历方法; 3、掌握二叉树的存储、线索化等在C语言环境中的实现方法; 4、掌握哈夫曼树的构造方法及编码方法。 三、需求分析 用二叉树结构表示来完成输入、编辑、调试、运行的全过程。并规定: a.手动输入数字建立二叉树 b.程序可以输入、调试、运行、显示、遍历 c.测试数据:用户手动输入的数据 四、系统设计 1.数据结构设计 在本程序中对二叉树的存储主要用的是顺序存储结构,将二叉树存储在一个一维数组中。数据的输入输出都是采用整型数据进行。在主函数中只是定义数据类型,程序的实现功能化主要是在主函数中通过给要调用的函数参数来实现程序要求的功能。 2.程序结构设计 (1)程序中主要函数功能: main()/////////////////////////////////////////////主函数 menu()/////////////////////////////////////////////菜单 BiTree CreateBiTree()///////////////////////先序建立二叉树 (2)函数调用关系 见图4-1。 图4-1 函数关系图 五、 调试分析 1.算法和函数中出现了一些系统无法识别的变量,照成程序出现了错 误。原因是没有注意算法与源程序的区别。算法是简单的对源程序进行描述 的,是给人阅读的,所以有些变量没有定义我们就能看懂。而程序中的变量一定要先定义才能够被引用,才能被计算机识别。 2.在调试过程中遇到问题是利用C++程序进行调试的,找出错误并改正。 3.数据输出函数运行不正常,经检查程序,发现是定义错误,更改后错误排除; 六、 测试结果 1.运行时输入正确密码进入主界面,系统根据输入的数字选项来调用相应的函数。主要实现“功能选择”的界面,在这个界面里有显示系统的五大功能,根据每个功能前面的序号进行选择。以下为该界面: main BiTree CreateB iTree() meun() 数据结构与算法课程实验报告实验五:图的相关算法应用 姓名:cll 班级: 学号: 【程序运行效果】 一、实验内容: 求有向网络中任意两点之间的最短路 实验目的: 掌握图和网络的定义,掌握图的邻接矩阵、邻接表和十字链表等存储表示。掌握图的深度和广度遍历算法,掌握求网络的最短路的标号法和floyd算法。 二、问题描述: 对于下面一张若干个城市以及城市间距离的地图,从地图中所有可能的路径中求出任意两个城市间的最短距离及路径,给出任意两个城市间的最短距离值及途径的各个城市。 三、问题的实现: 3.1数据类型的定义 #define MAXVEX 50 //最大的顶点个数 #define MAX 100000 typedef struct{ char name[5]; //城市的名称 }DataType; //数据结构类型 typedef struct{ int arcs[MAXVEX][MAXVEX]; //临接矩阵 DataType data[MAXVEX]; //顶点信息 int vexs; //顶点数 }MGraph,*AdjMetrix; //邻接矩阵表示图 3.2主要的实现思路: 用邻接矩阵的方法表示各城市直接路线的图,之后用Floyd算法求解两点直接的最短距离,并用递归的方法求出途经的城市。 主要源程序代码: #include 数据结构课程实验报告-实验5 HUNAN UNIVERSITY 课程实习报告 题目:四则运算表达式求值 学生姓名康小雪 学生学号 20090810310 专业班级计科三班 指导老师李晓鸿 完成日期2010-10-24 一、需求分析 1.该程序可以从通过从键盘输入一个中缀表达式,判断该表达式是否合法,若合法将 其转化为后缀表达式,并计算其结果,否则说明该表达式错误 2..输入的表达式包含数字和运算符及括号,之间用空格隔开 3.数字可以为整数和小数 4.运算结果保留两位小数 输入输出举例 输入:21+23*(12-6) 输出:21 23 12 6 -*+ 二、概要设计 在表达式中每个运算符应对应两个操作数,与二叉树中非叶子结点和叶子结点之间的关系刚好相同,于是,本题可采用二叉树来将中缀表达式变为后缀表达式。 最后用堆栈来实现后缀表达式的计算。 抽象数据类型 二叉树 ADT BiTree { 数据对象D:D是具有相同特性的数据元素集合 数据关系R: 若D为空集,则R为空集,则称BinaryTree 为空二叉树; 若D不为空集,否则R={H},H是如下二元关系: (1)在D中存在唯一的称为根的数据元素root,它在关系H下无前驱; (2)若D-{root}≠空集,则存在D-{root}的一个划分{D1,Dr} 且D1∩Dr=空集; (3)若D1≠空集,则D1中存在唯一元素x1, 第五章矩阵的压缩存储与运算 【实验目的】 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. 三对角矩阵 实验三的实验报告 学期: 2010 至_2011 第 2 学期 2011年 3月 27日课程名称: 数据结构专业:信息与计算科学 09 级5班实验编号: 03 实验项目:栈和队列实验指导教师 _冯山_姓名:朱群学号: 2009060548 实验成绩: 一实验目的: (1)熟练掌握栈和队列的抽象数据类型及其结构特点; (2)实现基本的栈和队列的基本操作算法程序。 二实验内容:(类C算法的程序实现,任选其一) (1) 设计与实现基本的堆栈和队列结构下的各种操作(如堆栈的PUSH、POP 等操作)(必做); (2)以表达式计算为例,完成一个可以进行算术表达式计算功能的算法设计 与实现(选做); (3)以迷宫问题为例,以堆栈结构完成迷宫问题的求解算法和程序(选做)。三实验准备: 1) 计算机设备;2)程序调试环境的准备,如TC环境;3)实验内容的算法分 析与代码设计与分析准备。 四实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 五实验过程 一设计与实现基本的堆栈结构下的各种操作(如堆栈的PUSH、POP等操作)(1)问题描述 实现堆栈各种基本操作,如Pop,Push,GetTop等操作,即输入数据,通过Push入栈,再通过Pop操作输出出栈的元素,即入栈a,b,c,d,出栈d,c,b,a (2)算法实现及基本思想 堆栈是后进先出的线性表,由Push输入元素,Pop输出元素,堆栈的Push 操作思想,即插入元素e为新的的栈顶元素,先判断栈满与否,追加存储空间,然后将e值赋给栈顶指针Top。输入数据时用for循环 堆栈的Pop操作思想,先判断栈是否为空,若栈不空,则删除栈的栈顶元素,用e返回其值, (3)数据结构 栈的顺序存储结构 Typedef struct { 合肥师范学院实验报告册 2013 / 2014 学年第2 学期 系别计算机科学与技术系 实验课程数据库原理 专业计算机软件 班级软件一班 姓名周锦 学号1210431081 指导教师潘洁珠 实验一——数据库基本操作 一、实验目的 1.熟悉MS SQL SERVER运行界面,掌握服务器的基本操作。 2.掌握界面操作方法完成用户数据库建立、备份和还原。 3.建立两个实验用的数据库,使用企业管理器和查询分析器对数据库和表进行基本操作。 二、实验预习内容 在认真阅读教材及实验指导书的基础上,上机前请预习以下内容,并在空白处填写相应的步骤或命令。 1.熟悉SQL SERVER 2000 的运行环境,练习服务器基本操作:打开、停止、关闭。 2.使用SQL SERVER 2000 中的企业管理器完成以下任务。 数据库名称:STC 表:STU(sno char(9), sname varchar(50), ssex char(2) , sage int, sdept char(2) ); COUTSES(cno char(3), cname varchar(50), cpno char(3), credit int ); SC(sno char(9), cno char(3), grade int ); 说明:以上为表结构,以sno char(9)为例,说明sno属性设置为字符类型,宽度为9,int指整型数据。 1)建立数据库STC,分别建立以上三张表,并完成数据录入。(表结构及数据参见教材) 建立数据库:数据库→右击鼠标→新建数据库,出现如上图所示的框,然后填上所建数据库的名称。 数据结构上机实验(五)递归 班级:学号:姓名: 上机时间:地点: 一、实验目的 1.理解递归的定义和递归模型。 2.掌握递归设计的一般方法,能用递归算法解决一些较复杂应用问题。 二、实验内容 1.编写程序求解皇后问题 要求:(1)皇后的个数n由用户输入,其值不能超过20; (2)采用递归方法求解。 2.编写一个程序求解背包问题 三、实验过程 1.了解常用函数所在的头文件 stdlib.h stdlib 头文件里包含了C语言的一些函数 该文件包含了的C语言标准库函数的定义 stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。 conio.h conio.h不是C标准库中的头文件。 conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。 &表示引用传递。在函数参数表中,出现带&这个的形参,表示引用传递。2.程序实现(以下代码仅起参考作用) (1)求解皇后问题 #include 为了节省存储空间并且加快处理速度,需要对这类矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。 一、相关概念 ㈠特殊矩阵:矩阵中存在大多数值相同的元,或非0元,且在矩阵中的分布有一定规律。 ⒈对称矩阵:矩阵中的元素满足 a ij=a ji 1≤i,j≤n ⒉三角矩阵:上(下)三角矩阵指矩阵的下(上)三角(不包括对角线)中的元素均为常数c或0的n阶矩阵。 ⒊对角矩阵(带状矩阵):矩阵中所有非0元素集中在主对角线为中心的区域中。 ㈡稀疏矩阵:非0元素很少(≤ 5%)且分布无规律。 二、存储结构及算法思想 1、对称矩阵 存储分配策略:每一对对称元只分配一个存储单元,即只存储下三角(包括对角线)的元, 所需空间数为: n(n+1)/2。 存储分配方法:用一维数组sa[n(n+1)/2]作为存储结构。 sa[k]与a ij之间的对应关系为: 2、三角矩阵 也是一个n阶方阵,有上三角和下三角矩阵。下(上)三角矩阵是主对角线以上(下)元素均为零的n阶矩阵。设以一维数组sb[0..n(n+1)/2]作为n阶三角矩阵B的存储结构,仍采用按行存储方案,则B中任一元素b i,j和sb[k]之间仍然有如上的对应关系,只是还需要再加一个存储常数c的存储空间即可。如在下三角矩阵中,用n(n+1)/2的位置来存储常数。 对特殊矩阵的压缩存储实质上就是将二维矩阵中的部分元素按照某种方案排列到一维数组中,不同的排列方案也就对应不同的存储方案 2、稀疏矩阵 常见的有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。 1)、三元组表示法 三元组表示法就是在存储非零元的同时,存储该元素所对应的行下标和列下标。稀疏矩阵中的每一个非零元素由一个三元组(i,j,a ij)唯一确定。矩阵中所有非零元素存放在由三元组组成的数组中。 《数据结构》实验报告 班级:10011006 姓名:刘恋学号:2010302521 E-mail:_1020383169@https://www.360docs.net/doc/3313067184.html,日期:12.21 ◎实验题目: 图的结构建立和最短路径算法 ◎实验内容: 利用邻接矩阵构造图,并求出某一顶点到其余顶点的最短路径并打印输出。 一、需求分析 1、本实验中,以计算机和用户的对话形式进行。 2、程序所执行的命令有: 构造顶点关系和边的存储结构;初始图的结构;详图中插入元素;查找元素在图顶点中的位置;创建邻接表;查找最短路径;输出。 3、显示界面: 二概要设计 为了实现上述操作,应以链栈为存储结构。 1. 基本操作: void InitGraph(MGraph *G) void InsertGreph(MGraph *G,int i,VertexType e) 插入元素 int LocateVex(MGraph G,VertexType v1) 确定元素位置 void CreatGraph(MGraph *G) 构建邻接矩阵 void ShortestPath(MGraph G,int v0,int **p,int *D) 查找最短路径 void Print(MGraph G) 输出邻接矩阵 三详细设计 1.元素类型,结构定义 typedef struct AreCell { int adj; //权值 }AreCell,**AdjMatrix; typedef struct type { char data[3];//顶点值 }VertexType; typedef struct { VertexType *vexs;//顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum;//定点个数,弧的条数 }MGraph; 2.各模块分析: (1)主函数模块 int main() { MGraph G; VertexType e; int i,j; int **p; 数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"< 《数据结构》实验报告 实验序号:5 实验项目名称:队列的操作学号姓名专业、班 实验地点指导教师实验时间 一、实验目的及要求 1. 熟悉队列的基本概念; 2. 掌握队列的链式表存储结构; 3.掌握队列的应用。 二、实验设备(环境)及要求 微型计算机; windows 操作系统; Microsoft Visual Studio 6.0集成开发环境。 三、实验内容与步骤 1.C++的库函数中已经实现了队列,引用方法为#include //用 e 返回其值,并返回OK;否则返回ERROR QueuePtr p; if (Q.front == Q.rear) return ERROR; p = Q.front->next; e = p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; free (p); return OK; } int main() { int i,n=10; QElemType e; LinkQueue Q; InitQueue(Q); //初始化队列 printf("元素入队"); for(i=0;i数据结构实验8实验报告
数据结构实验五矩阵的压缩存储与运算学习资料
数据结构实验五-查找与排序的实现
数据结构实验五图子系统
数据结构实验报告
数据结构实验报告5(电大)
数据结构实验五
三角矩阵在压缩存储下的转置矩阵源代码
数据结构实验——查找算法的实现
数据结构实验五A
数据结构-实验五-图
数据结构课程实验报告-实验5
数据结构实验五矩阵的压缩存储与运算
数据结构 实验报告三
数据结构实验报告3543435
数据结构上机实验5
矩阵压缩1
数据结构实验报告5
数据结构实验报告全集
数据结构实验5 (1)