数据结构课程设计_二叉排序树的实现

数据结构课程设计_二叉排序树的实现
数据结构课程设计_二叉排序树的实现

课程设计

课程名称数据结构课程设计

题目名称二叉排序树的实现

学生学院应用数学学院

专业班级信息计算1班

学号3114008104

学生姓名陈辉腾

指导教师刘志煌

2016年6月27日

二叉排序树的实现

应数 14信计1班 3114008104 陈辉腾

课程设计要求:

二叉排序树的实现

二叉排序补充概念(也可以参考书上第九章第二节)

左子树的数据总是小于根和右子树的数据,这种就叫做二叉排序树,简单一点,二叉排序树左边的数据小于右边.

1)编程实现二叉排序树,包括生成、插入,删除;

2)对二叉排序树进行先根、中根、和后根非递归遍历;

3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

例如,a 为根,左右孩子是 bc,b 的孩子是 de,c 的孩子是 fg.

也可以像这样更加美观:

也可以是竖着显示,a 为根,bc 为孩子.

4)分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩3 项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?

5)格式就要按照我们作业的要求,对数据测试,分析,总结

和改进的工作要做的详细一点。

1、编程实现二叉排序树,包括生成、插入、删除;

1.1数据类型定义

1.2生成一颗二叉排序树

方法一:手工输入,递归生成。

生成一颗二叉排序树如下:

这样生成一棵二叉排序树,就是要自己判断每个结点应该放在什么地方,因为二叉排序树规定了二叉排序树左边的数据小于右边。显然,这样每次构建一棵二叉排序树都需要事先规定好一个数据元素序列,然后依次输入。这样的弊端就是你不细心一点就有可能构建出一棵错误的二叉排序树——非二叉排序树。优点就是可以构建自己想要的二叉排序树。

方法二:随机生成。

这里用到了C++里面的rand()函数,用于生成大于等于0的伪随机数(每次运行产生的随

机数都是固定的)。用这个函数需要使用名字空间using namespace std;同时引进#include

思路是:按依次插入结点来生成一棵二叉排序树,在插入函数里进行判断:即编写生

成二叉排序树的规则。另外,事先要有一堆结点(用于生成二叉排序树),我是事先保存在一

个数组里。然后每次产生一个伪随机数(范围是0到数组长度)作为数组下标,并把对应的该下标的数组元素插入到要生成的二叉排序树里。

其中for循环次数就是生成二叉排序树结点个数的最大值减1。最大是因为产生的伪随

机数可能会重复,而重复的结点不再插入树中。减1是因为根结点我事先就定义了,它的data默认为30,默认为30的目的是因为我可以产生0—64的伪随机数,学号范围也是暂时定在0—64这

个范围。这样规定可以照顾生成的左右子树尽量均衡,即靠近完全二叉排序树。要靠近完全二

叉树是因为到时打印一颗树的时候,打印的层数(树的深度)尽量少,因为到时候打印一棵树,深度越大就越难控制。(当然也可以把上述函数的2,3,4行注释起来,这样就要保证T一开始是

空树。)

其中InsertBST()函数为:

在插入一个结点的函数里,首先要找一下原树里有没有与即将被插入的结点元素相同

的结点元素。有的话就放弃插入,没有就进行与根结点判断大小,小就插到它的左边作为左孩子,大的就到右边。

其中查找函数SearchBST()为:

查找函数是递归定义,同时也用到了比较函数LT(a,b)。

LT(a,b)比较函数定义如下:

在比较函数里又用到了字符串比较函数strcmp(a,b)。这个函数c++里面有,只要

#include就行了。但是它比较的是字符串。由于对于我来说我的关键字是学号,比较的就是学号,所以我用比较数值型的比较函数就够了(学号暂时用两位数,因为打印树的时候占用位置少,还有就是用整形int可以存得下)。于是自己写了比较函数。

即:

函数名字忘记改了,不能见名知义,不过没关系了。

运行结果:

经过验证,是成功的生成了一棵二叉排序树。for循环了8次,此时生成了9个结点,说明产生的伪随机数没有重复,而且随机构造的树也基本左右均衡。

1.3对生成的二叉排序树插入一个节点

生成了一棵二叉排序树,接下来对它插入一个结点。(其实生成树时一直在插入,不过还是做一下验证一下。由于产生的是伪随机数,所以运行结果和上次一样)

插入关键字(学号)为27的结点后,它已成功接到关键字为26的结点右边作为其右孩子。并以树的形状打印出来。所以,插入结点是成功的。

1.4对生成的二叉排序树删除一个结点

对二叉排序树进行删除操作,删除函数代码为:

此函数也是递归调用。其中EQ()函数和LT()函数上面有说明。这里关键是Delete()函数,

定义如下:

在原来树插入结点27后,删除结点54的运行结果为:

所以,由遍历结果和打印结果知,删除是成功的。

2、对二叉排序树进行先根、中根、和后根非递归遍历;

非递归遍历要用到栈,自己有写栈的各种操作。另外,我发现可以用C++库里面人家写好的,include进来就可以直接调用,以下代码有些是用自己写的栈,有些是用C++库里面的(感觉别人写的很好用,比如调试的时候查看栈内元素就比自己写的简单明了)。思路都写在代码的注释里面面,个人觉得这样好看些,截图放入word文档就省去排版了,更方便理解。

2.1栈相关数据类型及函数定义

初始化栈InitStack()函数为:

malloc是存储空间分配函数,返回分配空间的首地址,所以一开始S.base和S.top保存的是首地址,即栈顶指针和栈底指针指向同一个地方。其实栈是一个数组。

判断栈是否为空的StackEmpty()函数:

访问元素的visit()函数:

入栈Push()函数:

入栈后栈顶指针上移,指向一个待存数据的位置。

出栈Pop()函数:

出栈后栈顶指针下移,指向下一个数据的位置。

2.2先、中、后序非递归遍历算法

思路都写在注释里面了。

遍历结果为:

验证遍历结果知,遍历成功。

2.3遍历算法总结

其实,对于二叉排序树来说,中序遍历是一个从小到大的序列。

二叉树的本质是递归定义的二叉链表,对树的操作往往离不开递归,递归形式上看起

来简单明了,调用起来却是层层嵌套,而且递归调用要保存很多信息,这些信息也应该是用栈

来保存的,另外,递归调用会占用较多的CPU资源,效率不高。

于是,我们考虑使用非递归的形式来对树进行操作,而非递归的算法却不太好理解,

可能对于我来说不确定的因素太多了吧,要自己想还真想不出来。一开始,算法也看不太懂,

特别是后序非递归比较难,本身对c语言,对指针就不是特别理解,于是只能跟着程序来调试,并参考别人写的,慢慢的才理解。个人觉得后序非递归算法用双栈法比较高大上,因为不仅充

分运用数据结构的栈,还能和先序非递归进行对比,简直是经典算法。

另外,做这几个算法的时候也遇到了许多困难,感觉对指针怕怕的,还好后来经过同

学间的讨论,以及丰富的网上资源把困难摆平了。

3、每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。

3.1打印二叉排序树

二叉排序树要用树的形状打印出来。打印二叉排序树的函数思路如下:

由于printf();函数会独占一行,就是打印换行后,就开启了新的一行,回不去原来那

一行去了。所以,要竖向打印一棵树,必须用层次遍历法,一层一层的打印,打印一层换一行。

层次遍历法主要用到了队列,就是先让根节点入队列,然后让根节点出队列,若根节

点有左、或右孩子,则让左、右孩子依次入队列。

在基于层次遍历法的基础上,最主要的就是要控制好两点:

(1)遍历到该元素时,该空多少个空格位再打印它。

(2)什么时候打印换行。

对于(1):由于第一个打印的根节点我们可以先确定它的位置,比如放在第一行,空

了32个空格位的位置。那如果它有左右孩子,它的左右孩子该空多少格呢?我的答案是空

32/2=16个和32*3/2=48个。因为要打印的树事先是不确定的,我们必须要照顾到会发生的所

有情况。当二叉排序树趋于满二叉排序树而且树的深度达到一定值时,比如5,空16和48个空格位就会让叶子结点不会挤在一个位置产生冲突。所以,我们有结论:当根节点空了n个空格位再打印时,它的左右孩子应分别空n/2和n*3/2个空格位。

对于(2):由于我们不知道要打印的树具体是怎么样的,所以不知道每一层有多少个结点,自然就不知道什么时候该换行了。但是,我们知道满二叉树是长什么样子的,所以我们可以对每一棵二叉树当做满二叉树来打印,当发现结点为空时,打印相应的空格位就行了。又因为层次遍历法没有让空孩子入队列,我们可以对它进行改进,就是让空孩子也入队列。这样做当发现队列元素为空时,就知道节点不存在,即只管打印相应空格。

关键代码如下:

其中PrintSpace()函数为:

运行结果:

成功把结点以树的形式打印出来。

但是,没有树枝感觉不太好看,于是想办法加上树枝好看点。

3.2给排序树加上树枝

思路及问题分析:

每打印一行数据时,就应该打印相应的树枝出来再进行下一行数据的打印。

所以,首先我们得有刚刚打印的那一行数据的信息(依次打印了哪些结点,每个结点是否有左右孩子),根据它来打印相应的树枝。

所以我把每一次打印的一行数据依次保存在一个临时数组temp[]中,如果是空结点也保存在数组中,这样就可以根据数组下标来判断上一次行打印了多少个结点,哪几个结点,几个空结点等等信息。然后根据相应下标循环数组,依次判断打印对应树枝。

其实还有一个思路:由于结点保存在队列里,包括空结点。那么可以根据换行条件,和标识头尾指针,应该可以直接循环队列,就不需要另外开启一个数组了。

具体代码及思路如下:

运行结果为:

于是,成功把树枝加上去。

3.3写打印树函数遇到的困难和总结

这个函数不是万能的,while循环里有一个条件n==1时会跳出循环,就是由32变到1一共换了5行,而完全二叉树第5行是有16个元素,这时我还可以打印第6行的32个元素,所以以上打印树的函数最多只能打印63个元素。因为树的深度大于5后,命令行窗口宽度固定了,空格位就很难把握了。

写这个函数是一点一点优化来的,历时长,不过挺锻炼人的,写完挺有成就感。不过当我知道有一种横向打印树的递归算法后,10行就搞定了,而且适用性很强。我就…

4、分别用二叉排序树和数组去存储一个班(50 人以上)的成员信息(至少包括学号、姓名、成绩 3 项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么?

4.1初始化数组和二叉排序树

首先用一个数组存50人以上(65个)的成员信息:

必要的初始化工作:

4.2写这个函数遇到的问题:

一开始初始化姓名的函数是这样的,打印输出也在这个函数里面。能打印输出正确的结果。

但是,回到调用它的主函数再做打印输出,结果就不一样了。

如下是某一次的输出结果部分截图:

回到主函数,发现学号和分数都初始化成功了,奇怪的是名字没有初始化成功。名字用的是最后初始化那个值,一个改变全部都改变,觉得很诡异。后来想想,name可能是同一个引用,指向了同一个地址,但是我每次循环都分配了一个不同的地址,那么我的数组元素不可能每个元素都是同一个引用,因为学号和分数都初始化成功了。唯一的区别是名字使用了字符指针或字符数组来保存。自己对指针数组不太熟,实在想不到哪里用了同一个引用。后来再想想,会不会字符串类型转换函数或者字符串拼接函数有点诡异?

于是百度了一下。猛然发现它大概是这样说的:

itoa(i,str,10);//将整数i转换成字符串存入str指向的内存空间。

这就说明,问题出在str里。果然str一直指向的都是同一个地址,所以之前的名字初始换都被最后一个名字的初始化覆盖掉了。所以每个元素都打印出相同的名字。

再调试确认一下:

发现果然是指向同一个地址了。

所以要解决这个问题,既然不能用同一个str,那我每次循环就得换一个新的str。那自然会想到把它定义成数组,可是它之前本身就是一个字符数组(用于存字符串)。那现在就要把它定义成二维数组:char str[MAX][1000];奇怪的是第二维要足够大才能把65个名字完全初始化成功,后面的会初始化成乱码。

最后把数组初始化成功,初始化结果部分截图如下:

从0到64一共初始化了65个数据元素。

现在把数组的每一个元素存到二叉排序树里。由于二排序叉树还要保存分数和名字两项信息,所以插入函数InsertBST();要修改。修改部分如下:

创建二叉排序树函数修改为:

对其进行中序遍历结果如下:

数了一下,发现刚好有65个结点。由于信息太多,用层次遍历法打印树的形状(纵向

打印)不能漂亮的打印出来,因为树的深度到了5之后,命令行窗口宽度固定了,很难把握空

格位的细微之差。但是依然可以用递归的方法横向打印出一棵树,但还是数据太多,这样打印

出来的树也很难看,我试了,一个窗口屏幕也显示不完。所以打印结果就不放上来了。

根据以上输出结果和遍历结果,说明二叉排序树保存的学生信息和数组保存的学生信

息是一样的。在这个前题下,接下来就可以做效率分析了。

4.3效率分析

书本上说,在随机情况下,二叉排序树的平均查找长度和logn是等数量级的。

就是二叉排序树的查找可以获得类似折半查找的性能。当二叉排序树趋于满二叉排序树时,查

找性能是最好的。

而数组的平均查找长度应该为n/2。那数组和二叉排序树的查找效率哪个比较高呢?

看起来好像二叉排序树性能会好点。但是数组是具有连续存储地址的一种比较特别的数据结构。对数组查找仅需做一次判断,不需要调用查找函数。而且,二叉排序树的查找需要调用查找函数,查找函数是递归。结点之间以指针相连这些都还不知道要不要花费时间。

二叉排序树和数组的性能比较:

思路是对已经初始化的二叉排序树和数组(两者具有相同的数据元素,数据元素个数

和值都是一样)进行查找某一个动态(随机)确定的数据元素n(n足够大)次,每次查找都是随机给定一个要查找的目标元素。(查找的是关键字学号,学号范围是10到99)

函数如下:

比较的结果为:

(1)当二叉排序树根结点关键字很小时,即左子树结点很少,右子树结点很多,这样树的深度自然就会较大,查找时间和树的大概形状如下:

(2)当二叉排序树根结点关键字趋于中间值时,即左子树结点个数几乎等于右子树结点个数,这样树的深度自然就会较小,趋于完全二叉排序树,查找时间和树的大概形状如下:

(3)当二叉排序树根结点关键字比较大时,即和(1)形状相反,这样树的深度也会较大,查找时间和树的大概形状如下:

由以上结果可以知道,二叉排序树的查找时间大约是500到800毫秒之间,查找时间受树的形状影响。而数组的查找时间却比较稳定,落在140到150毫秒之间。

所以可以得出结论:数组的查找效率要比二叉排序树高,查找性能较好。另外,二叉排序树在趋于完全二叉树或满二叉树时,查找效率会比较好。

5、总结:

通过这个课程设计,学到很多东西,主要是以前不愿意去学的,不知道为什么现在就会投入的去学。不知道我是不是有强迫症,反正对自己写的代码就要追求美观,格式一定要调好。但是,写论文好像是在自言自语的样子。写代码实现相应功能时确实遇到了挺多问题的,比如非递归遍历那里,指针和栈如果不处理好很容易就会很容易报错的,写打印树的函数代码也是要一点点调,曾经想通过层次遍历来给树的每个结点设置一些属性,用于打印树枝。如下代码:

后来发现是不行的,因为这样就要用到引用,这次遍历完成后,属性虽然可以设置成功,T已经不知道指向什么地方了,就是原来生成的树T已经变了,下次对T的操作就会得到错误结果。

另外,写初始化函数Init()也遇到很多问题,上面已经分析了一些。主要是对字符指针和对字符串操作不熟的原因。不过我最后使用随机数来初始化数组,然后把数组元素生成二叉排序树,简化了很多繁琐的赋值代码量。还有问题就是怎么保证全部数组元素都插到二叉排序树里面去了?像初始化学号那样,遇到重复学号就重新来一次。由于数组元素关键字都是不同的,所以也可以按照数组顺序来插。初始换操作也可以不用循环来赋值,这样代码量就比较大了。

做完这个程序,就要写论文了,难点是怎么想办法把自己的思路清晰的表达出来。其实在写程序时,我们应该把一些思路过程保存下来了(修改程序时,把原先程序注释起来,同时也尽量写多点代码注释)。

所以,总的来说,经过这些对自己的锻炼,特别是严谨性,全局观的逻辑性,对代码的敏感性都会得到大大的提高。以前遇到问题会很恼怒不知道错误出在哪里,经过一些训练后你就会很淡定的面对BUG。你会有较高的直觉发觉哪里有问题,就算没有还可以调试分析,这样再配合自己对代码的逻辑分析,丰富的学习资源,大家的帮助,我想,什么BUG也应该不在话下了吧。

六、附录(代码)

头文件:

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

//#define OVERFLOW -2

#define MAX 65

#define STACK_INIT_SIZE 100

#define STACK_INCREMENT 10

typedef int Status;

typedef int ElemType;

typedef int KeyType;

#define EQ(a,b) (!strcmp((a),(b)))

#define LT(a,b) (strcmp((a),(b)) < 0)

#define LQ(a,b) (strcmp((a),(b)) <= 0)

typedef struct BiTNode {

ElemType data;//学号

char *name;//名字

int score;//成绩

struct BiTNode *lchild,*rchild;//左右孩子指针

}BiTNode,*BiTree;

typedef struct{

BiTNode *base,*top;//栈底和栈顶指针,在栈构造之前和销毁之后,base的值为NULL

int stacksize;//栈大小,当前已分配的存储空间,已元素为单位。

}SqStack;

Status visit(ElemType elem){

printf("%d ",elem);

return OK;

}

Status InitStack(SqStack &S){//构造一个空栈

S.base = (BiTNode *)malloc(STACK_INIT_SIZE * sizeof(BiTNode));

if(!S.base)exit(OVERFLOW);//分配失败

S.top = S.base;

S.stacksize = STACK_INIT_SIZE;

return OK;

}

Status Push(SqStack &S,BiTNode *p){//插入元素p为新的栈顶元素

if(S.top - S.base >= STACK_INIT_SIZE){//栈满,追加空间

S.base=(BiTNode*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(BiTNode));

if(!S.base)exit(OVERFLOW);//分配失败

S.top = S.base + S.stacksize;

S.stacksize += STACK_INCREMENT;

}

*S.top = *p;

S.top=S.top+1;

return OK;

}

//若栈不空,则删除S的栈顶元素,用p返回其值,并返回OK,否则返回ERROR.

Status Pop(SqStack &S,BiTNode *&p){

if(S.base == S.top)return ERROR;

S.top=S.top-1;

p = S.top;

return OK;

}

Status GetTop(SqStack S,BiTNode *p){

if(S.base == S.top)return ERROR;

*p = *(S.top-1);

return OK;

}

Status StackEmpty(SqStack S){

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

数据结构课程设计报告模板

《数据结构I》三级项目报告 大连东软信息学院 电子工程系 ××××年××月

三级项目报告注意事项 1. 按照项目要求书写项目报告,条理清晰,数据准确; 2. 项目报告严禁抄袭,如发现抄袭的情况,则抄袭者与被抄袭者均 以0分计; 3. 课程结束后报告上交教师,并进行考核与存档。 三级项目报告格式规范 1. 正文:宋体,小四号,首行缩进2字符,1.5倍行距,段前段后 各0行; 2. 图表:居中,图名用五号字,中文用宋体,英文用“Times New Roman”,位于图表下方,须全文统一。

目录 一项目设计方案 (3) 二项目设计分析 (4) 三项目设计成果 (4) 四项目创新创业 (5) 五项目展望 (6) 附录一:项目成员 (6) 附录二:相关代码、电路图等 (6)

一项目设计方案 1、项目名称: 垃圾回收 2、项目要求及系统基本功能: 1)利用数据结构的知识独立完成一个应用系统设计 2)程序正常运行,能够实现基本的数据增加、删除、修改、查询等功能3)体现程序实现算法复杂度优化 4)体现程序的健壮性 二项目设计分析 1、系统预期实现基本功能: (结合本系统预期具体实现,描述出对应基本要求(增、删、改、查等)的具体功能) 1. 2. 3. 4. 5. 6. 7. 2、项目模块功能描述 (基本分为组织实施组织、程序功能模块编写、系统说明撰写等。其中程序功能子模块实现) 模块一: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块二: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块n: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

数据结构课程设计报告二叉排序树的实现

课程设计 课程名称数据结构课程设计 题目名称二叉排序树的实现 学院应用数学学院 专业班级 学号 学生 指导教师 2013 年 12 月 26 日

1.设计任务 1)实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上 用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信 息(至少包括学号、、成绩3项),对比查找效率,并说明 为什么二叉排序树效率高(或者低)。 2. 函数模块: 2.1.主函数main模块功能 1.通过bstree CreatTree()操作建立二叉排序树。 2.在二叉排序树t过操作bstree InsertBST(bstree t,int key,nametype name,double grade)插入一个节点。 3. 从二叉排序树t过操作void Delete(bstree &p)删除任意节点。 4. 在二叉排序树t过操作bstnode *SearchBST(bstree t,keytype key)查 找节点。 5. 在二叉排序树t过操作p=SearchBST(t,key)查询,并修改节点信息 6. 非递归遍历二叉排序树。 7. 定义函数void compare()对数组和二叉排序树的查找效率进行比较比 较。 2.2创建二叉排序树CreatTree模块 从键盘中输入关键字及记录,并同时调用插入函数并不断进行插入。最后,返回根节点T。 2.3删除模块: 二叉排序树上删除一个阶段相当于删去有序系列中的一个记录,只要在删除某个节点之后依旧保持二叉排序树的性质即可。假设二叉排序树上删除节点为*p(指向节点的指针为p),其双亲节点为*f(节点指针为f)。若*p节点为叶子节点,则即左右均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲节点的指针即可;若*p节点只有左子树或只有右子树,此时只要令左子树或右子树直接成为其双亲节点*f的左子树即可;若*p节点的左子树和右子树均不为空,其一可以令*p的左子树为*f的左子树,而*p的右子树为*s的右子树,其二可以令*p的直接前驱(或直接后继)替代*p,然后再从二叉排序树中删去它的直接前驱(或直接后继)。在二叉排序树中删除一个节点的算法为 void DeleteData(bstree &t,keytype key) 若二叉排序树t中存在关键字等于key的数据元素,则删除该数据元素节点,并返回TRUE,否则返回FALSE。 2.4插入模块 二叉排序树是一种动态树表,其特点是树的结构通常不是一次生成的,而是在查找的过程中,当树中不存在关键字等于给定值得节点时在进行插入。

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

数据结构课程设计(内部排序算法比较_C语言)

数据结构课程设计 课程名称:内部排序算法比较 年级/院系:11级计算机科学与技术学院 姓名/学号: 指导老师: 第一章问题描述 排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。

第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。 (2)选择2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

数据结构课程设计报告

《数据结构与算法》课程设计报告 学号: 班级序号: 姓名: 指导教师: 成绩: 中国地质大学信息工程学院地理信息系统系 2011年12 月

1.需求规格说明 【问题描述】 利用哈夫曼编码进行对已有文件进行重新编码可以大大提高减小文件大小,减少存储空间。但是,这要求在首先对一个现有文件进行编码行成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。试为完成此功能,写一个压缩/解压缩软件。 【基本要求】 一个完整的系统应具有以下功能: (1)压缩准备。读取指定被压缩文件,对文件进行分析,建立哈夫曼树,并给出分析结果(包括数据集大小,每个数据的权值,压缩前后文件的大小),在屏幕上输出。 (2)压缩。利用已建好的哈夫曼树,对文件进行编码,并将哈夫曼编码及文件编码后的数据一起写入文件中,形成压缩文件(*.Haf)。 (3)解压缩。打开已有压缩文件(*.Haf),读取其中的哈夫曼编码,构建哈夫曼树,读取其中的数据,进行译码后,写入文件,完成解压缩。 (4)程序使用命令行方式运行 压缩命令:SZip A Test.Haf 1.doc 解压缩命令:SZip X Test.Haf 2.doc或SZip X Test.Haf 用户输入的命令不正确时,给出提示。 (5)使用面向对象的思想编程,压缩/解压缩、哈夫曼构建功能分别构建类实现。 2.总体分析与设计 (1)设计思想: 1、压缩准备:1> 读文件,逐个读取字符,统计频率 2> 建立哈夫曼树 3> 获得哈弗曼编码 2、压缩过程: 1> 建立一个新文件,将储存权值和字符的对象数组取存储在文件头

课程设计二叉树

安徽理工大学 数据结构 课程设计说明书题目: 二叉树的遍历集成 院系:计算机科学与工程学院 专业班级: 学号: 学生姓名: 指导教师: 2015年 01 月 9 日

安徽理工大学课程设计(论文)任务书 计算机科学与工程学院信息安全教研室 2014年 12 月 18 日

目录 1.需求分析 (1) 2、总体设计 (1) 2.1 程序目录 (1) 2.2 算法流程 (3) 3、详细设计 (3) 3.1 界面设计 (3) 3.2 详细代码设计 (5) 3.3 调试分析 (10) 4、总结 (15) 参考文献 (16) 代码详述 (16)

1.需求分析 “数据结构”是计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心,而且也成为其他理工类学科必修课程,所谓”数据结构”是相互之间存在一种或多种特定关系的数据元素的集合.数据元素之间的相互关系成为结构,结构一般有线性结构,树形结构,图状结构,本程序所做的就是树形结构的二叉树的遍历算法和线索化查找. 本程序使用VC6.0++编写,具体实现功能有二叉树的遍历,包括先序遍历,中序遍历,后序遍历的递归算法以及非递归算法.另外本程序还有可线索化二叉树的功能,由此可以得到二叉树某个节点的前驱和后继. 题目要求为: 1.实现二叉树的各种遍历。包括先序遍历、中序遍历、后序遍历的递归和非递归算法、以及层次遍历。 2.要求能查找任一结点在某种遍历序列中的前驱和后继。 3.界面友好,易于操作。可采用菜单或其它人机对话方式进行选择。 由小组一起制作,本人做小组汇总工作,并在基础上加了查找某个节点是否存在二叉树,以及求二叉树总节点数等一些简单功能 2、总体设计 2.1 程序目录 (1)typedef struct node 二叉树的定义,包含数据域data,左孩子lchild,右孩子rchild,若二叉树为空,则头结

数据结构课程设计-排序

一、问题描述 1、排序问题描述 排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。 本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。其中包括: (1)插入排序的有关算法:不带监视哨的直接插入排序的实现; (2)交换排序有关算法:冒泡排序、快速排序的实现; (3)选择排序的有关算法:直接选择排序、堆排序的实现; (4)归并排序的有关算法:2-路归并排序的实现。 2、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。 二、问题分析 本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。 冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。 冒泡排序的步骤: 1)置初值i=1; 2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j] 与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置; 3)i=i+1; 4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止; 要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。 快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。 快速排序步骤: 1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下

二叉排序树运算-数据结构与算法课程设计报告_l

合肥学院 计算机科学与技术系 课程设计报告 2009 ~2010 学年第二学期 课程 数据结构与算法 课程设计 名称 二叉排序树运算学生姓名顾成方 学号0704011033 专业班级08计科(2) 指导教师王昆仑张贯虹 2010 年 5 月

题目:(二叉排序树运算问题)设计程序完成如下要求:对一组数据构造二叉排序树,并在二叉排序树中实现多种方式的查找。基本任务:⑴选择合适的储存结构构造二叉排序树;⑵对二叉排序树T作中序遍历,输出结果;⑶在二叉排序树中实现多种方式的查找,并给出二叉排序树中插入和删除的操作。 ⑷尽量给出“顺序和链式”两种不同结构下的操作,并比较。 一、问题分析和任务定义 本次程序需要完成如下要求:首先输入任一组数据,使之构造成二叉排序树,并对其作中序遍历,然后输出遍历后的数据序列;其次,该二叉排序树能实现对数据(即二叉排序树的结点)的查找、插入和删除等基本操作。 实现本程序需要解决以下几个问题: 1、如何构造二叉排序树。 2、如何通过中序遍历输出二叉排序树。 3、如何实现多种查找。 4、如何实现插入删除等操作。 二叉排序树的定义:

⑴其左子树非空,则左子树上所有结点的值均小于根结点的值。 ⑵若其右子树非空,则右子树上所有结点的值大于根结点的值。 ⑶其左右子树也分别为二叉排序树。 本问题的关键在于对于二叉排序树的构造。根据上述二叉排序树二叉排序树的生成需要通过插入算法来实现:输入(插入)的第一个数据即为根结点;继续插入,当插入的新结点的关键值小于根结点的值时就作为左孩子,当插入的新结点的关键值大于根结点的值时就作为右孩子;在左右子树中插入方法与整个二叉排序树相同。当二叉排序树建立完成后,要插入新的数据时,要先判断已建立的二叉排序树序列中是否已有当前插入数据。因此,插入算法还要包括对数据的查找判断过程。 本问题的难点在于二叉排序树的删除算法的实现。删除前,首先要进行查找,判断给出的结点是否已存在于二叉排序树之中;在删除时,为了保证删除结点后的二叉树仍为二叉排序树,要考虑各种情况,选择正确

数据结构课程设计报告

《数据结构课程设计》报告 题目:课程设计题目2教学计划编制 班级:700 学号:09070026 姓名:尹煜 完成日期:2011年11月7日

一.需求分析 本课设的任务是根据课程之间的先后的顺序,利用拓扑排序算法,设计出教学计划,在七个学期中合理安排所需修的所有课程。 (一)输入形式:文件 文件中存储课程信息,包括课程名称、课程属性、课程学分以及课程之间先修关系。 格式:第一行给出课程数量。大于等于0的整形,无上限。 之后每行按如下格式“高等数学公共基础必修6.0”将每门课程的具体信息存入文件。 课程基本信息存储完毕后,接着给出各门课程之间的关系,把每门课程看成顶点,则关系即为边。 先给出边的数量。大于等于0的整形。 默认课程编号从0开始依次增加。之后每行按如下格式“1 3”存储。此例即为编号为1的课程与编号为3的课程之间有一条边,而1为3的前驱,即修完1课程才能修3课程。 例: (二)输出形式:1.以图形方式显示有向无环图

2.以文本文件形式存储课程安排 (三)课设的功能 1.根据文本文件中存储的课程信息(课程名称、课程属性、课程学分、课程之间关系) 以图形方式输出课程的有向无环图。 拓展:其显示的有向无环图可进行拖拽、拉伸、修改课程名称等操作。 2.对课程进行拓扑排序。 3.根据拓扑排序结果以及课程的学分安排七个学期的课程。 4.安排好的教学计划可以按图形方式显示也可存储在文本文件里供用户查看。 5.点击信息菜单项可显示本人的学好及姓名“09070026 尹煜” (四)测试数据(见六测设结果)

二.概要设计 数据类型的定义: 1.Class Graph即图类采用邻接矩阵的存储结构。类中定义两个二维数组int[][] matrix 和Object[][] adjMat。第一个用来标记两个顶点之间是否有边,为画图服务。第二个 是为了实现核心算法拓扑排序。 2.ArrayList list用来存储课程信息。DrawInfo类是一个辅助画图的类,其中 包括成员变量num、name、shuxing、xuefen分别代表课程的编号、名称、属性、 学分。ArrayList是一个DrawInfo类型的数组,主要用来在ReadFile、DrawG、DrawC、SaveFile、Window这些类之间辅助参数传递,传递课程信息。 3.Class DrawInfo, 包括int num;String name;String shuxing;float xuefen;四个成员变量。 4.Class Edge包括int from;int to;double weight;三个成员变量。 5.Class Vertex包括int value一个成员变量。 主要程序的流程图: //ReadFile.java

数据结构课程设计排序实验报告

《数据结构》课程设计报告 专业 班级 姓名 学号 指导教师 起止时间

课程设计:排序综合 一、任务描述 利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 要求:根据以上任务说明,设计程序完成功能。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)随机生成N个整数,存放到线性表中; (2)起泡排序并计算所需时间; (3)简单选择排序并计算时间; (4)希尔排序并计算时间; (5)直接插入排序并计算所需时间; (6)时间效率比较。 2、数据对象分析 存储数据的线性表应为顺序存储。 三、数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计

数据结构课程设计报告

编号 课程设计 题目 1、一元稀疏多项式计算器 2、模拟浏览器操作程序 3、背包问题的求解 4、八皇后问题 二级学院计算机科学与工程学院 专业计算机科学与技术 班级 2011级 37-3班 学生姓名 XX 学号 XXXXXXXXXX 指导教师 XXXXX 评阅教师 时间 1、一元稀疏多项式计算器 【实验内容】 一元稀疏多项式计算器。

【问题描述】 设计一个一元稀疏多项式简单计算器。 【需求分析】 其基本功能包括: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列为:n,c1,e1,c2,e2,……,cn,en,其中n 是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相减,建立多项a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值; (6)计算器的仿真界面(选做); 【概要设计】 -=ADT=- { void input(Jd *ha,Jd *hb); void sort(dnode *h)

dnode *operate(dnode *a,dnode *b) float qiuzhi(int x,dnode *h) f",sum); printf("\n"); } 【运行结果及分析】 (1)输入多项式:

(2)输出多项式(多项式格式为:c1x^e1+c2x^e2+…+cnx^en): (3)实现多项式a和b相加: (4)实现多项式a和b相减: (5)计算多项式在x处的值:

2、模拟浏览器操作程序 【实验内容】 模拟浏览器操作程序 【问题描述】 标准Web浏览器具有在最近访问的网页间后退和前进的功能。实现这些功能的一个方法是:使用两个栈,追踪可以后退和前进而能够到达的网页。在本题中,要求模拟实现这一功能。 【需求分析】 需要支持以下指令: BACK:将当前页推到“前进栈”的顶部。取出“后退栈”中顶端的页面,使它成为当前页。若“后退栈”是空的,忽略该命令。 FORWARD:将当前页推到“后退栈”的顶部。取出“前进栈”中顶部的页面,使它成为当前页。如果“前进栈”是空的,忽略该命令。 VISIT:将当前页推到“后退栈”的顶部。使URL特指当前页。清空“前进栈”。 QUIT:退出浏览器。 假设浏览器首先加载的网页URL是:http:

二叉排序树的实现_课程设计报告

中北大学 数据结构 课程设计说明书 2011年12月20日

1.设计任务概述:

功能描述: (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)输入元素x,查找二叉排序树T,若存在含x的结点,则删除该结点,并作中序遍历(执行操作2);否则输出信息“无x”。 2.本设计所采用的数据结构 二叉树及二叉链表 3.功能模块详细设计 详细设计思想 建立二叉排序树采用边查找边插入的方式。查找函数采用递归的方式进行查找。如果查找到相等的则插入其左子树。然后利用插入函数将该元素插入原树。 对二叉树进行中序遍历采用递归函数的方式。在根结点不为空的情况下,先访问左子树,再访问根结点,最后访问右子树。 删除结点函数,采用边查找边删除的方式。如果没有查找到,进行提示;如果查找到结点则将其左子树最右边的节点的数据传给它,然后删除其左子树最右边的节点。 核心代码 (1)主菜单模块 int main(){ LNode root=NULL; int Num,a,x; printf("\n\n *******************************\n"); printf(" ************主菜单*************\n"); printf(" *1:进行中序排列*\n"); printf(" *2:进行删除操作

*\n"); printf(" *3:退出*\n"); printf(" *******************************\n"); printf("请输入要进行操作的数字以0结束:\n"); 运行结果 (3)中序遍历模块 void view(LNode p){

数据结构课程设计

《数据结构》 课程设计报告 学号 姓名 班级 指导教师 安徽工业大学计算机学院 2010年6月

建立二叉树和线索二叉树 1.问题描述: 分别用以下方法建立二叉树并用图形显示出来: 1)用先序遍历的输入序列 2)用层次遍历的输入序列 3)用先序和中序遍历的结果 2.设计思路: 分三个方式去实现这个程序的功能,第一个实现先序遍历的输入数列建立二叉树;第二个是用层次遍历的方法输入序列;第三个是用先序和后序遍历的结果来建立二叉树;三种方法建立二叉树后都进行输出。关键是将这三个实现功能的函数写出来就行了;最后对所建立的二叉树进行中序线索化,并对此线索树进行中序遍历(不使用栈)。 3.数据结构设计: 该程序的主要目的就是建立二叉树和线索二叉树,所以采用树的存储方式更能完成这个程序; 结点的结构如下: typedef struct bnode { DataType data; int ltag,rtag; struct bnode *lchild, *rchild; } Bnode, *BTree; 4.功能函数设计: BTree CreateBinTree() 用先序遍历的方法讲二叉树建立; BTree CREATREE() 用队列实现层次二叉树的创建; void CreatBT(); 用先序和中序遍历的结果建立二叉树; void InThread(BTree t,BTree pre) 中序线索化; 5.编码实现: #include #include #define max 100 typedef struct bnode { char data; int ltag,rtag; struct bnode *lchild,*rchild; }Bnode,*BTree; BTree Q[max]; BTree CREATREE() { char ch; int front=1,rear=0;

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

数据结构课程设计报告

数据结构课程设计 设计说明书 TSP 问题 起止日期:2016 年 6 月27 日至2016 年7 月 1 日 学生姓名 班级 学号 成绩 指导教师( 签字) 2016 年7 月 1 日

目录 第1 章需求分析.................................................................................1... 1.1 简介 (1) 1.2 系统的开发背景 (1) 1.3 研究现状 (1) 第2 章概要设计.................................................................................2... 2.1 系统开发环境和技术介绍 (2) 2.2 系统需求分析 (2) 2.2.1 总体功能分析 (2) 2.2.2 核心功能分析 (3) 第3 章详细设计...................................................................................4... 3.1 系统开发流程 (4) 3.2 系统模块设计 (4) 3.3 系统结构 (6) 3.2 系统流程图 (6) 第4 章调试分析...................................................................................7... 4.1 程序逻辑调试 (7) 4.2 系统界面调试 (8) 第5 章测试结果...................................................................................9... 5.1 测试环境 (9) 5.2 输入输出测试项目 (9) 5.3 测试结果 (10) 结论.....................................................................................................1..1.. 参考文献................................................................................................1..1. 附录.......................................................................................................1..2..

数据结构课程设计

一、高校社团管理 在高校中,为了丰富学生的业余生活,在学校的帮助下,会成立许多社团,少则几个,多则几十个。为了有效管理这些社团,要求编写程序实现以下功能:1.社团招收新成员; 2.修改社团相应信息 3.老成员离开社团 4.查询社团情况; 5.统计社团成员数; 二、简单文本编辑器 设计一个文本编辑器,允许将文件读到内存中,也就是存储在一个缓冲区中。这个缓冲区将作为一个类的内嵌对象实现。缓冲区中的每行文本是一个字符串,将每行存储在一个双向链表的结点中,要求设计在缓冲区中的行上执行操作和在单个行中的字符上执行字符串操作的编辑命令。 基本要求: 包含如下命令列。可用大写或小写字母输入。 R:读取文本文件到缓冲区中,缓冲区中以前的任何内容将丢失,当前行是文件的第一行; W:将缓冲区的内容写入文本文件,当前行或缓冲区均不改变。 I:插入单个新行,用户必须在恰当的提示符的响应中键入新行并提供其行号。 D:删除当前行并移到下一行; F:可以从第1行开始或从当前行开始,查找包含有用户请求的目标串的第一行; C:将用户请求的字符串修改成用户请求的替换文本,可选择是仅在当前行中有效的还是对全文有效的。 Q:退出编辑器,立即结束; H:显示解释所有命令的帮助消息,程序也接受?作为H的替代者。 N:当前行移到下一行,也就是移到缓冲区的下一行; P:当前行移到上一行,也就是移到缓冲区的上一行;

B:当前行移到开始处,也就是移到缓冲区的第一行; E:当前行移到结束处,也就是移到缓冲区的最后一行; G:当前行移到缓冲区中用户指定的行; V:查看缓冲区的全部内容,打印到终端上。 三、电话客户服务模拟 一个模拟时钟提供接听电话服务的时间(以分钟计),然后这个时钟将循环的 自增1(分钟)直到达到指定时间为止。在时钟的每个"时刻",就会执行一次检查来看看对当前电话服务是否已经完成了,如果是,这个电话从电话队列中删除,模 拟服务将从队列中取出下一个电话(如果有的话)继续开始。同时还需要执行一个检查来判断是否有一个新的电话到达。如果是,其到达时间被记录下来,并为其产生一个随机服务时间,这个服务时间也被记录下来,然后这个电话被放入电话队列中,当客户人员空闲时,按照先来先服务的方式处理这个队列。当时钟到达指定时间时,不会再接听新电话,但是服务将继续,直到队列中所偶电话都得到处理为止。 基本要求: (1)程序需要的初始数据包括:客户服务人员的人数,时间限制,电话的到达速率,平均服务时间 (2)程序产生的结果包括:处理的电话数,每个电话的平均等待时间 四、停车场管理 设停车场是一个可停放n辆车的狭长通道,且只有一个大门可供汽车进出。在停车场内,汽车按到达的先后次序,由北向南依次排列(假设大门在最南端)。若停车场内已停满n辆车,则后来的汽车需在门外的便道上等候,当有车开走时,便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车辆必须先退出停车场为它让路,待该辆车开出大门后,其他车辆再按原次序返回车场。每辆车离开停车场时,应按其停留时间的交费(从进入便道开始计时)。在这里假设汽车从便道上开走时不收取任何费用 基本要求: (1)汽车的输入信息格式为(到达/离去的标识,汽车牌照号码,到达/离去的时间)

数据结构课程设计(附代码)

上海应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 姓名学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计内容说明 1. 项目一 (1) 对设计任务内容的概述 学生成绩管理** 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面

(3) 程序流程图 (4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数中通过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

数据结构课程设计报告-学生成绩管理系统[]

武汉理工大学华夏学院课程设计报告书 课程名称:数据结构课程设计 题目:用C语言实现成绩统计程序的设计系名:信息工程系 专业班级:计算机1121 姓名:吴涛 学号:10210412104 指导教师:司晓梅 2016年3 月20日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:数据结构课程设计指导教师:司晓梅班级名称:计算机1121 开课系、教研室:信息系计算机 一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应操作,把现实世界中的问题转换为计算机内部的表示和处理,这就是一个良好的程序设计技能训练的过程。提高学生的程序设计能力、掌握基本知识、基本技能,提高算法设计质量与程序设计素质的培养就是本门课程的课程设计的目的。 任务:根据题目要求,完成算法设计与程序实现,并按规定写出课程设计报告。 二、课程设计的内容与基本要求 设计题目:用C语言实现成绩统计程序的设计 〔问题描述〕给出n个学生的m门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法: (1)输入每个人的各门课程的成绩,计算每人的平均成绩; (2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次; (3)按名次列出每个学生的姓名和各科成绩; 〔基本要求〕学生的考试成绩必须通过键盘输入,且需对输出进行格式控制; 〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解; 具体要完成的任务是: A. 编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。 B. 写出规范的课程设计报告书; 三、课程设计步骤及时间进度和场地安排 时间:1周地点:现代教育中心 具体时间安排如下: 第一天:布置题目,确定任务、查找相关资料 第二天~第四天:功能分析,编写程序,调试程序、运行系统; 第五天上午:撰写设计报告; 第五天下午:程序验收、答辩。 四、课程设计考核及评分标准

数据结构课程设计报告

数据结构课程设计报告 题目:5 班级:计算机1102 学号:4111110030 姓名:陈越 指导老师:王新胜

一:需求分析 1.运行环境 TC 2.程序所需实现的功能 几种排序算法的演示,要求给出从初始开始时的每一趟的变化情况,并对各种排序算法性能作分析和比较: (1)直接插入排序; (2)折半插入排序; (3)冒泡排序; (4)简单选择排序; (5)快速排序; (6)堆排序; (7)归并排序. 二:设计说明 1.算法设计的思想 1)、直接插入排序 排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。 2)、折半插入排序 排序过程:用折半查找方法确定插入位置的排序叫折半插入排序。 3)、冒泡排序

排序过程:将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r[1].key>r[2].key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止 4)、简单选择排序 排序过程:首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换。再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换。重复上述操作,共进行n-1趟排序后,排序结束。 5)、快速排序 基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。 排序过程:对r[s……t]中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=r[s],x=rp.key。初始时令i=s,j=t。首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换。再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换。重复上述两步,直至i==j为止。再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止。 6)、堆排序 排序过程:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输

相关文档
最新文档