数据结构实验四

合集下载

《数据结构》实验报告

《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。

数据结构实验报告(C语言)(强力推荐)

数据结构实验报告(C语言)(强力推荐)

数据结构实验实验内容和目的:掌握几种基本的数据结构:集合、线性结构、树形结构等在求解实际问题中的应用,以及培养书写规范文档的技巧。

学习基本的查找和排序技术。

让我们在实际上机中具有编制相当规模的程序的能力。

养成一种良好的程序设计风格。

实验教材:数据结构题集(C语言版)清华大学出版社2007年实验项目:实验一、栈和循环队列㈠、实验内容:①栈掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。

本程序采用的是链栈结构,具有初始化一个栈、PUSH、POP、显示所有栈里的元素四个功能。

②循环队列掌握队列的特点(先进先出FIFO)及基本操作,如入队、出队等,学会循环队列的实现,以便在实际问题背景下灵活运用。

本程序具有初始化一个队列、入队、出队、显示队列的所有元素、队列长度五个功能。

㈡、实验代码①栈程序代码:#include <stdio.h>#include <malloc.h>#define Stack_Size 6#define ERROR 0#define OK 1typedef int SElemType;typedef struct SNode{SElemType data;struct SNode *next;}SNode,*LinkStack;int CreatTwo(LinkStack &head,int n){int i;SNode *p;head=(LinkStack)malloc(sizeof(SNode));head->next=NULL;printf("请输入数据(数字):\n");for(i=n;i>0;--i){p=(SNode *)malloc(sizeof(SNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return 1;}int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}int Push(LinkStack &top,SElemType e){SNode *q;q=(LinkStack)malloc(sizeof(SNode));if(!q){printf("溢出!\n");return(ERROR);}q->data=e;q->next=top->next;top->next=q;return(OK);}int Pop(LinkStack &top,SElemType &e){SNode *q;if(!top->next){printf("error!\n");return(ERROR);}e=top->next->data;q=top->next;top->next=q->next;free(q);return(OK);}void main(){ int e;LinkStack top;printf("1.初始化一个栈;\n2.PUSH;\n3.POP;\n4.显示所有栈里的元素;\n5.结束;\n");while(1){switch(menu_select()){case 1:if(CreatTwo(top,Stack_Size))printf("Success!\n");break; case 2:printf("Push:\n");scanf("%d",&e);if(Push(top,e))printf("Success!\n");break;case 3:if(Pop(top,e))printf("Success!\n");printf("%d\n",e);break;case 4:LinkStack p;printf("所有栈里的元素:\n");p=top;while(p->next){p=p->next;printf("%7d",p->data);}printf("\n");break;case 5:return;}}}运行结果:②循环队列程序代码:#include<stdlib.h>#include<stdio.h>#define OVERFLOW -1#define OK 1#define ERROR 0#define MAXSIZE 100typedef struct{int *elem;//队列存储空间int front;int rear;}SqQueue;//判断选择是否正确int menu_select(){int sn;for(;;){scanf("%d",&sn);if(sn<1||sn>6)printf("\n\t输入错误,请重新输入\n");elsebreak;}return sn;}//参数(传出)SqQueue &Q,循环队列(空)int InitQueue(SqQueue &Q){Q.elem=(int *)malloc(MAXSIZE*sizeof(int));if(!Q.elem)exit(OVERFLOW);Q.front=Q.rear=-1;for(int i=0;i<MAXSIZE;i++)Q.elem[i]=-1;return OK;}//返回Q的元素个数int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}//显示队列的元素void Display(SqQueue Q){for(int i=0;i<=QueueLength(Q);i++)if(Q.elem[i]!=-1)printf("%d ",Q.elem[i]);printf("\n");}//入队int EnQueue(SqQueue &Q,int e){Q.rear=(Q.rear+1)%MAXSIZE;if(Q.rear==Q.front)return ERROR;Q.elem[Q.rear]=e;return OK;}//出队int DeQueue(SqQueue &Q,int &e){if(Q.front==Q.rear)return ERROR;e=Q.elem[Q.front+1];Q.elem[Q.front+1]=-1;Q.front=(Q.front+1)%MAXSIZE;return OK;}void main(){SqQueue Q;InitQueue(Q);int elem,e;printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);printf("1.初始化一个队列;\n2.入队;\n3.出队;\n4.显示队列的所有元素;\n5.队列长度:\n6.结束;\n");while(1){switch(menu_select()){case 1:printf("请输入队列元素(以0结束):\n");scanf("%d",&elem);while(elem!=0){EnQueue(Q,elem);scanf("%d",&elem);}printf("队列为:\n");Display(Q);fflush(stdin);break;case 2:scanf("%d",&elem);EnQueue(Q,elem);printf("队列为:\n");Display(Q);fflush(stdin);break;case 3:DeQueue(Q,elem);printf("队列为:\n");Display(Q);break;case 4:printf("\n队列的所有元素:\n");Display(Q);break;case 5:printf("%d\n",QueueLength(Q));break;case 6:return;}}}运行结果:实验二、数组㈠、实验内容:数组一般不做插入或删除操作,也就是说,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。

数据结构实验报告实验总结

数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。

通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。

下面对每一部分实验进行总结。

实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。

在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。

实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。

通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。

实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。

通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。

实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。

通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。

通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。

同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。

在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。

通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。

总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。

在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。

数据结构实验报告

数据结构实验报告

《数据结构》实验报告姓名:学号:班级:学院:实验一单链表实验(一)实验目的1.理解线性表的链式存储结构。

2.熟练掌握动态链表结构及有关算法的设计。

3.根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

(二)实验任务编写算法实现下列问题的求解1.求链表中第i个结点的指针(函数),若不存在,则返回NULL。

2.在第i个结点前插入值为x的结点。

3.删除链表中第i个元素结点。

4.在一个递增有序的链表L中插入一个值为x的元素,并保持其递增有序特性。

5.将单链表L中的奇数项和偶数项结点分解开,并分别连成一个带头结点的单链表,然后再将这两个新链表同时输出在屏幕上,并保留原链表的显示结果,以便对照求解结果。

6.求两个递增有序链表L1和L2中的公共元素,并以同样方式连接成链表L3。

(三)主要仪器设备PC机,Windows操作平台,Visual C++(四)实验分析顺序表操作:定义一个顺序表类,该类包括顺序表的存储空间、存储容量和长度,以及构造、插入、删除、遍历等操作的方法(五)源程序头文件文件名:linklist.h#include<iostream>using namespace std;struct node{int data;node *next;};class list{public:list();int length()const{return count; //求链表长度}~list();void create(); //链表构建,以0为结束标志void output(); //链表输出int get_element(const int i)const; //按序号取元素node *locate(const int x) const; //搜索对应元素int insert(const int i,const int x); //插入对应元素int delete_element(const int i); //删除对应元素node *get_head(){return head; //读取头指针}void insert2(const int x);friend void SplitList(list L1, list&L2, list &L3);friend void get_public(list L1, list L2, list &L3);private:int count;node *head;};list::list(){head=new node;head->next=NULL;count=0;}void list::create() //链表构建,以0为结束标志{int x;cout<<"请输入当前链表,以0为结束符。

数据结构试验(队列)

数据结构试验(队列)

实验报告名称:
姓名:学号:专业班级:
日期:
实验4: 顺序循环队列基本操作一、实验目的
1.熟悉并能实现顺序循环队列的定义和基本操作。

2.了解用队列解决实际应用问题。

二、实验要求
1.进行队列的基本操作时要注意队列“先进先出”的特性。

2.复习关于栈操作的基础知识。

3.编写完整程序完成下面的实验内容并上机运行。

4.整理并上交实验报告。

三、实验内容
1.掌握队列的思想及其存储实现。

2.掌握队列的常见算法的程序实现:
(1.) 判断队列是否为空
(2.) 测试队列的长度
(3.) 取队头元素值
(4.) 向队列中插入一新元素
(5.) 删除队列中一元素
3.在主函数中设计一个简单的菜单,分别调试上述算法。

数据结构实验指导书(新版)

数据结构实验指导书(新版)

《数据结构与算法》实验指导书实验及学时数分配几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。

二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。

上机时签到;下机时验收签字。

三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。

实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。

【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。

(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。

若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。

若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。

【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。

1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。

(从键盘接受删除元素位置i,实现删除;显示删除后的线性表)二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素。

数据结构上机实验报告

数据结构上机实验报告

数据结构实验报告课程数据结构 _ 院系专业班级实验地点姓名学号实验时间指导老师数据结构上机实验报告1一﹑实验名称:实验一——链表二﹑实验目的:1.了解线性表的逻辑结构特性;2.熟悉链表的基本运算在顺序存储结构上的实现,熟练掌握链式存储结构的描述方法;3.掌握链表的基本操作(建表、插入、删除等)4. 掌握循环链表的概念,加深对链表的本质的理解。

5.掌握运用上机调试链表的基本方法三﹑实验内容:(1)创建一个链表(2)在链表中插入元素(3)在链表中删除一个元素(4)销毁链表四﹑实验步骤与程序#include <iostream.h>#include <malloc.h>typedef struct LNode{int data;struct LNode *next;}Lnode, *LinkList;//假设下面的链表均为带头结点。

void CreatLinkList(LinkList &L,int j){//建立一个链表L,数据为整数,数据由键盘随机输入。

LinkList p,q;L=(LinkList )malloc(sizeof(Lnode));L->next=NULL;q=L;cout<<"请输入一个链表:"<<endl;for(int i=0;i<j;i++){ p=(LinkList)malloc(sizeof(Lnode));cin>>p->data;p->next=q->next;q->next=p;q=p;}}int PrintLinkList(LinkList &L){//输出链表L的数据元素LinkList p;p=L->next;if(L->next==NULL){cout<<"链表没有元素!"<<endl;return 0;}cout<<"链表的数据元素为:";while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;return 1;}void LinkListLengh(LinkList &L){//计算链表L的数据元素个数。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。

在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。

本文将对我在数据结构课程中的实验进行总结和分析。

实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。

通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。

实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。

在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。

同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。

实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。

在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。

通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。

实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。

在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。

通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。

实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。

在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。

通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。

结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

return root; } else
return NULL; }
测试结果:
4.哈希表查找。 数据结构为:
typedef struct Hash {
char data[50]; struct Hash *next; }Hash; typedef struct { int data; struct Hash *next; }FirstHash[30]; 将名字拼音字符串的各个字符所对应的 ASCII 码相加,所得的整数做为哈希表的关键字。用除留余数 法构建哈希函数,用伪随机探测再散列法处理冲突。 散列表的查找过程和建表过程类似。假设给定的值为 k,根据建表时设定的散列函数 H,计算出敢列地 址 H(k),若表中该地址对应的空间未被占用,则查找失败,把 k 插人该空单元中;否则将该地址中的值与 k 比较,若相等则查找成功,若不相等,则按事先设定的解决冲突的方法查找下一个地址。如此重复下去, 直至某个地址空间未被占用(查找失败把 k 插人该空单元)或关键字比较相等(查找成功)为止。
然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。
重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
主要算法(折半查找):
int binarysearch(int R[],int k,int n) {
int low=0,high=n-1,mid; while(low<=high) {
mid=(low+high)/2; if(R[mid]==k) return mid+1; else if(k<R[mid]) high=mid-1; else low=mid+1; } return -1; }
temp = temp->next; } if(temp == NULL)
cout << 0 << endl; else
cout << 1 << endl; }
测试结果:
四、收获与体会
本次实验联系了几种常用的查找算法、排序算法,基本熟悉了顺序查找和折半查找的思想;也着练习 了二叉排序树的创建,值的查找(位置)等,而且对遍历做了进一步练习;对哈希表也做了一些练习,用 取余法存储数据建哈希函数,用伪随机探测再散列法处理冲突,然后对哈希表进行查找。
测试结果:
3. 对于给定的一个有序序列,创建一颗高度最小的二叉排序树。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 与前一道题一样,先要对初始数组排序,这里采用冒泡排序法,首先从第一个记录开始,将第一个记 录的关键字与第二个记录的关键字进行比较,若两个关键字为逆序(R[0]>R[1]),则交换两记录位置;然后 比较第二个记录与第三个记录,若两关键字为逆序,同样交换两记录位置;依次类推,直至第 n-2 个记录 和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其结果使得 n 个记录中关键字最大的记录被 移到最后一个位置上。 然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
程序运行 20 分
Hale Waihona Puke 回答问题 15 分实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,要创建一颗高度最小的二叉排序树,就必须让左右子树 的结点个数越接近越好。所以我直接采用中间值来作为二叉树的根节点;将原数组分成左右均等或者相差 一个数的两个新数组;然后递归的对这两个新数组进行相同的处理,这样对于每一个根节点,其左右子树 的高度相差绝对值不会超过 1。
测试结果:
2.构造二叉排序树,并进行中序遍历。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 要构造一个二叉排序树,首先要对输入的数组进行排序,本题我先用冒泡排序对数组进行排序,它的 具体步骤为: 首先从第一个记录开始,将第一个记录的关键字与第二个记录的关键字进行比较,若两个关键字为逆 序(R[0]>R[1]),则交换两记录位置;然后比较第二个记录与第三个记录,若两关键字为逆序,同样交换两 记录位置;依次类推,直至第 n-2 个记录和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其 结果使得 n 个记录中关键字最大的记录被移到最后一个位置上。
5. 拼写检查 1)问题描述:现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的
单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词 A 与单词 B 相似的情况有三种:
① 删除单词 A 的一个字母后得到单词 B; ② 用任意一个字母替换单词 A 的一个字母后得到单词 B; ③ 在单词 A 的任意位置增加一个字母后得到单词 B。 2)实验要求:发现词典中与给定单词相同或相似的单词。
三、实验过程与实验结果
1.折半查找算法 由于折半查找有两个限制:①要求查找必须采用顺序存储结构,即顺序表;②表中的元素必须按关键
字有序排列。 由于本题一开始所给出的序列有序,所以定义两个变量 low 和 high,初始时分别指向 R[0]和 R[n-1]。
首先将给定值 k 与有序表 R[0]到 R[n-1]的中点 mid=(low+high)/2 上的关键字 R[ mid]进行比较,若相等, 则查找成功。若 k < R[ mid],则说明 k 有可能落在[0... mid-1]区间中,于是修改 high,指向 mid -1 位置,在 R[0]到 R[ mid -1]中继续查找。若 k > R[ mid], 则说明 k 有可能落在[mid +1...n-1]区间中, 于是修改 low,指向 mid +1 位置。在 R[ mid + 1]到 R[n-1]中继续查找。每通过次比较,区间的长度就缩 小一半,如此不断进行下去,直至找到关键字为 k 的元素(查找成功)或 low > high,即查找失败为止。
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,这道题我直接创建的是最小高度的二叉排序树,要创建 一颗高度最小的二叉排序树,就必须让左右子树的结点个数越接近越好。所以我直接采用中间值来作为二 叉树的根节点;将原数组分成左右均等或者相差一个数的两个新数组;然后递归的对这两个新数组进行相 同的处理,这样对于每一个根节点,其左右子树的高度相差绝对值不会超过 1。
查找的主要算法:
counts = (int)checkname[i][1] % 29; if(h[counts]->next == NULL)
cout << 0 << endl; else {
Hash *temp = h[counts]->next; while(temp!= NULL && strcmp(temp->data,checkname[i]) != 0) {
建立二叉排序树算法:
BSTNode* CreateBST(int low,int high) {
int mid = (low+high)/2; BSTNode *root; if(low<=high) {
root = (BSTNode*)malloc(sizeof(BSTNode)); root->data=R[mid]; root->lchild=CreateBST(low,mid-1); root->rchild=CreateBST(mid+1,high);
实验报告
学院(系)名称:计算机科学与工程学院
姓名
赵振宇
学号
20175302
专业
班级
2017 级 4 班 实验项目
实验四:查找算法应用
课程名称
数据结构与算法
课程代码
计算机科学与技术 0661913
实验时间
2019 年 6 月 3 日 第 3、4 节 实验地点
相关文档
最新文档