北邮数据结构实验报告

合集下载

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告

北京邮电大学信息与通信工程学院

2009级数据结构实验报告

实验名称:实验三哈夫曼编/解码器的实现

学生姓名:陈聪捷

日期:2010年11月28日

1.实验要求

一、实验目的:

了解哈夫曼树的思想和相关概念;

二、实验内容:

利用二叉树结构实现哈夫曼编/解码器

1.初始化:能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树。

2.建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。

3.编码:根据编码表对输入的字符串进行编码,并将编码后的字符串输出。

4.译码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。

5.打印:以直观的方式打印哈夫曼树。

6.计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果。

7.用户界面可以设计成“菜单”方式,能进行交互,根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。

2.程序分析

2.1存储结构

二叉树

template

classBiTree

{

public:

BiTree();//构造函数,其前序序列由键盘输入

~BiTree(void);//析构函数

BiNode*Getroot();//获得指向根结点的指针

protected:

BiNode*root;//指向根结点的头指针

};

//声明类BiTree及定义结构BiNode

Data:

二叉树是由一个根结点和两棵互不相交的左右子树构成

data:

HCode*HCodeTable;//编码表

inttSize;//编码表中的总字符数

北京邮电大学 计算机学院 数据结构第一次实验报告

北京邮电大学  计算机学院   数据结构第一次实验报告
scanf("%d",&L->len);
fflush(stdin);
if(L->len<=0)
return 0;
printf("Please input the data:\n");
for(i=0;i<=L->len-1;i++)
{
S=(Linklist)malloc(sizeof(Lnode));
}
void printlist(HeadNode *L,Linklist S)//打印链表中数据域的值
{
if (S==NULL)
printf("The list is empty.\n");
else
{
printf("The list has %d Lnodes.\n",L->len);
printf("The list is:\n");
return 0;
}
printf("Please input the data you want to research:\n");
scanf("%d",&key);//提示用户输入需要查找的数值
fflush(stdin);//清空缓冲区,防止读入用户多输入的数据

北邮数据结构试验报告试验二含源码

北邮数据结构试验报告试验二含源码

数据结构实验报告

实验名称:实验二一一栈和队

学生姓名:申宇飞

班级

班内序

03

号:

学号

日期

2013年11月18日

1- 实验要求

1.1实验目的:

通过选择卞面五个题目之一进行实现,掌握如卞内容:

>进一步掌握指针、模板类、异常处理的使用

>掌握栈的操作的实现方法

>掌握队列的操作的实现方法

>学习使用栈解决实际问题的能力

>学习使用队列解决实际问题的能力

1.2实验内容

题目1

根据栈和队列的抽象数据类型的定义,按要求实现一个栈或一个队列。

要求:

1、实现一个共享栈

2、实现一个链栈

3、实现一个循环队列

4、实现一个链队列

编写测试mainO函数测试线性表的正确性。

2.程序分析

2.1存储结构

链栈:栈的链式存储结构,其实现原理类似于单链表,结点结构与单链表相同,但链栈在实现时直接采用栈顶指针指向栈顶元素。

第]页

北京邮电大学信息与通信工程学院

data next

栈顶

栈底关键算法分析

链栈:

一、入栈操作算法步骤:

自然语言描述:

1、建立新结点

2、给p结点的数据域赋值

3、修改p结点的指针域,将其指向栈顶结点

4、栈顶指针指向p结点伪代码描述:

1)Node<T> * s = new Node<T>;

2)p->data = x;

3)p->next = top;

4)top = p;

二、出栈操作

算法步骤:

自然语言描述:

1、判断栈是否为空

2、保存栈顶结点的数据域

3、定义指针p指向栈顶结点

4、栈顶指针指向下一个结点

5、释放p结点伪代码描述:

1)if(EmptyO)throw" F溢“;

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告

摘要:

本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,

总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和

解决方法。本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。

1. 实验一:线性表的操作

1.1 实验目的

本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。

1.2 实验过程

我们使用C++语言编写了线性表的相关算法,并在实际编程环境下

进行了测试。通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。

1.3 实验结果

经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。这些

结果与预期相符,并反映了线性表的基本特性。

1.4 问题与解决方法

在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。通过仔细分析问题,我们优化了算法

的实现,并解决了这些问题。

2. 实验二:栈和队列的应用

2.1 实验目的

本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编

程实现。

2.2 实验过程

我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境

下进行了测试。通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。

2.3 实验结果

经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达

式的计算,队列的应用可以实现图的广度优先遍历。这些结果证明了

北邮数据结构第三次实验-实验报告

北邮数据结构第三次实验-实验报告

数据结构实验报告

实验名称:实验三——栈和队列

学生姓名:

班级:

班内序号:

学号:

日期:

1.实验要求

1.1 实验目的

通过选择下面两个题目之一进行实现,掌握如下内容:

➢掌握二叉树基本操作的实现方法

➢了解赫夫曼树的思想和相关概念

➢学习使用二叉树解决实际问题的能力

1.2 实验内容

根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:

1、二叉树的建立

2、前序遍历二叉树

3、中序遍历二叉树

4、后序遍历二叉树

5、按层序遍历二叉树

6、求二叉树的深度

7、求指定结点到根的路径

8、二叉树的销毁

9、其他:自定义操作

编写测试main()函数测试线性表的正确性

2. 程序分析

2.1 二叉链表

2.2 二叉树的二叉链表存储示意图

2.3 关键算法分析

2.3.1算法1:void create(Binode *&R, T data[], int i);

[1] 算法功能:创建一个二叉树

[2] 算法基本思想:通过构造函数创建一个二叉树,构造函数通过调用函数

create()创建二叉树,关于函数create()的伪代码:

1.定义根指针,输入节点储存的data,若输入“#”,则该节点为空;

2.申请一个新节点,判断它的父结点是否不为空,如果不为空在判断其为左

或者右孩子,并把地址付给父结点,把data写入。

[3] 算法空间、时间复杂度:O(n)

[4] 代码逻辑(可用伪代码描述):if(data[i-1]!=0){R = new Binode;R->data

= data[i-1];R->lch = R->rch = NULL;create(R->lch, data,

北邮数据结构实验报告实验四

北邮数据结构实验报告实验四

2009级数据结构实验报告

实验名称:实验四——排序

学生姓名:

班级:

班内序号:

学号:

日期:2010/12/17

1.实验要求

实验目的:

通过选择下面两个题目之一,学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。

实验内容:

使用简单数组实现下面各种排序算法,并进行比较。

排序算法:

1、插入排序

2、希尔排序

3、冒泡排序

4、快速排序

5、简单选择排序

6、堆排序

7、归并排序

8、基数排序(选作)

9、其他

要求:

1、测试数据分成三类:正序、逆序、随机数据

2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。

3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)

4、对2和3的结果进行分析,验证上述各种算法的时间复杂度

编写测试main()函数测试线性表的正确性。

2. 程序分析

2.1 存储结构

使用最简单的一维数组存储待排序的数据。共使用两个数组,一个用来存储原始数据,一个用来存储待排序数据。每次排序完毕,用原始数据更新一次待排序数据,保证每一次都

对同一组数据排序。(图略)

2.2 关键算法分析

1.直接插入的改进:

在一般的直接插入中,关键码每移动一次就需要比较一次。在移动的方面,优化是比较困难的,因为对静态线性表的插入必然要带来大量的移动。但是,我们可以在比较上进行一些优化。在查找技术一张曾学过的“折半查找法”,在这里就可以照葫芦画瓢地运用。一趟排序的伪代码如下:

1.如果该元素大于处于其左侧相邻的元素则跳过该元素;

2.low=0,high=i;

北邮数据结构实验-约瑟夫环

北邮数据结构实验-约瑟夫环

北邮数据结构实验-约瑟夫环

数据结构实验报告

实验名称:实验1——约瑟夫环

学生姓名:

班级:

班内序号:

学号:

日期:

1.实验要求

实验目的:

通过利用循环链表实现约瑟夫问题的求解进行实现,掌握如下内容:

1.熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法

2.学习指针、模板类、异常处理的使用

3.掌握线性表的操作的实现方法

4.学习使用线性表解决实际问题的能力

实验内容:

利用循环链表实现约瑟夫问题的求解。

约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。

2. 程序分析

2.1 存储结构

首先构建结点的结构体,包括结点的编号number和指向后继元素的指针*next。然后构建循环链表储存每一个结点。

2.2 关键算法分析

1、关键算法:

插入:

用尾插法构建循环链表,建立一个尾指针r用来保存最后一个结点的地址,

插入每一个节点后,r指向新插入的结点。用for循环来给每一个结点的

number赋值。

插入的步骤:

1.建立新指针s;

2.在for循环中给s赋值;

3.将r指针指向s;

4.修改尾指针r=s

5.在全部结点插入后,将终端结点指向第一个指针,r->next=front->next。

约瑟夫环算法实现:

1.因为每次循环都有一个人出列,最后只剩一个人,因此要进行n-1次循

环,用for循环实现。

2.同时定义一个指针p=front->next,每次循环front和p均后移m-1个,使

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

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

数据结构实验报告

实验名称:实验三树——哈夫曼编/解码器

学生姓名:

班级:

班内序号:

学号:

日期: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

北邮 数据结构实验报告2

数据结构

实验名称:__ 哈夫曼树________

学生姓名:______ 蔡宇豪_________________

班级:________ 2 5____________________ 班内序号:__________15__________________

学号:_________2012210673___________________ 日期:________2013.11.24____________________

2. 程序分析

2.1 存储结构

哈夫曼树结点的存储结构包括双亲域parent,左子树lchild,右子树rchild,还有字符word,权重weight,编码code

对用户输入的信息进行统计,将每个字符作为哈夫曼树的叶子结点。统

计每个字符出现的次数作为叶子的权重,统计次数可以根据每个字符不

同的ASCII码,根据叶子结点的权重建立一个哈夫曼树

2.2 关键算法分析

要实现哈夫曼解/编码器,就必须用二叉树结构建立起哈夫曼树,其中有4个关键算法,首先是初始化函数,统计每个字符的频度,并建立起哈夫曼树;然后是建立编码表,将每个字符的编码输出;再次就是编码算法,根据编码表对输入的字符串进行编码,并将编码后的字符串输出;最后是译码算法,利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。

1.初始化函数

int i,j;

for(i=0;i

a[i]=0; //先将a[]数组中每个值都赋为,不然程序会运行出错?

for(i=0;s[i]!='\0';i++) //'\0'字符串结束标志

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

一:实验目的

本实验旨在通过实现不同排序算法来加深对排序算法原理和实现的理解,并比较各算法在不同数据规模下的性能差异。

二:实验内容

1. 算法原理

2. 实验环境与工具

3. 实验步骤

3.1 数据准备

3.2 插入排序算法实现

3.3 冒泡排序算法实现

3.4 快速排序算法实现

4. 实验结果分析

4.1 不同数据规模下各算法运行时间对比

4.2 算法性能分析与优化

5. 实验总结与感想

三:算法原理

1. 插入排序算法原理

插入排序算法将待排序的数据视为两个部分,一部分是已排序的数据,另一部分是未排序的数据。将未排序的数据逐个插入到已排序的数据中的正确位置,直到所有数据都被插入完毕。

2. 冒泡排序算法原理

冒泡排序算法比较相邻的元素,并按照从小到大(或从大到小)的顺序交换位置,每一轮比较都会找出一个最大(或最小)的元素放在最后,重复此过程直到所有元素有序。

3. 快速排序算法原理

快速排序算法通过选定一个基准元素,将小于基准的元素放在左边,大于基准的元素放在右边,然后对左右两个子序列分别递归调用快速排序算法。

四:实验环境与工具

1. 操作系统:Windows 10

2. 编程语言:C++

3. 开发环境:Visual Studio Code

4. 版本控制:Git

五:实验步骤

3.1 数据准备

在实验开始前,首先准备一组需要排序的数据,可以是随机的整数、浮点数或其他数据类型。根据实验需要,可以准备不同规模的数据用于对比分析。

3.2 插入排序算法实现

根据插入排序算法的原理编写代码实现。首先创建一个包含待排序数据的数组,然后按照算法步骤进行排序操作。最后将排序结果输出。

北京邮电大学数据结构课程设计报告

北京邮电大学数据结构课程设计报告

《数据结构》

课程设计报告

设计题目:多级目录文件检索算法设计

姓名___________________

学号___________________

班级___________________

同组组员___________________

实验报告日期:

一.需求分析(详细说明要实现的功能和功能间的关系)

程序旨在实现一个在Linux系统下(以Ubuntu 11.10发行版为蓝本)进行多级目录文件检索的功能。

程序支持传统检索和多星号通配符检索,在搜索结果中给出符合条件文件的文件名,最后修改时间和路径,并按照最后修改时间排序。

程序提供窗口形式的图形界面。程序运行过程中用户只需手动输入待查的关键字,查找的根路径可以简明的图形界面方式选择。查找的结果在窗口中显示,允许用户对显示窗口的大小进行任意调节,并使用滚动条查看不能完全显示的部分。

二.算法思想(对于实现较为复杂的功能,要写出所使用的算法和算法的思路)

1- 文件查找

程序递归调用一个子函数Filesearch(ENTRYPTR LIST, char* input, const char *dir_name)来实现对文件的查找,其思想近于树的先根遍历。每到达一层目录程序均读取文件名(Linux 下文件夹也被看做是一个文件)并调用KMP算法进行匹配(节点访问过程),然后判定当前文件的性质(宏S_ISDIR),若该“文件”确实是一个文件,则停止向下遍历返回上一层;若该“文件”是一个文件夹,那么进入该文件夹递归遍历下一层。

2- 模式匹配

程序使用KMP算法进行文件名和模式的匹配。该算法首先分析模式的特征(重复性)并生成一个next数组,然后根据next数组的指示在主串上滑动模式进行匹配。这种算法可以避免对不可能匹配的情况进行比对,从而降低模式匹配过程的时间复杂度。

北邮数据结构实验报告

北邮数据结构实验报告

根据图的抽象数据类型的定义,使用邻接矩阵或邻接表实现一个图。

图的基本功能:

1、图的建立

2、图的销毁

3、深度优先遍历图

4、广度优先遍历图

5、使用普里姆算法生成最小生成树

6、使用克鲁斯卡尔算法生成最小生成树

7、求指定顶点到其他各顶点的最短路径

8、其他:比如连通性判断等自定义操作

编写测试main。函数测试图的正确性

2.程序分析

2.1存储结构

•用一维数组存储顶点信息

•用二维数组(邻接矩阵)存储顶点之间的关系(弧或边)无向图的矩阵如下图所示,其具有对称性。

•0(Lj)任VR

•(i,j)eVR

ABCD

ABCDEF

F

网的邻接矩阵为:

Afw尸j

A“=01=)其他

2.2关键算法分析

2.2.1深度遍历

(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即boolvisited[MAX_SIZE]={0};

⑵从结点v开始访问:每访问一个结点,设置该结点的visited[v]=L

⑶找结点v的第一个未访问的临接点。

算法步骤:

①访问结点v,设置visited[v]=l;

②WK的第一个邻接点;

③while(w存在);

④if(w未被访问);

⑤w二下一个邻接点

时间复:杂度:。(小)

2.2.2广度遍历

(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即

boolvisited[MAX_SIZE]={0};

(2)从结点v开始访问,每访问一个结点,设置该结点的visited[v]=l°

(3)找结点v的所有未访问结点算法步骤:

①初始化队列Q

②访问顶点v,visited[v]=lo

©while(队列非空):

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

北邮数据结构实验报告-排序

一、实验目的

本实验旨在掌握常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等,并通过实际编程实现对数字序列的排序。

二、实验内容

1.冒泡排序

冒泡排序是一种简单的排序算法,其基本思想是依次比较相邻的两个元素,并按照从小到大或从大到小的顺序交换。具体步骤如下:

- 从待排序序列的第一个元素开始,依次比较相邻的两个元素;

- 如果前面的元素大于后面的元素,则交换这两个元素的位置;

- 重复上述步骤,直到整个序列有序。

2.插入排序

插入排序是一种简单且直观的排序算法,其基本思想是将待排序序列分为已排序和未排序两部分,每次从未排序部分中选择一个元素插入到已排序部分的合适位置。具体步骤如下:

- 从待排序序列中选择一个元素作为已排序部分的第一个元素;

- 依次将未排序部分的元素插入到已排序部分的合适位置,使得已排序部分保持有序;

- 重复上述步骤,直到整个序列有序。

3.选择排序

选择排序是一种简单且直观的排序算法,其基本思想是每次选择未排序部分中的最小(或最大)元素,并将其放在已排序部分的末尾。具体步骤如下:

- 在未排序部分中选择最小(或最大)的元素;

- 将选择的最小(或最大)元素与未排序部分的第一个元素交换位置;

- 重复上述步骤,直到整个序列有序。

4.快速排序

快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排序序列分割成两部分,其中一部分的元素都比另一部分的元素小。具体步骤如下:

- 选择一个枢轴元素(一般选择第一个元素);

- 将待排序序列中小于枢轴元素的元素放在枢轴元素的左侧,大于枢轴元素的元素放在枢轴元素的右侧;

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告

北邮数据结构实验报告

一、引言

数据结构是计算机科学中的重要基础知识,对于计算机程序的设计和性能优化

起着至关重要的作用。本报告旨在总结北邮数据结构实验的相关内容,包括实

验目的、实验设计、实验过程和实验结果等。

二、实验目的

本次实验旨在通过实践操作,加深对数据结构的理解和应用能力。具体目的如下:

1. 掌握线性表、栈和队列等基本数据结构的实现方法;

2. 熟悉二叉树、图等非线性数据结构的构建和遍历算法;

3. 学会使用递归和非递归算法解决实际问题;

4. 培养编程实践能力和团队合作意识。

三、实验设计

本次实验包括以下几个部分:

1. 线性表实验:设计一个线性表类,实现线性表的基本操作,如插入、删除和

查找等。通过实验,了解线性表的顺序存储和链式存储结构的特点和应用场景。

2. 栈和队列实验:设计栈和队列类,实现栈和队列的基本操作,如入栈、出栈、入队和出队等。通过实验,掌握栈和队列的应用,如括号匹配、迷宫求解等。

3. 二叉树实验:设计二叉树类,实现二叉树的创建、遍历和查找等操作。通过

实验,熟悉二叉树的前序、中序和后序遍历算法,并了解二叉树的应用,如表

达式求值等。

4. 图实验:设计图类,实现图的创建、遍历和最短路径等操作。通过实验,掌

握图的邻接矩阵和邻接表表示方法,并了解图的深度优先搜索和广度优先搜索

算法。

四、实验过程

1. 线性表实验:根据实验要求,首先选择线性表的存储结构,然后设计线性表类,实现插入、删除和查找等基本操作。在实验过程中,遇到了一些问题,如

边界条件的处理和内存管理等,通过团队合作,最终解决了这些问题。

北京邮电大学计算机学院数据结构第二次实验报告

北京邮电大学计算机学院数据结构第二次实验报告

北京邮电大学计算机学院数据结构第二次实验报告

实验报告(2)

姓名:学号:

班级:日期:

一、实验目的:掌握特殊线性表栈和队列的有关运算,熟悉栈和队列的存储结构的基本特点。

二、实验原理:完成特殊单链表-----栈和队列的运算。具体:1、利用栈完成1个字符串的逆置运算;2、在一个循环队列中入队2元素的运算。

三、实验内容及要求:

1、编写一个算法程序实现在一个顺序栈中把一个字符串逆置的运算,要求使用

入栈和出栈运算来完成。

2、编写一个算法程序实现在一个循环队列中入队2个元素,要求先建立一个循

环队列,元素个数为4个,然后在循环队列的末尾加入2个元素。

要求:请同学把步骤、调试好的程序及存在的问题写在下面。

第一题:

步骤:首先创建一个空栈,然后提示用户输入一个字符串,依次读取字符串的每个字符并入栈,再依次取栈顶元素并出栈,便可得到原字符串的逆置。

第一题实验程序代码:

#include

#define Stack_Size 50//数组大小定义

typedef char DataType;

typedef struct{

DataType elem[Stack_Size];

int top;

}SeqStack;//栈的结构定义

int StackEmpty(SeqStack *S);//判断栈是否为空

int StackFull(SeqStack *S);//判断栈是否为满

void Push(SeqStack *S,DataType x);//元素入栈

DataType Pop(SeqStack *S);//元素出栈

void playdata(SeqStack *S);//打印输出栈中的元素

北邮数据结构实验报告3二叉树含源码

北邮数据结构实验报告3二叉树含源码

数据结构实验报告

实验名称:实验三——树题目一

学生姓名:申宇飞

班级:2012211103

班内序号:03

学号:2012210064

日期:2013年12月3日

1.实验要求

掌握二叉树基本操作的实现方法

根据二叉树的抽象数据类型的定义,使用二叉链表实现一个二叉树。

二叉树的基本功能:

1、二叉树的建立

2、前序遍历二叉树

3、中序遍历二叉树

4、后序遍历二叉树

5、按层序遍历二叉树

6、求二叉树的深度

7、求指定结点到根的路径

8、二叉树的销毁

9、其他:自定义操作

编写测试main()函数测试线性表的正确性

2. 程序分析

2.1 存储结构

采用二叉树的存储结构,其中每个二叉树的结点定义了一个结构体,该结构体包

含三个元素,分别是一个T类型的数据域data,一个指向T类型的指针左孩子,一个指向T 类型的指针右孩子,示意图如图所示。

采用了队列的存储结构。示意图如图所示:

对于二叉树中每个结点的data 域的赋值,我们事先把这些data 储存在一个数组中,通过对数组元素的调用事先对二叉树中每个结点的data 域的赋值。 2.2 关键算法分析 一:二叉树的建立: A . 自然语言描述:

1首先判断调用的数组是否为空,如果为空,直接将一个已经初始化好的根节点置为空。 2 如果该数组不为空,则把调用的数组的第一个元素的赋给根节点的data 域。 3 采用递归的思想,分别将根节点的左右孩子作为根节点,递归调用该函数。完成对左右子树的赋值。 B . 代码详细分析:

template <class T> void BiTree<T>::Create(Node<T> *&R,T* buf,int i) {

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.重复执行2,直到找到所有顶点的路径位置。
3.程序运行结果
4.总结
1.调试时出现的问题及解决的方法
这次实验程序较上次相比复杂程度有所增加,在调试过程中也出现了很多问题。深度遍历是一个递归函数,最开始我的visited数组的初始化语句写在的函数内,导致遍历根本停不下来。调试kruskal算法时出现了输出结果与理论结果不符的情况,宿舍的另一个同学也出现了相同的情况,经过我们讨论研究发现是在给边集数组赋值时忘记去除arc[i][j]=0的情况,导致输出结果出现错误。生成最短路径时由于一开始构造的是无向网所以程序无法正常运行,后重新加上了构造有向网的过程。
重复执行:在所有u∈U,v∈V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,T就是最后得到的最小生成树。
lowcost[n]:集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;
adjvex[n]:边在集合U中的顶点。
2.心得体会
编写代码是一个熟能生巧的过程,经过几次练习不仅提高了代码的输入速度,还增进了对代码的理解,对于书本上代码出现的一些错误也能及时发现。
3.下一步的改进
未设计错误处理,没有考虑到输入有误的情况。可加入对输入的判断,判断输入数据是否合理,不合理则输出“请重新输入”。也没有设计判断图是否联通的算法。由于有向图和无向图的区别,我编写了两段代码,无向图用来验证两种遍历,prim和kruskal算法,有向图用来验证最短生成路径的算法,可以考虑将两份代码合二为一。
lowcost[j]=min { cost (vk,vj) |vk∈U}
adjvex[j]=k
时间复杂度:O(n²)
2.2.3 kruskal算法
1.设无向连通网为G=(V,E),令G的最小生成树T=(U,TE),其初态为U=V, TE={},这样T中各顶点各自构成一个连通分量。
2.将图中边(存于边集数组E)按权值由小到大排序,依次考察边集E中各边:
若被考察边的两个顶点属于T的两个不同连通分量,则将此边加入到TE中,同时将两个连通分量连接为一个连通分量;
若被考察边的两个顶点属于同一连通分量,则舍此边,以免造成回路。
时间复杂度:O(n²)
2.2.4 Dijkstra算法
1.首先找出从源点能够直接到达的顶点的所有路径,并从中选出一条最短的路径。
2.然后以这条已选出的最短路径作为转发路径,找出经过这条路径转发后到达其他顶点的路径,并从中选出一条最低按的路径,如果经过这条路径转发bouquet到达目的节点比直接从源点到达目的节点路径要长,就不转发。
(3)找结点v的所有未访问结点
算法步骤:
初始化队列Q
访问顶点v,visited[v]=1。
while(队列非空):
v=队头元素出队;
访问队头元素的所有未访问的邻接点。
时间复杂度:O(n²)
2.2.2 prim算法
设G=(V,E),具有n个顶点的连通网;
T=(U,TE),G的最小生成树,初始状态为U={u0}(u0∈V),TE={};
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问:每访问一个结点,设置该结点的visited[v]=1.
(3)找结点v的第一个未访问的临接点。
算法步骤:
①访问结点v,设置viswenku.baidu.comted[v]=1;
②w=v的第一个邻接点;
根据图的抽象数据类型的定义,使用邻接矩阵或邻接表实现一个图。
图的基本功能:
1、图的建立
2、图的销毁
3、深度优先遍历图
4、广度优先遍历图
5、使用普里姆算法生成最小生成树
6、使用克鲁斯卡尔算法生成最小生成树
7、求指定顶点到其他各顶点的最短路径
8、其他:比如连通性判断等自定义操作
编写测试main()函数测试图的正确性
2.程序分析
2.1存储结构
•用一维数组存储顶点信息
•用二维数组(邻接矩阵)存储顶点之间的关系(弧或边)
无向图的矩阵如下图所示,其具有对称性。
•Aij=0(i,j)VR
•Aij=1 (i,j)VR




•网的邻接矩阵为:
•Aij=wiji≠j
•Aij=0 i=j
•Aij=∞其他

2.2关键算法分析
2.2.1深度遍历
③while(w存在);
④if(w未被访问);
⑤w=下一个邻接点
时间复杂度:O(n²)
2.2.2广度遍历
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问,每访问一个结点,设置该结点的visited[v]=1。
相关文档
最新文档