1、在二叉排序树中查找关键字为key地记录簿学院名称专业班级实验成绩学生姓名学号实验日期课程名称数据结构实验题目4 查找一、实验目的与要求通过本次实验,掌握查找表上的有关查找方法,并分析时间复杂度。二、主要仪器设备Cfree三、实验内容和原理2.实习题1问题描述编写程序实现下面运算:在二叉排序树中查找关键字为key的记录。输入排序二叉树,以及要查找的数字(节点)。输出显示该节点是否存在。存储结构有序表采用顺序方式存储。算法的基本思想若二叉排序树为空树,查找失败,返回null或0;否则,将key与根节点的关键字比较: 若key=根节点的关键字,查找成功; 若key根节点的关键字,继续在右子树中查找。
2、参考源程序#include #include #define NULL 0typedef int KeyType;typedef struct KeyType key; ElemType; /元素类型typedef struct BiTNodeElemType data; struct BiTNode *lchild,*rchild;BiTNode,*BiTree;BiTree searchBST(BiTree bt,KeyType key)/*在二叉排序树 bt 中查找其关键字等于给定值的结点是否存在,并输出相应信息*/ if (bt=NULL) return NULL;/在排序二叉树中进行
3、递归查找 else if (bt-data.key=key) return bt; else if (keydata.key) return searchBST(bt-lchild,key); else return searchBST(bt-rchild,key);void insertBST(BiTree *bt,BiTree s)/*在二叉排序树中插入一个新结点,即依次插入输入的数*/ if (*bt=NULL) *bt=s; else if (s-data.keydata.key) insertBST(&(*bt)-lchild),s); else if (s-data.key(*bt
4、)-data.key) insertBST(&(*bt)-rchild),s);main() char ch; KeyType key; BiTree bt,s; int i=0;/*建立一棵二叉排序树,元素从键盘按先序输入,直到输入关键字等于-1为止*/ printf(n请输入元素(-1:结束):n);/以-1为结束 scanf(%d,&key); bt=NULL; while (key!=-1) s=(BiTree)malloc(sizeof(BiTNode); (s-data).key=key;s-lchild=s-rchild=NULL; insertBST(&bt,s); scanf
5、(%d,&key); /while/*二叉排序树的查找,可多次查找,并输出查找的结果*/ do printf(n输入你想要查找的元素:); scanf(%d,&key); s=searchBST(bt,key); if (s!=NULL) printf(n成功! 这个等价元素是 %d.n,s-data.key); else printf(n没有找到!n); printf(n是否继续?(y/n):); scanf(%c,&ch); ch=getchar(); while (ch=y | ch=Y) ; getchar();/main实验结果:五、实验结果与分析(2)习题1:采用先序遍历的方式生成
6、二叉树,程序中多次使用的递归的算法。使程序看起来很简洁。如果把头结点的生成也放到生成树的函数中,会使程序看起来更加调理。六、实验心得及体会查找是很多程序的基础,很多程序中都会用到查找。比如在线性表的插入和删除时要查找合适的位置。所以学好查找是很必要的。本次实验只要是采取了这般查找的方法。其实还有很多查找的方法。如顺序查找,索引顺序表查找。每种查找方法各有优劣。如折半查找的平均查找长度小于顺序查找,但它要求查找的表为有序的。所以需将无序表排序成有序表。这又会浪费运行时间。编写程序时遇到了很多的困难,如先序生成树更好还是中序生成更好。太原理工大学学生实验报告学院名称计算机科学与技术专业班级计Z10
7、02班实验成绩学生姓名郑海兵学号2010001420实验日期1月2日课程名称数据结构实验题目5 内排序一、实验目的与要求通过本次实验,掌握线性表的排序方法,并分析时间复杂度。二、主要仪器设备Cfree三、实验内容和原理问题描述设计一个用链表表示的直接选择排序算法,并用程序实现。输入n个数据。输出n个数据由小到大排列的结果。存储结构待排序记录顺序存储。算法的基本思想已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。反复执行这个
8、过程,直到排好序。参考源程序#include#include int n;struct Numberint data;struct Number* next;struct Number* Creat_H(int k)/创建单链表 struct Number* L;struct Number* p; p=(struct Number*)malloc(sizeof(struct Number);L=p;int temp;int i;printf(n请输入元素:);for(i=1;idata=temp;if(i=k)p-next=NULL;break;p-next=(struct Number*)m
9、alloc(sizeof(struct Number);p=p-next;/forreturn L;/struct Number* Creat_Hstruct Number* Sort(struct Number* p)/直接选择排序struct Number* max;struct Number* min;struct Number* temp;struct Number* r;r=p;int flag=0;doif(flag=0)/第一次找最小数时的初始化temp=min=max=r;elsetemp=min=max=r-next;/dowhile(1)/找出最小数if(min-datan
10、ext-data)if(max-next-next!=NULL)max=max-next;elsebreak;/ifelsetemp=max;/相当于temp-next=minmin=max-next;if(max-next-next!=NULL)max=max-next;elsebreak;/else/while(1) if(temp!=min)if(min-next=NULL)temp-next=NULL;elsetemp-next=min-next;if(flag=0)r=min;r-next=p;p=r;elsemin-next=r-next;r-next=min;r=min;/ife
11、lse/初始化时min就已经指向了最小数if(flag=0)/第一次找到最小数r=min;p=r;elser=min;/elseflag+;/又排好一个数if(flag=n-1)return p;while(1);int main()struct Number* H;printf(n请输入元素个数 n (n=2):);/输入数据(不得少于2个)scanf(%d,&n);while(ndata);H=H-next;printf(n);system(pause);return 0;getchar();五、实验结果与分析习题1:这题要从前面和后面同时进行处理,只有这样才能保证时间复杂度为O(N)。六、实验心得及体会排序有很多种方法,如冒泡排序、直接插入排序、希尔排序、归并排序、选择排序等等。各个排序的方法各有优劣,时间复杂度各不相同。习题二中使用的快速排序方法是冒泡排序的改进方法,时间复杂度比较小。但若初始纪录序列按关键字有序或基本有序时,快速排序退化为冒泡排序。在实验中学习到很多,每次调试程序都进步不少,以后会多思考,多读程序,使思维更加缜密,调理和清晰,同时也提高自己的提高动手能力。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1