数据结构实验报告三
实训报告数据结构项目(3篇)

第1篇 一、项目背景 随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础学科,其理论研究和实际应用都得到了广泛的关注。为了提高学生对数据结构理论的理解和应用能力,我们开展了本次数据结构实训项目。本项目旨在通过实际操作,让学生掌握常见数据结构的设计、实现和运用,为后续课程学习和实际工作打下坚实的基础。
二、项目目标 1. 理解常见数据结构(如线性表、栈、队列、链表、树、图等)的基本概念和性质;
2. 掌握数据结构的实现方法,包括顺序存储结构和链式存储结构; 3. 能够运用数据结构解决实际问题,提高编程能力; 4. 培养团队协作能力和项目开发经验。 三、项目内容 1. 线性表 线性表是最基本的数据结构,包括顺序表和链表两种存储方式。实训中,我们实现了顺序表和链表的基本操作,如插入、删除、查找等。
2. 栈 栈是一种后进先出(LIFO)的数据结构。实训中,我们实现了栈的顺序存储和链式存储,并实现了入栈、出栈、判断栈空等基本操作。
3. 队列 队列是一种先进先出(FIFO)的数据结构。实训中,我们实现了队列的顺序存储和链式存储,并实现了入队、出队、判断队列空等基本操作。
4. 链表 链表是一种非连续存储的数据结构,由一系列节点组成。实训中,我们实现了单链表、双向链表和循环链表,并实现了插入、删除、查找等基本操作。
5. 树 树是一种层次结构的数据结构,由节点组成。实训中,我们实现了二叉树、二叉搜索树、平衡二叉树等,并实现了查找、插入、删除等基本操作。
6. 图 图是一种由节点和边组成的数据结构,表示对象之间的关系。实训中,我们实现了图的邻接矩阵和邻接表存储方式,并实现了图的遍历、最短路径查找等基本操作。
四、项目实施过程 1. 项目启动:确定项目目标、任务分工、时间安排等。 2. 理论学习:对数据结构的基本概念、性质、实现方法进行深入学习。 3. 编程实现:根据项目需求,编写相关数据结构的实现代码。 4. 测试与调试:对实现的代码进行测试,发现并解决存在的问题。 5. 项目总结:对项目实施过程进行总结,提出改进意见。 五、项目成果 1. 实现了常见数据结构的基本操作,如插入、删除、查找等。 2. 编写了数据结构的实现代码,并成功通过了测试。 3. 培养了学生的编程能力和团队协作能力。 4. 为后续课程学习和实际工作打下了坚实的基础。 六、项目反思 1. 在项目实施过程中,部分同学对数据结构的基本概念理解不够深入,导致编程过程中出现错误。
数据结构实验报告 (3)

数据结构实验报告(五)实验目的:1.掌握顺序表的查找方法,尤其是二分查找方法。
2.掌握二叉排序树的建立及查找。
实验任务:1.对下列数据表,分别采用二分查找算法实现查找,给出查找过程依次所比较的元素(的下标),并以二分查找的判定树来解释。
实验测试数据:数据表为(1,2,3,4,6,7,8,9,10,11,12,13,17,18,19,20,24,25,26,30,35,40,45,50,100)查找的元素分别为:2,8,20, 30,50,5,15,33,1102.设计出在二叉排序树中插入结点的算法,在此基础上实现构建二叉排序树的算法,并给出其中序遍历序列。
实验测试数据:构建二叉排序树的输入序列如下:100,150,120,50,70,60,80,170,180,160,110,30,40,35,1753.设计算法在二叉排序树中查找指定值的结点。
在任务2所建立的二叉排序树中分别查找下列元素:150,70,160,190,10,55,1754.设计算法在二叉排序树中删除特定值的结点。
(选做)在任务2所建立的二叉排序树中依次删除下列元素:30,150,100,并给出中序遍历结果。
程序清单:1.#include<iostream>using namespace std;int key_lib[]={1,2,3,4,6,7,8,9,10,11,12,13,17,18,19,20,24,25,26,30,35,40,45,50,100};int halfsearch(int *lib,int low,int high,int key){static int mid;if(low>high) return -1;else{mid=(low+high)/2;cout<<mid<<" ";if(key<lib[mid]) return halfsearch(lib,low,mid-1,key);else if(key>lib[mid]) return halfsearch(lib,mid+1,high,key);else return mid;}}void main(){cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,2)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,8)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,20)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,30)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,50)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,5)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,15)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,33)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;cout<<"输出查找的顺序为:";if(halfsearch(key_lib,0,24,110)==-1)cout<<"查无此数!"<<endl;elsecout<<endl;}2.3.#include<iostream>using namespace std;struct node{node *lchild;node *rchild;int data;};class searchtree{public:searchtree(int *r,int n);~searchtree(){delete_tree(root);}void Insert(node *&innode,node *s);node *Search(int k){return Search(root,k);}void travel(){travel(root);}private:node *root;void travel(node *p);void delete_tree(node *t);node *Search(node *snode,int k);};searchtree::searchtree(int *r,int n){node *s;root=NULL;for(int i=0;i<n;i++){s=new node;s->data=r[i];s->lchild=s->rchild=NULL;Insert(root,s);}}void searchtree::Insert(node *&innode,node *s){if(innode==NULL)innode=s;else if(s->data<innode->data)Insert(innode->lchild,s);elseInsert(innode->rchild,s);}node * searchtree::Search(node *snode,int k){if(snode==NULL)return NULL;if(snode->data==k) return snode;else if(snode->data>k) return Search(snode->lchild,k);else return Search(snode->rchild,k);}void searchtree::travel(node *p){if(p==NULL) return;travel(p->lchild);cout<<p->data<<" ";travel(p->rchild);}void searchtree::delete_tree(node *t){if(t==NULL) return;delete_tree(t->lchild);delete_tree(t->rchild);delete t;}void main(){int lib[]={100,150,120,50,70,60,80,170,180,160,110,30,40,35,175};searchtree q(lib,15);q.travel();if(q.Search(150)!=NULL)cout<<"150在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(70)!=NULL)cout<<"70在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(160)!=NULL)cout<<"160在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(190)!=NULL)cout<<"190在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(10)!=NULL)cout<<"10在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(55)!=NULL)cout<<"55在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;if(q.Search(175)!=NULL)cout<<"175在这个排序树中"<<endl;else cout<<"未找到这个数!"<<endl;}运行结果:1.2.。
《数据结构》实验报告

《数据结构》实验报告目录一、实验概述 (2)二、实验原理 (2)2.1 数据结构基本概念 (3)2.2 选择的数据结构类型 (4)2.3 实验原理说明 (5)三、实验步骤 (6)3.1 实验准备 (7)3.2 数据结构选择与实现 (7)3.2.1 数据结构类型选择 (9)3.2.2 数据结构实现细节 (9)3.3 实验功能实现 (10)3.3.1 功能一 (11)3.3.2 功能二 (12)四、实验结果与分析 (13)4.1 实验数据 (15)4.2 结果展示 (16)4.2.1 结果一展示 (17)4.2.2 结果二展示 (17)4.3 结果分析 (18)4.3.1 结果一分析 (19)4.3.2 结果二分析 (20)五、实验总结与讨论 (22)5.1 实验总结 (23)5.2 实验中遇到的问题及解决方法 (24)5.3 对数据结构的认识与体会 (25)5.4 对实验教学的建议 (27)一、实验概述本次实验旨在通过实际操作,加深对《数据结构》课程中所学理论知识的理解和掌握。
实验内容围绕数据结构的基本概念、常用算法以及在实际应用中的实现进行设计。
通过本次实验,学生将能够:理解并掌握线性表、栈、队列、链表、树、图等基本数据结构的特点和适用场景。
掌握常用的数据结构操作算法,如插入、删除、查找等,并能够运用这些算法解决实际问题。
学习使用C++、或其他编程语言实现数据结构的操作,提高编程能力和算法设计能力。
本次实验报告将对实验的目的、内容、步骤、结果及分析等方面进行详细阐述,旨在通过实验过程的学习,提高学生对数据结构理论知识的理解和应用能力。
二、实验原理数据结构的基本概念:介绍数据结构的基本定义,包括数据元素、数据集合、数据关系等基本概念,以及数据结构的三要素:逻辑结构、存储结构和运算。
栈和队列:介绍栈和队列的定义、特点、基本运算及其在算法设计中的重要性。
树和二叉树:讲解树的基本概念、二叉树的结构特点、遍历方法、二叉搜索树及其在数据检索中的应用。
数据结构实验报告(实验三)

数据结构实验报告(实验三)深圳大学实验报告课程名称:数据结构实验与课程设计实验项目名称:实验三:栈的应用学院:计算机与软件学院专业:指导教师:蔡平报告人:文成学号:2011150259 班级: 5 实验时间:2012-10-08实验报告提交时间:2012-10-20教务部制一、实验目的与要求:目的:1.掌握线性表的基本原理2.掌握线性表地基本结构3.掌握线性表地创建、插入、删除、查找的实现方法要求:1.熟悉C++语言编程2.熟练使用C++语言实现线性表地创建、插入、删除、查找的实现方法二、实验内容:Problem A: 数据结构——实验3——STL堆栈对象的例程Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 103 Solved: 85[Submit][Status][Web Board]Description掌握C++中STL自带的堆栈对象应用。
演示堆栈对象的各种操作,以字符串的逆序输出为例子输入一个字符串,按输入顺序将字符压入堆栈,然后根据堆栈后进先出的特点,做逆序输出Input第一行输入t,表示有t个测试实例第二起,每一行输入一个字符串,注意字符串不要包含空格Output每行逆序输出每一个字符串Sample Input2abcdefaabbccSample OutputfedcbaccbbaaHINTProblem B: 数据结构——实验3——堆栈应用之括号匹配Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 365 Solved: 120[Submit][Status][Web Board]Description处理表达式过程中需要对括号匹配进行检验,括号匹配包括三种:“(”和“)”,“[”和“]”,“{”和“}”。
例如表达式中包含括号如下:( ) [ ( ) ( [ ] ) ] { }1 2 3 4 5 6 7 8 9 10 11 12从上例可以看出第1和第2个括号匹配,第3和第10个括号匹配,4和5匹配,6和9匹配,7和8匹配,11和12匹配。
数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
数据结构实验报告

数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
数据结构实验报告及心得体会
数据结构实验报告及心得体会一、概述:介绍本次实验的目的、背景以及所使用的实验环境和工具。
本次实验旨在通过实际操作,深入理解和掌握数据结构的原理及应用。
实验背景源于课程学习的理论知识与实际应用相结合的需求,通过实验操作,期望能够将课堂所学的数据结构知识更好地运用到实际编程和解决现实问题中。
本次实验所使用的实验环境为先进的计算机实验室,配备了高性能的计算机硬件和丰富的软件开发工具。
为了完成实验,我使用了Java编程语言,并结合Eclipse开发环境进行编程和调试。
我还参考了相关的数据结构专业书籍和在线资源,以便更好地理解和应用数据结构知识。
在实验过程中,我严格按照实验指导书的步骤进行操作,并认真记录了实验数据和结果。
通过本次实验,我深刻体会到了数据结构的重要性,也对数据结构的实现和应用有了更深入的了解。
二、实验内容:分别介绍线性数据结构(线性表)、非线性数据结构(二叉树、图)的实验内容,包括其实现方法、操作过程等。
每个实验都包含具体的实验目的和预期结果。
三、实验过程及结果分析:详细描述实验过程,包括实验步骤的执行情况,遇到的问题及解决方法。
对实验结果进行展示,并进行数据分析和结论。
这部分是实验报告的核心部分,体现了学生的实践能力和问题解决能力。
四、心得体会:分享在实验过程中的心得体会,包括遇到的困难、收获,对数据结构的理解与认识提升,以及实验过程中的团队协作和学习体验等。
这部分内容可以体现出学生的思考深度和学习的主观感受。
五、总结与展望:对本次实验报告进行总结,并对未来数据结构与算法的学习提出展望和建议。
这部分内容可以帮助学生梳理所学知识,明确未来的学习方向。
《数据结构》实验3链表
三、源代码以及实验结果为
四、源代码以及实验结果为
五、源代码以及实验结果为
六、源代码以及实验结果为
七、附加题以及实验体会:
{
NODE *s; /*定义指向结点类型的指针*/
s=(NODE *)malloc(sizeof(NODE));
/*生成新结点*/
3
4
5
return 1;
}
/*删除P所指向的结点的后继结点*/
void DelLinkList(NODE *p)
{ NODE *q;
if(p->next!=0)
{ q=p->next; /* q指向p的后继结点*/
ch=getchar();
while(ch!='$')
{ p=(NODE *)malloc(sizeof(NODE));
p->data=ch;
1
2
ch=getchar();
}
return (head);
}
/*在链表的P指定结点之后插入值为x的结点*/
int InsLinkList(NODE *p, char x)
四、设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
五、已知单链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。要求:利用原表中的结点空间作为这两个表的结点空间,头结点可另开辟空间。
附加题:如果换成循环单链表该如何实现?
即题目变成:已知单循环链表表示的线性表中含有两类的数据元素(字母字符,数字字符)。试设计算法,按结点的值将单链表拆分成两个循环链表,分别只含有数字或字母。
数据结构实验报告
数据结构实验报告数据结构实验报告1.实验目的1.1 理解数据结构的基本概念和原理1.2 掌握数据结构的常用算法和操作方法1.3 培养编写高效数据结构代码的能力2.实验背景2.1 数据结构的定义和分类2.2 数据结构的应用领域和重要性3.实验内容3.1 实验一:线性表的操作3.1.1 线性表的定义和基本操作3.1.2 实现顺序存储结构和链式存储结构的线性表 3.1.3 比较顺序存储结构和链式存储结构的优缺点3.2 实验二:栈和队列的实现3.2.1 栈的定义和基本操作3.2.2 队列的定义和基本操作3.2.3 比较栈和队列的应用场景和特点3.3 实验三:树的操作3.3.1 树的定义和基本概念3.3.2 实现二叉树的遍历和插入操作3.3.3 比较不同类型的树的存储结构和算法效率3.4 实验四:图的遍历和最短路径算法3.4.1 图的定义和基本概念3.4.2 实现深度优先搜索和广度优先搜索算法3.4.3 实现最短路径算法(例如Dijkstra算法)4.实验步骤4.1 实验一的步骤及代码实现4.2 实验二的步骤及代码实现4.3 实验三的步骤及代码实现4.4 实验四的步骤及代码实现5.实验结果与分析5.1 实验一的结果和分析5.2 实验二的结果和分析5.3 实验三的结果和分析5.4 实验四的结果和分析6.实验总结6.1 实验心得体会6.2 实验中存在的问题及解决方案6.3 对数据结构的理解和应用展望7.附件实验所使用的源代码、运行截图等相关附件。
8.法律名词及注释8.1 数据结构:指计算机中数据的存储方式和组织形式。
8.2 线性表:一种数据结构,其中的元素按照顺序排列。
8.3 栈:一种特殊的线性表,只能在一端进行插入和删除操作。
8.4 队列:一种特殊的线性表,按照先进先出的顺序进行插入和删除操作。
8.5 树:一种非线性的数据结构,由节点和边组成。
8.6 图:一种非线性的数据结构,由顶点和边组成。
数据结构课程实验报告
数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。
在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。
本文将对我在数据结构课程中的实验进行总结和分析。
实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。
通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。
实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。
在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。
同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。
实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。
在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。
通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。
实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。
在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。
通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。
实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。
在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。
通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。
结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构 实验报告
实验题目: 二叉排序树 班 级: 计算机141(专升本) 姓 名: 黄跃翔 学 号: 14501111 完成日期: 2015年6月12日 2
一、需求分析(说明实验任务,包括输入、输出、功能、测试数据等) 1.问题描述(Problem Description): 输入一个整数关键字序列L,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。
具体要求: 输入数据的第一行为一个正整数T, 表示测试数据的组数。然后是T组测试数据。每组测试数据的第一行输入正整数n(5≤n≤20),第二行输入n个整数,要求依次完成以下工作:
(1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key,对该二叉排序树进行查找,若在该二叉排序树中存在这个整数key,则输出find,否则输出not find。
(4) 输入一个整数key,若该二叉排序树中不存在这个整数key,则将key插入到该二叉排序树中,使插入后仍为原性质的二叉排序树;否则不必插入;
(5) 在(4)的基础上,按递减顺序输出该二叉排序树中的整数(关键字)。 2.对于输入输出的要求: Input(输入) 输入数据的第一行为一个正整数T, 表示测试数据的组数。然后是T组测试数据。每组测试数据的第一行输入正整数n(5≤n≤20),第二行输入n个整数,第三和第四行均输入整数key。 Output(输出) 每组输出的第一行为按递增顺序输出该二叉排序树中的整数(关键字),每两个整数之间一个空格;第二行为find或not find;第三行为按递减顺序输出该二叉排序树中的整数(关键字)。 4.测试数据总共有两组: 第一组 8 10 79 6 81 43 75 26 69 3
43 69 第二组 10 94 22 25 24 20 42 39 71 53 57 88 1 5.测试数据结果输出: 第一组: 6 10 26 43 69 75 79 81 find 81 79 75 69 43 26 10 6 第二组: 20 22 24 25 39 42 53 57 71 94 not find 94 71 57 53 42 39 25 24 22 20 1 二、概要设计(数据类型的定义、算法思想、主程序和子程序(或功能)模块
的说明及各程序模块之间的层次(调用)关系)
1.数据结构 typedef struct node // 二叉排序树中的结点结构 { int data; // 整数(关键字)数据域 struct node *lchild,*rchild; // 指向左右孩子的指针 }nodeb,*bitree;
2.算法思想
第一部分: 建立二叉排序树。其关键字要求是各不相同的,则对于输入的关键字序列中的每一个整数,要在正在建立的二叉排序树中去查找是否已经存在该整数,不存在时,由查找模块返回要插入的结点位置的双亲结点,根据要建立的二叉排序树的性质,当要增加的整数比双亲结点的整数小的话就插到其左孩子的位置,否则插到其右孩子的位置。这样重复,直到输入结束(输入的整数为-1)为止。 4
第二部分: 查找算法是从二叉排序树的根结点开始,根据要查找的整数,若比其当前二叉排序树结点中的整数小就进入其左孩子所在的左子树中继续搜索,否则进入其右左孩子所在的右子树中继续搜索,这过程中,每进入子树前,保存当前结点,以便带回要插入结点的双亲结点。搜索直至找到要查找的整数,用一指针带回;或搜索直至叶子结点的下方,找不到要查找的整数而使空指针带回,以便判断要查找的整数是否找到。
第三部分: 按递增顺序输出该二叉排序树中的整数(关键字),可直接用某种二叉树的遍历算法实现;按递减顺序输出该二叉排序树中的整数(关键字),只要对某种二叉树的遍历算法稍作修改即可。同时插入算法思路和建立二叉排序树时增加一个整数的思路是一样的。
3.主程序 int main() { 重复m组: 调用createbintree()算法建立二叉排序树t; 调用某种二叉树遍历算法按递增顺序输出该二叉排序树中的整数(关键字); 输入要查找的整数,调用searchbst()算法查找要查找的整数; 根据查找的结果输出相应的信息; 输入要插入的整数,调用insertbst()算法将整数插入到二叉排序树中; 根据插入的结果输出相应的信息; 调用稍作修改的某种二叉树遍历算法按递减顺序输出该二叉排序树中的整数(关键字); }
4.子程序(或功能)模块 ①建立二叉排序树算法 bitree createbintree(int n) 建立有n个整数的二叉排序树,其二叉排序树t,用函数值返回树 { 定义几个树; 5
定义2个int变量; 置t为空树; for(n次) { 置上面某一数为空树 输入整数; 查找该整数; if(该整数在当前的二叉排序树中不存在) { 申请结点; 对该结点赋以该整数; 该结点的左右指针赋空值; 根据查找的结果,把该结点挂到某结点的左孩子或右孩子位置 // 注意当二叉排序树还是空树时情况的处理 } } 返回建好的二叉排序树t; } ②查找算法 void searchbst(bitree t,bitree *f,bitree *p,int key) //在二叉排序树t中查找整数为key的结点,若找到,则p指向该结点,否则p为空。f 为指向双亲结点的 { while(t不空且t中的整数不是要找的整数key) { 用f记录当前结点; if(要找的整数key小于t中的整数) t进入其左孩子所在的左子树; else t进入其右孩子所在的右子树; } } ③插入(增加)整数算法 int insertbst(bitree *t,int key) //在二叉排序树t中插入整数key的结点,是否插入成功用函数值返回 { 在二叉排序树t中查找整数key; if(整数key在二叉排序树t中不存在) { 申请结点; 对该结点赋以该整数; 该结点的左右指针赋空值; 根据查找的结果,把该结点挂到某结点的左孩子或右孩子位置 // 注意当二叉排序树还是空树时情况的处理 } 6
else 插入不成功; }
三、详细设计(实现概要设计中定义的数据类型,对主程序和其他模块写出
算法,说明子模块的调用关系)
首先是对这次实现的二叉树建立,代码如下: typedef struct node // 二叉排序树中的结点结构 { int data; // 整数(关键字)数据域 struct node *lchild, *rchild; // 指向左右孩子的指针 }nodeb, *bitree; 然后是查询KEY的树节点操作代码: void searchbst(bitree t, bitree *f, bitree *p, int key) { *p = t; *f = NULL; // 在二叉排序树t中查找整数为key的结点,若找到,则p指向该结点,否则p为空。f 为 //指向双亲结点的 while (*p != NULL && ((*p)->data != key)) { *f = *p; if (key<(*p)->data) *p = (*p)->lchild; else (*p) = (*p)->rchild; }
} 接着是建立二叉树算法: bitree createbintree(int n)//建立二叉树算法 { bitree p, q, f, t; int i, d; t = NULL; for (i = 0; i{ p = NULL; cin >> d; searchbst(t, &f, &p, d); if (!p) { 7
q = new nodeb; q->data = d; q->lchild = q->rchild = NULL; if (f == NULL) t = q; else if (ddata) f->lchild = q; else f->rchild = q; } } return t;
} 最后一个子模块插入整数算法: int insertbst(bitree *t, int key) /* 在二叉排序树t中插入整数key的结点,是否插入成功用函数值返回 */ { bitree p, f, s; searchbst(*t, &f, &p, key); if (!p) { s = new nodeb; s->data = key; s->lchild = s->rchild = NULL; if (!f) *t = s; else if (keydata) f->lchild = s; else f->rchild = s; return 1; } else return 0; } void inordertraverse(bitree t, int *i) { if (t) { inordertraverse(t->lchild, i); (*i)++; if (*i == 1) printf("%d", t->data); else printf(" %d", t->data); inordertraverse(t->rchild, i); } }