数据结构实验三

数据结构实验三
数据结构实验三

实验报告

学院(系)名称:计算机科学与工程学院

姓名赵振宇学号20175302

专业

计算机科学与技术

班级

2017级4班实验项目

实验三:图的遍历与应用

课程名称

数据结构与算法

课程代码

0661913

实验时间

2019年5月27日

第3、4节

实验地点

7-219

考核标准实验过程25分

程序运行20分

回答问题15分

实验报告30分

特色功能5分

考勤违纪情况5分

成绩

成绩栏

其它批改意见:

教师签字:

考核内容

评价在实验课堂中的表现,包括实验态度、编写程序过程等内容等。

□功能完善,□功能不全□有小错□无法运行

○正确○基本正确○有提示○无法回答

○完整○较完整

○一般

○内容极少○无报告

○有

○无

○有

○无一、实验目的

1、实验目的:通过实验使学生理解图的主要存储结构,掌握图的构造算法、图的深度优先和广度优先遍历算法,能运用图解决具体应用问题。

二、实验题目与要求

要求:第1题为必做题,2,3,4至少选一

1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。

1)问题描述:在主程序中设计一个简单的菜单,分别调用相应的函数功能:1…图的建立2…深度优先遍历图3…广度优先遍历图0…结束

2)实验要求:在程序中定义下述函数,并实现要求的函数功能:CreateGraph():按从键盘的数据建立图

DFSGrahp():深度优先遍历图

BFSGrahp():广度优先遍历图

3)实验提示:

图的存储可采用邻接表或邻接矩阵;

图存储数据类型定义(邻接表存储)

#define MAX_VERTEX_NUM8//顶点最大个数

typedef struct ArcNode

{int adjvex;

struct ArcNode*nextarc;

int weight;//边的权

}ArcNode;//表结点

#define VertexType int//顶点元素类型

typedef struct VNode

{int degree,indegree;//顶点的度,入度

VertexType data;

ArcNode*firstarc;

}Vnode/*头结点*/,AdjList[MAX_VERTEX_NUM];

typedef struct{

AdjList vertices;

int vexnum,arcnum;//顶点的实际数,边的实际数}ALGraph;

4)注意问题:

注意理解各算法实现时所采用的存储结构。

注意区别正、逆邻接。

2.教学计划编制问题

1)问题描述:软件专业的学生要学习一系列课程,其中有些课程必须在其先修课完成后才能学习。

2)实验要求:假设每门课程的学习时间为一个学期,试为该专业的学生设计教学计划,使他们能在最短时间内修完专业要求的全部课程。

3)实现提示:

?以顶点代表课程,弧代表课程的先后修关系,按课程先后关系建立有向无环图。

?利用拓扑排序实现。

3.给定实际背景,解决最短路径问题

1)问题描述:假设以一个带权有向图表示某一区域的公交线路网,图中顶点代表一些区域中的重要场所,弧代表已有的公交线路,弧上的权表示该线路上的票价(或搭乘所需时间),试设计一个交通指南系统,指导前来咨询者以最低的票价或最少的时间从区域中的某一场所到达另一场所。

2)实验要求:利用Dijkstra算法求最低的票价

3)实现提示:

?该问题可以归结为一个求带权有向图中顶点间最短路径的问题。

?建立以票价为权的有向图,再利用Dijkstra算法求最短路径及其路径长度。

4.利用最小生成树算法解决通信网的总造价最低问题

1)问题描述:若在n个城市之间建通信网络,架设n-1条线路即可。如何以最低的经济代价建设这个通信网,是一个网络的最小生成树问题。

2)实验要求:利用Prim算法求网的最小生成树。

3)实现提示:通信线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无向网。为简单起见,图的顶点数不超过10个,网中边的权值设置成小于100。

数据结构为:

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

本题依旧采用的是邻接矩阵来存储图,用一个一维数组vertex来存放顶点本身,用一个二维数组adj来表示各个顶点之间的邻接关系。

拓扑排序。首先增设一个一维数组indegree来存放每一个顶点的入度。入度为零表示没有前驱节点,删除该顶点以及它的出弧就等价于弧头顶点的入度减1。要实现拓扑算法可以借助堆栈,凡是网中入度为零的顶点都将其进栈。具体步骤为:1)将没有前驱结点(入度为零)的顶点进栈;2)从栈中退出栈顶元素输出,并把该顶点引出的所有弧删去,即把它的各个邻接点的入度减1,同时将当前已输出的顶点个数加1;3)将新的入度为零的顶点再进栈;4)重复2)、3)两步,直到栈空为止。此时或者已输出全部顶点,或者剩下的顶点没有入度为零的顶点。

栈在这里的作用只是保存当前入度为零的顶点,并使之处理有序。

测试结果:

3.给定实际背景,解决最短路径问题。

数据结构为:

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

本题还是采用的是邻接矩阵来存储图,用一个一维数组vertex来存放顶点本身,用一个二维数组adj来表示各个顶点之间的邻接关系,二维数组的值表示权值。

Dijkstra算法。为了球最短路径采用三个数组:1)S数组,S[i]=0表示顶点i未进入S 集合,S[i]=1表示顶点i已进入S集合;2)dist[i]表示当前已知的从源点到顶点i的最短路径长度;3)path[i]表示在当前已知的从源点到顶点i的最短路径上,i前面的那个顶点的下标。把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径,就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S 中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

测试结果:

4.利用最小生成树算法解决通信网的总造价最低问题。

数据结构为:

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

本题仍然采用的是邻接矩阵来存储图,用一个一维数组vertex来存放顶点本身,用一个二维数组adj来表示各个顶点之间的邻接关系,二维数组的值表示权值。

Prim算法。在图中任取一个顶点k作为起始点,令U={k},以后每一步从一个顶点在U 中,而另一个顶点不在U中的各条边中选择权值最小的边,把它作为最小生成树的边保存起来,并将它的顶点加入集合U中。如此继续下去,直到网络中的所有顶点都加入到生成树顶点集合U中为止。

为实现Prim算法,需设置一个辅助数组closedge,以记录从U到V-U具有最小权值的边。对每个顶点v属于V-U,在辅助数组中存在一个相应分量closedge[v],它包括两个域,其中lowcost域用来保存集合U中各顶点与该顶点构成的边中具有最小权值的边的权值。即closedge[v].lowcost=min{w

|u∈U}。假设初始状态时U={k}(k为出发的顶点),这时有

uv

closedge[k].lowcost=0,表示顶点k已加人集合U中。然后不断选取权值最小的边(v,u)(u ∈U,v∈V-U),每选取一条边,就将closedge[v].lowcost置为0,表示顶点v加入集合U。由于顶点v从集合V-U进人集合U后,这两个集合的内容发生了变化,就需要依据新的情况更新每一个不属于U集的顶点的lowcost值。然后再选取出lowcost值最小的顶点加人集合U,依次类推,直至所有顶点都加入集合U为止。

测试结果:

四、收获与体会

通过本次实验,加深了对图的基本了解,同时也练习了对图的一些操作,如:以邻接矩阵方式来存储建立图;深度优先搜索遍历图和广度优先搜索遍历图;拓扑排序;Dijkstra算法以及Prim算法等。对图的理解诶以及基本运用有了些许了解。

五、源代码清单

1.输入指定的边数和顶点数建立图,并输出深度优先遍历和广度优先遍历的结果。

#include

#include

#include

#define MAX_VERTEX_NUM20

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];

int adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

}Graph;

typedef struct QNode//结点结构

{

int data;

struct QNode*next;

}QNode,*QueuePtr;

/*队列的数据结构*/

typedef struct

{

int elem[MAX_VERTEX_NUM];

int front,rear;

}Queue;

Graph G;

int visited[MAX_VERTEX_NUM];

Graph CreateAG(int n,int m)

{

int i=0,j=0,a=0,b=0;

for(i=0;i

{

G.vertex[i]=i+1;

}

for(i=0;i

for(j=0;j

{

G.adj[i][j]=0;

}

for(i=0;i

{

scanf("%d%d",&a,&b);

G.adj[a-1][b-1]=G.adj[b-1][a-1]=1;

}

return G;

}

/*深度优先遍历*/

int count=0;

void DFS(int i,int n)

{

count++;

visited[i]=1;

printf("%d",G.vertex[i]);

if(count

printf("");

for(int j=0;j

if(G.adj[i][j]&&(!visited[j]))

DFS(j,n);

}

/*入队列*/

void EnQueue(Queue*q,int e)

{

if(q->front==(q->rear+1)%MAX_VERTEX_NUM) printf("满,失败");

else

{

q->rear=(q->rear+1)%MAX_VERTEX_NUM;

q->elem[q->rear]=e;

}

}

/*出队列*/

void DeleteQueue(Queue*q,int*e)

{

if(q->front==q->rear)

return;

*e=q->elem[(q->front+1)%MAX_VERTEX_NUM]; q->front=(q->front+1)%MAX_VERTEX_NUM;

}

/*广度优先遍历*/

void BFS(int i,int n)

{

int j,k;

Queue Q;

memset(visited,0,sizeof(visited));

printf("%d",G.vertex[i]);

visited[i]=1;

Q.front=0;

Q.rear=0;

EnQueue(&Q,i);

int count1=1;

while(!(Q.front==Q.rear))

{

DeleteQueue(&Q,&j);

for(k=0;k

if(G.adj[j][k]&&(!visited[k]))

{

count1++;

printf("%d",G.vertex[k]);

if(count1

printf("");

visited[k]=1;

EnQueue(&Q,k);

}

}

}

int main()

{

Graph G;

int n,m,menu,sum;

printf("######################\n"); printf("# 1.图的建立#\n"); printf("# 2.深度优先遍历图#\n"); printf("# 3.广度优先遍历图#\n"); printf("#0.结束#\n"); printf("######################\n"); printf("请输入需要执行的功能序号:\n"); scanf("%d",&menu);

while(menu!=0)

{

if(menu==1)

{

sum=sum+1;

scanf("%d%d",&n,&m);

G=CreateAG(n,m);

scanf("%d",&menu);

}

if(menu==2)

{

if(sum!=0)

{

DFS(0,n);

printf("\n");

scanf("%d",&menu);

}

else

{

printf("请先建立图!\n");

scanf("%d",&menu);

}

}

if(menu==3)

{

if(sum!=0)

{

BFS(0,n);

printf("\n");

scanf("%d",&menu);

}

else

{

printf("请先建立图!\n");

scanf("%d",&menu);

}

}

if(menu==0)

{

return0;

}

}

}

2.教学计划编制问题。

#include

#include

#define MAX_VERTEX_NUM20

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

Graph G;

void CreateAG(int n,int m)//创建有向图

{

int i,j,a,b;

for(i=0;i

{

G.vertex[i]=i+1;

}

for(i=0;i

for(j=0;j

{

G.Adj[i][j]=0;

}

for(i=0;i

{

scanf("%d%d",&a,&b);

G.Adj[a-1][b-1]=1;

}

}

void FindInDegree(int n,int indegree[])//求入度,第j列1的个数为入度

int i,j,num=0;

for(i=0;i

{

indegree[i]=0;

}

for(j=0;j

{

num=0;

for(i=0;i

{

if(G.Adj[i][j]==1)

{

num=num+1;

}

}

indegree[j]=num;

}

}

int TuoPu(int n,int m)

{

int i,j,k,s=0;

int shuzu[n];

int indegree[MAX_VERTEX_NUM]; FindInDegree(n,indegree);

for(i=0;i

for(j=0;j

{

if(indegree[j]==0)

{

indegree[j]=-1;

shuzu[s]=G.vertex[j];

s=s+1;

for(k=0;k

{

if(G.Adj[j][k]==1)

{

G.Adj[j][k]=0;

indegree[k]--;

}

}

break;

}

}

for(i=0;i

{

printf("%d",shuzu[i]);

}

printf("%d",shuzu[i]);

int main()

{

int n,m;

scanf("%d%d",&n,&m);

CreateAG(n,m);

TuoPu(n,m);

return0;

}

3.给定实际背景,解决最短路径问题。

#include

#include

#define MAX_VERTEX_NUM20

#define IN_MAX9999

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

Graph G;

int dist[MAX_VERTEX_NUM];//存储最短路径的长度值

int pre[MAX_VERTEX_NUM];//存储一个顶点在其最短路径的前趋

int S[MAX_VERTEX_NUM];//标志数组,若为已经找到最短路径的结点则为1,否则为0 void CreateAG(int n,int m)//创建无向图

{

int i,j,a,b,c;

for(i=0;i

{

G.vertex[i]=i+1;

}

for(i=0;i

for(j=0;j

{

if(i==j)G.Adj[i][j]=0;

else G.Adj[i][j]=IN_MAX;

}

for(i=0;i

{

scanf("%d%d%d",&a,&b,&c);

G.Adj[a-1][b-1]=c;

}

}

void Dijkstra(int v,int n)

{

for(int i=0;i

dist[i]=G.Adj[v][i];//初始化

S[i]=0;//标志位初始为0

if(dist[i]

pre[i]=v;//若存在边,则前趋为原点

else

pre[i]=-1;//否则,前趋为-1,不可达

}

S[0]=1;//原点标志为1

for(int i=0;i

int u;//u为待选顶点

int min=IN_MAX;//令初始最小值>max,使距离值为max的顶点也能加到S中for(int j=0;j

if((!S[j])&&dist[j]

min=dist[j];

u=j;

}

}

S[u]=1;//将其标志设置为1

for(int k=0;k

if((!S[k])&&dist[k]>dist[u]+G.Adj[u][k]){

dist[k]=dist[u]+G.Adj[u][k];

pre[k]=u;//若通过u减小了k的距离,则修改k的前趋为u }

}

}

printf("%d",dist[n-1]);//输出最短距离

}

int main()

{

int n,m;

scanf("%d%d",&n,&m);

CreateAG(n,m);

Dijkstra(0,n);

return0;

}

4.利用最小生成树算法解决通信网的总造价最低问题。

#include

#include

#define MAX_VERTEX_NUM1000

#define IN_MAX9999

typedef struct Graph{

int vertex[MAX_VERTEX_NUM];//顶点

int Adj[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵

}Graph;

Graph G;

typedef struct minside{

int adjvex;

int lowcost;

}minside;

void CreateAG(int n,int m)//创建无向图

{

int i,j,a,b,c;

for(i=0;i

{

G.vertex[i]=i+1;

}

for(i=0;i

for(j=0;j

{

if(i==j)G.Adj[i][j]=0;

else G.Adj[i][j]=IN_MAX;

}

for(i=0;i

{

scanf("%d%d%d",&a,&b,&c);

G.Adj[a-1][b-1]=G.Adj[b-1][a-1]=c;

}

}

void Prim(int v,int n)

{

int sum=0;

int lowcost[MAX_VERTEX_NUM],closest[MAX_VERTEX_NUM],i,min,j,k; for(i=0;i

{

closest[i]=v;

lowcost[i]=G.Adj[v][i];

}

for(i=1;i

{

min=IN_MAX;

for(j=0;j

{

if(lowcost[j]!=0&&lowcost[j]

{

min=lowcost[j];

k=j;

}

}

sum=sum+min;

lowcost[k]=0;

for(j=0;j

{

if(G.Adj[k][j]!=0&&G.Adj[k][j]

{

lowcost[j]=G.Adj[k][j];

closest[j]=k;

}

}

}

printf("%d",sum);

}

int main()

{

int n,m;

scanf("%d%d",&n,&m); CreateAG(n,m);

Prim(1,n);

return0;

}

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

北邮信通院数据结构实验报告三哈夫曼编码器之欧阳光明创编

数据结构实验报告 欧阳光明(2021.03.07) 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期: 2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统 计,统计每个字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编 码,并将每个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并 将编码后的字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符 串进行译码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析, 讨论赫夫曼编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study

data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有 出现的 字符一律不用编码。 2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。

weight lchild rchildparent 2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent

南邮数据结构上机实验二二叉树的基本操作及哈夫曼编码译码系统的实现

实验报告 (2015 / 2016学年第二学期) 课程名称数据结构A 实验名称二叉树的基本操作及哈夫曼编码译码系统的实现 实验时间2016 年 4 月14 日 指导单位计算机科学与技术系 指导教师骆健 学生姓名班级学号 学院(系) 管理学院专业信息管理与信息系统

实习题名:二叉树的基本操作 班级姓名学号日期2016.04.14 一、问题描述 设计递归算法,实现下列二叉树运算:删除一棵二叉树、求一棵二叉树的高度、求一棵二叉树中叶子结点数、复制一棵二叉树、交换一棵二叉树的左右子树。设计算法,按自上到下,从左到右的顺序,按层次遍历一棵二叉树。设计main函数,测试上述每个运算。 二、概要设计 文件tree.cpp中在该文件中定义二叉树的链式存储结构,用队列实现二叉树的层次遍历,并且编写实现二叉树的各种基本操作函数。其中包括结点类BTNode,循环队列类SeqQueue,二叉树类BinaryTree。主函数main的代码如图所示。 三、详细设计 1.类和类的层次设计 程序定义了循环队列SeqQueue类和二叉树BinaryTree类。SeqQueue类主要是用队列实现,层次遍历。运用后序遍历思想,把树分解为左右子树和跟结点再进行左右交换并计算树的高度,最后删除二叉树。

(a )循环队列类 (b )二叉树类 2. 核心算法 程序利用循环队列SeqQueue 类通过不断出队并输出节点的值,将左右孩子入队直到队列为空实现二叉树的层次遍历。并运用后序遍历思想,将二叉树树分解为左右子树和根结点,利用(p -> lChild)和(p -> rChild)计算结点数目,并通过交换结点的左右子树实现左右交换,计算树的高度,最后删除二叉树。核心算法主要是二叉树BinaryTree 类中的High ,Node_num ,Exchange ,Level_traversal 四个函数,其设计流程图如下: SeqQueue -int front, rear; -int maxSize; -BTNode **q; +SeqQueue(int mSize); +~SeqQueue(){delete []q;} +bool IsEmpty() const{return front == rear;} +bool IsFull() const{return (rear + 1) % maxSize == front;} +bool Front(BTNode *&x)const; +bool EnQueue(BTNode *x); +bool DeQueue(); +void Clear(){front = rear = 0;} BinaryTree +BinaryTree():s(100){root = NULL;} +~BinaryTree(){delete []root;} +bool Clear(); +void MakeTree(constT&x,BinaryTree&left,BinaryTree& right); +int High(BTNode*p); +int Node_num(BTNode*p); +BTNode*Copy (BTNode*t); +void Exchange(BTNode *&t); +void Level_traversal(void(*Visit)(T&x)); #SeqQueue s; -void Clear(BTNode* &t); -void Level_traversal(void(*Visit)(T&x),BTNode*t); T T

数据结构实验

实验2 查找算法的实现和应用?实验目的 1. 熟练掌握静态查找表的查找方法; 2. 熟练掌握动态查找表的查找方法; 3. 掌握hash表的技术. ?实验内容 1.用二分查找法对查找表进行查找; 2.建立二叉排序树并对该树进行查找; 3.确定hash函数及冲突处理方法,建立一个hash表并实现查找。 程序代码 #include using namespace std; int main() { int arraay[10]={1,2,3,4,5,6,7,8,9,10}; int binary_search(int a[10],int t); cout<<"Enter the target:"; int target; cin>>target; binary_search(arraay,target); return 0; } int binary_search(int a[10],int t) { int bottom=0,top=9; while(bottom

cout<<"Not present!"; } return 0; } 结果 二叉排序树 #include #include #include using namespace std; typedef int keyType; typedef struct Node { keyType key; struct Node* left; struct Node* right; struct Node* parent; }Node,*PNode; void inseart(PNode* root, keyType key) { PNode p = (PNode)malloc(sizeof(Node)); p -> key = key;

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

北邮数据结构实验3哈夫曼编码

数据结构实验报告 实验名称:实验3——哈夫曼编码 学生姓名: 班级: 班内序号: 学号: 日期:2013年11月24日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 2. 程序分析 2.1存储结构: struct HNode { char c;//存字符内容 int weight; int lchild, rchild, parent; }; struct HCode

{ char data; char code[100]; }; //字符及其编码结构 class Huffman { private: HNode* huffTree; //Huffman树 HCode* HCodeTable; //Huffman编码表 public: Huffman(void); void CreateHTree(int a[], int n); //创建huffman树 void CreateCodeTable(char b[], int n); //创建编码表 void Encode(char *s, string *d); //编码 void Decode(char *s, char *d); //解码 void differ(char *,int n); char str2[100];//数组中不同的字符组成的串 int dif;//str2[]的大小 ~Huffman(void); }; 结点结构为如下所示: 三叉树的节点结构: struct HNode//哈夫曼树结点的结构体 { int weight;//结点权值 int parent;//双亲指针 int lchild;//左孩子指针 int rchild;//右孩子指针 char data;//字符 }; 示意图为: int weight int parent int lchild int rchild Char c 编码表节点结构:

数据结构实验报告

姓名: 学号: 班级: 2010年12月15日

实验一线性表的应用 【实验目的】 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。、; 2、以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现; 4、通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的 应用和链表的建立等各种基本操作)。 【实验内容】 约瑟夫问题的实现:n只猴子要选猴王,所有的猴子按1,2,…,n编号围坐一圈,从第一号开始按1,2…,m报数,凡报到m号的猴子退出圈外,如此次循环报数,知道圈内剩下一只猴子时,这个猴子就是猴王。编写一个程序实现上述过程,n和m由键盘输入。【实验要求】 1、要求用顺序表和链表分别实现约瑟夫问题。 2、独立完成,严禁抄袭。 3、上的实验报告有如下部分组成: ①实验名称 ②实验目的 ③实验内容:问题描述:数据描述:算法描述:程序清单:测试数据 算法: #include #include typedef struct LPeople { int num; struct LPeople *next; }peo; void Joseph(int n,int m) //用循环链表实现 { int i,j; peo *p,*q,*head; head=p=q=(peo *)malloc(sizeof(peo)); p->num=0;p->next=head; for(i=1;inum=i;q->next=p;p->next=head; } q=p;p=p->next; i=0;j=1; while(i

数据结构实验报告模板

2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

数据结构实验

长春大学计算机学院网络工程专业 数据结构实验报告 实验名称:实验二栈和队列的操作与应用 班级:网络14406 姓名:李奎学号:041440624 实验地点:日期: 一、实验目的: 1.熟练掌握栈和队列的特点。 2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。 3.掌握链队的入队和出队等基本操作。 4.加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。 二、实验内容、要求和环境: 注:将完成的实验报告重命名为:班级+学号+姓名+(实验二),(如:041340538张三(实验二)),发邮件到:ccujsjzl@https://www.360docs.net/doc/5a2041556.html,。提交时限:本次实验后24小时之内。 阅读程序,完成填空,并上机运行调试。 1、顺序栈,对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 (1)文件SqStackDef. h 中实现了栈的顺序存储表示 #define STACK_INIT_SIZE 10 /* 存储空间初始分配量*/ #define STACKINCREMENT 2 /* 存储空间分配增量*/ typedef struct SqStack { SElemType *base; /* 在栈构造之前和销毁之后,base 的值为NULL */ SElemType *top; /* 栈顶指针*/ int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }SqStack; /* 顺序栈*/ (2)文件SqStackAlgo.h 中实现顺序栈的基本操作(存储结构由SqStackDef.h 定义) Status InitStack(SqStack &S) { /* 构造一个空栈S */ S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); /* 存储分配失败*/ S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } int StackLength(SqStack S) { // 返回S 的元素个数,即栈的长度, 编写此函数

北邮数据结构实验四-链表排序

数据结构实验报告 实验名称:实验四——链表的排序 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 [内容要求] 使用链表实现下面各种排序算法,并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其 中关键字交换计为3次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒 (选作) 4、对2和3的结果进行分析,验证上述各种算法的时间复杂度 编写测试main()函数测试线性表的正确性 代码要求 1、必须要有异常处理,比如删除空链表时需要抛出异常; 2、保持良好的编程的风格: 代码段与段之间要有空行和缩近 标识符名称应该与其代表的意义一致 函数名之前应该添加注释说明该函数的功能 关键代码应说明其功能 3、递归程序注意调用的过程,防止栈溢出

2. 程序分析 2.1 存储结构 [内容要求] 存储结构:双链表 2.2 关键算法分析 [内容要求] 定义类: template class LinkList { public: LinkList(){front = new Node ;front->next=rear;front->prior=NULL;rear=new Node;rear->next=NULL;rear->prior=front;} LinkList(T a[],int n); void BackLinkList(T a[]);//恢复原链表 ~LinkList();//析构函数 void PrintList();//打印数列 void InsertSort();//插入排序 void BubbleSort();//冒泡排序 Node * Partion(Node *i,Node *j);//快速排序中寻找轴值的函数 void Qsort(Node *i,Node *j);//快速排序 void SelectSort();//选择排序 Node*front; Node*rear; }; 成员函数包括:构造函数:单链表,打印单链表,插入排序,快速排序,冒泡排序,选择排序,析构函数 公有成员:头指针和尾指针 1、构造函数: LinkList::LinkList(T a[],int n) { front=new Node; rear=new Node; front->prior=NULL;front->next=rear; rear->next=NULL;rear->prior=front; Node *s; for (int i=n-1;i>=0;i--) {

北邮信通院数据结构实验报告三哈夫曼编码器

数据结构实验报告 实验名称:实验三树——哈夫曼编/解码器 学生姓名: 班级: 班内序号: 学号: 日期:2014年12月11日 1.实验要求 利用二叉树结构实现赫夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个 字符的频度,并建立赫夫曼树 2、建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每 个字符的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的 字符串输出。 4、译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译 码,并输出译码结果。 5、打印(Print):以直观的方式打印赫夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼 编码的压缩效果。 测试数据: I love data Structure, I love Computer。I will try my best to study data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的 字符一律不用编码。

2. 程序分析 2.1 存储结构 Huffman树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,其中带权路径长度最小的二叉树称为Huffman树,也叫做最优二叉树。 weight lchild rchild parent

2-1-1-1 5-1-1-1 6-1-1-1 7-1-1-1 9-1-1-1 weight lchild rchild parent 2-1-15 5-1-15 6-1-16 7-1-16 9-1-17 7017

数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨

实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。

三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

南邮数据结构实验三

实验报告 (2015 / 2016 学年第一学期) 课程名称数据结构 实验名称图的基本运算及飞机换乘次数最少问题 实验时间2015 年12 月 4 日 指导单位计算机科学与技术系 指导教师黄海平 学生姓名陈明阳班级学号Q14010119 学院(系) 贝尔英才专业信息科技强化班

实验报告 实验名称图的基本运算及飞机换乘次数最少问题指导教师黄海平 实验类型验证实验学时 4 实验时间12.4 一、实验目的和要求 飞机最少换乘次数问题。 (1)设有n个城市,编号为0~n-1,m条航线的起点和终点由用户输入提供。寻找一条换乘次数最少的线路方案。 (2)参考:可以使用有向图表示城市间的航线;只要两城市间有航班,则图中这两点间存在一条权值为1的边;可以使用Dijkstra算法实现。 二、实验环境(实验设备) VSUAL STUDIO2015 三、实验原理及内容 对象视图: 源代码: Graph.h

#include #include using namespace std; const int INF = 2147483647; enum ResultCode { Underflow, Duplicate, Failure, Success, NotPresent, OutOfBounds }; template class Graph//抽象类 { public: virtual ResultCode Insert(int u, int v, T w) = 0; virtual ResultCode Remove(int u, int v) = 0; virtual bool Exist(int u, int v)const = 0; protected: int n, e; }; template class MGraph :public Graph //邻接矩阵类 { public: MGraph(int mSize, const T noedg); ~MGraph(); ResultCode Insert(int u, int v, T w); ResultCode Remove(int u, int v); bool Exist(int u, int v)const; int Choose(int *d, bool *s); void Dijkstra(int v, T *d, int *path); protected: T **a; T noEdge; }; template MGraph::MGraph(int mSize, const T noedg) { n = mSize; e = 0; noEdge = noedg; a = new T*[n]; for (int i = 0; i

数据结构实验报告图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif #include using namespace std; #include "" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0;

北邮数据结构实验 第四次实验 哈夫曼树

数据结构实验报告 1.实验要求 本实验为可选实验,用于提高同学们使用数据结构解决实际问题的能力。通过选择下面3个题目之一进行实现,掌握如下内容: 栈和递归地深度应用 了解Huffman的思想和算法实现 矩阵和相关算法在BMP图像中的应用 进一步提高编程能力 利用二叉树结构实现哈夫曼编/解码器。 基本要求: 1、初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的 频度,并建立哈夫曼树 2、建立编码表(CreateTable):利用已经建好的哈夫曼树进行编码,并将每个字符 的编码输出。 3、编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串 输出。 4、译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输 出译码结果。 5、打印(Print):以直观的方式打印哈夫曼树(选作) 6、计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压 缩效果。 7、可采用二进制编码方式(选作) 测试数据: I love data Structure, I love Computer.I will try my best to study data Structure. 提示: 1、用户界面可以设计为“菜单”方式:能够进行交互。 2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不 用编码。

2. 程序分析 2.1存储结构: (1)三叉树: class Huffman { private: HNode*HTree;//哈夫曼树结点 HCode*HCodeTable;//哈夫曼编码表 char b[1000];//记录所有输入内容被编码后的结果 char c[127]; char letter[1000];//输入内容的保存 void SelectMin(int &x,int &y,int k);//求最小权重的字符node*count;//计算各个字符出现次数 int n;//输入字符的种类(个数) int l; public: Huffman(); void CreateHTree();//创建哈夫曼树 void CreateCodeTable();//创建哈夫曼编码表 void Encode();//编码 void Decode();//解码 }; 结点结构为如下所示: 三叉树的节点结构: struct HNode//哈夫曼树结点的结构体 { int weight;//结点权值 int parent;//双亲指针 int lchild;//左孩子指针 int rchild;//右孩子指针 char data;//字符 }; 示意图为:

南邮数据结构实验算法分析

数据结构实验代码南邮实验课实验十各种算法性能比较#include #include #include template void swap(T &a,T &b) { T temp; temp=a; a=b; b=temp; } template //选择排序 void SelectSort(T A[],int n) { int small; for(int i=0;i //直接插入排序 void InsertSort(T A[],int n) { for(int i=1;i0 && temp //冒泡排序 void BubbleSort(T A[],int n) { int i,j,last; i=n-1;

while(i>0) { last=0; for(j=0;j //快速排序 void QuickSort(T A[],int n) { QSort(A,0,n-1); } template void QSort(T A[],int left,int right) { int i,j; if(leftA[left]); if(i //快速排序(改编)void BQuickSort(T A[],int n) { BQSort(A,0,n-1); } template void BQSort(T A[],int left,int right) { int i,j; if(left

相关文档
最新文档