数据结构实验查找.doc_第1页
数据结构实验查找.doc_第2页
数据结构实验查找.doc_第3页
数据结构实验查找.doc_第4页
数据结构实验查找.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验名称:查找班级: 学号: 姓名: 报告日期: 1、 实验目的及要求1.了解实验目的及实验原理;2.编写程序,并附上程序代码和结果图;3.总结在编程过程中遇到的问题、解决办法和收获。2、 实验内容1.编写函数,建立有序表,采用折半查找实现某一已知的关键字的查找(采用顺序表存储结构);2.编写函数,随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树;3.编写函数,在以上二叉排序树中删除某一指定关键字元素;4.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法.三、实验结果4、 实验总结 这次实验是对查找算法的编程实现,而查找算法有很多,这次我选的是折半法。折半法其实和我们以往学的二分法有很大的相似,所以对算法的理解较为容易。主要难以解决则是编程的实现,但是在老师、同学以及网络的帮助下,最终勉强的编写出程序。而其中也再此让我感受到了循环算法的妙用,这次没有用for语句作循环,用的是switch语句,使我对其用法更加熟练,其次,还是老话,细心最重要,一定要注意细节。附录#include #include #define LIST_SIZE 20 #define ENDKEY 0#includetypedef int KeyType;typedef int OtherType;typedef struct nodeKeyType key ; /*关键字的值*/struct node *lchild,*rchild;/*左右指针*/BSTNode, *BSTree;typedef structKeyType key;OtherType other_data;RecordType;typedef structRecordType rLIST_SIZE+1; /* r0为工作单元 */int length;RecordList;void createlist(RecordList *l)int i;int len;KeyType ch;printf(请输入线性表的长度:);scanf(%d,&len);l-length = len;for(i=1; iri.key = ch;int BinSrch(RecordList l, KeyType k)/*在有序表l中折半查找其关键字等于k的元素,若找到,则函数值为该元素在表中的位置*/int low,high,mid;low=1; high=l.length;/*置区间初值*/while( low = high)mid=(low+high) / 2;if (k=l.rmid. key) return (mid);/*找到待查元素*/else if (k key=key;s-lchild=NULL; s-rchild=NULL;*bst=s;else if (key key)InsertBST(&(*bst)-lchild), key);/*将s插入左子树*/else if (key (*bst)-key)InsertBST(&(*bst)-rchild), key); /*将s插入右子树*/*int InsertBST(BSTree *bst, KeyType K)BSTree f, q, s;s=(BSTree)malloc(sizeof(BSTNode);s-key = K;s-lchild = NULL;s-rchild = NULL;if ( *bst = NULL ) *bst = s; return 1; f = NULL;q = *bst;while( q ) if ( q-key = K ) return 0;if( K key ) f = q; q = q-lchild; else f = q; q = q-rchild; if ( K key ) f-lchild = s; else f-rchild = s;return 1; */void CreateBST(BSTree *bst)/*从键盘输入元素的值,创建相应的二叉排序树*/ KeyType key;*bst=NULL;int i;srand(unsigned)time(NULL); /初始化随机数for(i=0;ikey); /*输出结点*/PreOrder(root-lchild); /*先序遍历左子树*/PreOrder(root-rchild); /*先序遍历右子树*/*BSTree SearchBST(BSTree bst, KeyType key)/ *在根指针bst所指二叉排序树中,递归查找某关键字等于key的元素,若查找成功,返回指向该元素结点指针,否则返回空指针* / if (!bst) return NULL;else if (bst-key = key)return bst;/ *查找成功* /elseif (bst-key key)return SearchBST(bst-lchild, key);/ *在左子树继续查找* /else return SearchBST(bst-rchild, key);/ *在右子树继续查找* /*/BSTree SearchBST(BSTree bst, KeyType key)/*在根指针bst所指二叉排序树bst上,查找关键字等于key的结点,若查找成功,返回指向该元素结点指针,否则返回空指针*/ BSTree q;q=bst;while(q)if (q-key = key) return q; /*查找成功*/if (q-key key) q=q-lchild; /*在左子树中查找*/else q=q-rchild; /*在右子树中查找*/return NULL; /*查找失败*/*SearchBST*/BSTNode * DelBST(BSTree t, KeyType k) /*在二叉排序树t中删去关键字为k的结点*/BSTNode *p, *f,*s ,*q;p=t; f=NULL;while(p) /*查找关键字为k的待删结点p*/ if(p-key=k ) break; /*找到则跳出循环*/f=p; /*f指向p结点的双亲结点*/if(p-keyk) p=p-lchild;else p=p-rchild; if(p=NULL) return t; /*若找不到,返回原来的二叉排序树*/if(p-lchild=NULL) /*p无左子树*/ if(f=NULL) t=p-rchild; /*p是原二叉排序树的根*/else if(f-lchild=p) /*p是f的左孩子*/f-lchild=p-rchild ; /*将p的右子树链到f的左链上*/else /*p是f的右孩子*/f-rchild=p-rchild ; /*将p的右子树链到f的右链上*/free(p); /*释放被删除的结点p*/else /*p有左子树*/ q=p; s=p-lchild;while(s-rchild) /*在p的左子树中查找最右下结点*/q=s; s=s-rchild;if(q=p) q-lchild=s-lchild ; /*将s的左子树链到q上*/else q-rchild=s-lchild;p-key=s-key; /*将s的值赋给p*/free(s);return t; /*DelBST*/void main()int flag=0;int n,t=1;while(t)printf(*n);printf(1.编写函数,建立有序表,采用折半查找实现某一已知的关键字的查找;n);printf(2.随机产生一组关键字,利用二叉排序树的插入算法建立二叉排序树;n);printf(3.编写函数,在随机产生的二叉排序树中删除某一指定关键字元素;n);printf(4.结束n);printf(*n);printf(请输入相应的选项:);scanf(%d, &n); switch(n) case 1: RecordList l;int locate;KeyType k;createlist(&l);printf(请输入要查找的元素:);fflush(stdin);scanf(%c,&k);locate = BinSrch(l,k);if(locate = 0)printf(未找到!n);elseprintf(该元素在表中的位置为%dn,locate);break;case 2:BSTree T;BSTree result;printf(建立二叉排序树,请输入序列(用空格隔开,用0结束输入!):n); CreateBST(&T);printf(n);printf(先序遍历输出序列为:);PreOrder(T);/*printf(n请输入要删除的元素:);fflush(stdin);scanf(%d,&k);result = SearchBST(T,k);if (result != NULL)printf(%d元素已经被删除!删除后的二叉树的先序遍历:n,result-key);elseprintf(未找到!n);result = DelBST(T,k);PreOrder(result);*/printf(n);/getch();break;case 3:printf(建立二叉排序树,请输入序列(用空格隔开,用0结束输入!):n); CreateBST(&T);printf(n);printf(先序遍历输出序列为:);PreOrder(T);printf(n请输入要删除的元素:);fflush(stdin);scanf(%d,&k);result = SearchBST(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论