收藏 分享(赏)

数据结构实验查找.doc

上传人:lufeng1000 文档编号:1469238 上传时间:2018-07-20 格式:DOC 页数:10 大小:505.01KB
下载 相关 举报
数据结构实验查找.doc_第1页
第1页 / 共10页
数据结构实验查找.doc_第2页
第2页 / 共10页
数据结构实验查找.doc_第3页
第3页 / 共10页
数据结构实验查找.doc_第4页
第4页 / 共10页
数据结构实验查找.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、实验名称:查找班级: 学号: 姓名: 报告日期: 1、 实验目的及要求1.了 解 实 验 目 的 及 实 验 原 理 ;2.编 写 程 序 , 并 附 上 程 序 代 码 和 结 果 图 ;3.总 结 在 编 程 过 程 中 遇 到 的 问 题 、 解 决 办 法 和 收 获 。2、 实验内容1.编 写 函 数 ,建 立 有 序 表 ,采 用 折 半 查 找 实 现 某 一 已 知 的 关 键 字 的 查 找 (采用 顺 序 表 存 储 结 构 );2.编 写 函 数 ,随 机 产 生 一 组 关 键 字 ,利 用 二 叉 排 序 树 的 插 入 算 法 建 立 二 叉 排序 树 ;3.编 写

2、 函 数 ,在 以 上 二 叉 排 序 树 中 删 除 某 一 指 定 关 键 字 元 素 ;4.编 写 一 个 主 函 数 ,在 主 函 数 中 设 计 一 个 简 单 的 菜 单 ,分 别 调 试 上 述 算 法 .三、实验结果4、 实验总结这次实验是对查找算法的编程实现,而查找算法有很多,这次我选的是折半法。折半法其实和我们以往学的二分法有很大的相似,所以对算法的理解较为容易。主要难以解决则是编程的实现,但是在老师、同学以及网络的帮助下,最终勉强的编写出程序。而其中也再此让我感受到了循环算法的妙用,这次没有用 for 语句作循环,用的是 switch 语句,使我对其用法更加熟练,其次,还

3、是老话,细心最重要,一定要注意细节。附录#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 structRecordTy

4、pe rLIST_SIZE+1; /* r0为工作单元 */int length;RecordList;void createlist(RecordList *l)int i;int len;KeyType ch;printf(“请输入线性表的长度:“);scanf(“%d“,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;/*置

5、区间初值 */while( low key=key;s-lchild=NULL; s-rchild=NULL;*bst=s;else if (key key)InsertBST(/*将 s 插入左子树*/else if (key (*bst)-key)InsertBST( /*将 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 ) *bs

6、t = 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); /初始化随

7、机数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 Sea

8、rchBST(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; /*在左子树中查找*/e

9、lse 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;

10、 /*若找不到,返回原来的二叉排序树*/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 的

11、左子树中查找最右下结点*/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“);print

12、f(“3.编写函数,在随机产生的二叉排序树中删除某一指定关键字元素;n“);printf(“4.结束n“);printf(“*n“);printf(“请输入相应的选项:“);scanf(“%d“, switch(n)case 1:RecordList l;int locate;KeyType k;createlist(printf(“请输入要查找的元素:“);fflush(stdin);scanf(“%c“,locate = BinSrch(l,k);if(locate = 0)printf(“未找到!n“);elseprintf(“该元素在表中的位置为%dn“,locate);break;c

13、ase 2:BSTree T;BSTree result;printf(“建立二叉排序树,请输入序列(用空格隔开,用 0 结束输入!):n“);CreateBST(printf(“n“);printf(“先序遍历输出序列为:“);PreOrder(T);/*printf(“n 请输入要删除的元素 :“);fflush(stdin);scanf(“%d“,result = SearchBST(T,k);if (result != NULL)printf(“%d 元素已经被删除!删除后的二叉树的先序遍历:n“,result-key);elseprintf(“未找到!n“);result = Del

14、BST(T,k);PreOrder(result);*/printf(“n“);/ getch();break;case 3:printf(“建立二叉排序树,请输入序列(用空格隔开,用 0 结束输入!):n“);CreateBST(printf(“n“);printf(“先序遍历输出序列为:“);PreOrder(T);printf(“n 请输入要删除的元素:“);fflush(stdin);scanf(“%d“,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 4:t=0;printf(“结束!“);break;default :printf(“输入有误,请重新选择!n“);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 往来文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报