ImageVerifierCode 换一换
格式:DOCX , 页数:34 ,大小:23.82KB ,
资源ID:10425053      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10425053.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构实验五.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构实验五.docx

1、数据结构实验五 实验五 查找与排序实验课程名:数据结构(c语言版)专业班级: 学 号: 姓 名: 实验时间: 实验地点: 指导教师: 一、实验目的1、进一步掌握指针变量、动态变量的含义。2、掌握二叉树的结构特性,以及各种存储结构的特点和适用范围。 3、掌握用指针类型描述、访问和处理二叉树的运算二、实验的内容和步骤下面是查找与排序的部分基本操作实现的算法,请同学们自己设计主函数和部分算法,调用这些算法,完成下面的实验任务。# define MAX_LENGTH 100typedef int KeyType;/* 顺序查找表的存储类型 */typedef struct /define struct

2、ure SSTable KeyType *elem; int length;SSTable;/* 在查找表中顺序查找其关键字等于 key 的数据元素。 */int Search_Seq(SSTable ST,KeyType key) /Search_Seq function int i; ST.elem0=key; for(i=ST.length;!(ST.elemi=key);-i) ; return (i); /if not find,return i=0/* 在有序查找表中折半查找其关键字等于 key 的数据元素*/int Search_Seq(SSTable ST,KeyType ke

3、y) /Search_Seq function int mid,low=1,high=ST.length; while(low=high) mid=(low+high)/2; if(key=ST.elemmid) return (mid); else if(keydata) p=T; return (OK); else if(keydata) SearchBST(T-lchild,key,T,p); else SearchBST(T-rchild,key,T,p);/*二叉排序树中插入算法*/int SearchBST(BiTree T,KeyType key,BiTree f,BiTree

4、&p) /SearchBST() if(!T) p=f; return (ERROR); else if(key=T-data) p=T; return (OK); else if(keydata) SearchBST(T-lchild,key,T,p); else SearchBST(T-rchild,key,T,p); /SearchBST() end/*二叉排序树中删除算法*/int Delete(BiTree &p) /Delete() sub-function BiTree q,s; if(!p-data) q=p; p=p-lchild; free(q); else if(!p-l

5、child) q=p; p=p-rchild; free(q); else q=p; s=p-lchild; while(s-rchild) q=s; s=s-rchild; p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-rchild; /*链地址Hash表类型*/typedef int ElemType;typedef struct LNode ElemType key; struct LNode *next;LNode,*LinkList;typedef LNode * CHashTable MAXSIZE;/链地址H

6、ash表类型/*求Hash函数*/int H(int s)/ if(s) return s%11; /求关键字 else return 0;/H /*输入数据的关键字函数*/ElemType Inputkey() ElemType x; cout请输入数据x; return x;/*输入一组关键字,建立Hash表,表长为m,用链地址法处理冲突*/int Build_Hash (CHashTable & T, int m) ElemType key; LNode* q; int n; if(m1) return ERROR; for(int i=0; idata=key; q-next=NULL

7、; n=H(key); /查HASH表得到指针数组的地址 q-next=Tn; /原来的头指针后移 Tn=q; /新元素插入头部 /while return OK;/*输出用链地址法处理冲突的Hash表*/int Print_Hash (CHashTable & T) LNode* q; int n; for(int i=0; i11; i+) q=Ti; /哈希表初始化 while(q ) /输入元素有效 coutdatanext; coutendl; return OK;/*定义每个记录(数据元素)的结构*/Typedef struct /定义每个记录(数据元素)的结构 KeyType k

8、ey ; /关键字 InfoType otherinfo; /其它数据项RecordType,node ; /例如node.key表示其中一个分量/*定义顺序表L的结构*/Typedef struct /定义顺序表L的结构 RecordType r MAXSIZE +1 ; /存储顺序表的向量 /r0一般作哨兵或缓冲区 int length ; /顺序表的长度SqList ,L; /例如L.r或L.length表示其中一个分量/若r数组是表L中的一个分量且为node类型,则r中某元素的key分量表示为:ri.key/*直接插入排序算法的实现: */void InsertSort ( SqLis

9、t &L ) /对顺序表L作直接插入排序 for ( i = 2; i =L.length; + i ) /直接在原始无序表L中排序 if (L.ri.key L.ri-1.key) /若L.ri较小则插入有序子表内 L.r0= L.ri; /先将待插入的元素放入“哨兵”位置 L.ri= L.ri-1; /子表元素开始后移 for ( j=i-2; L.r0.key L.rj.key; -j ) L.rj+1= L.rj; /只要子表元素比哨兵大就不断后移L.rj+1= L.r0; /直到子表元素小于哨兵,将哨兵值送入 /当前要插入的位置(包括插入到表首) /if/ InsertSort /*

10、 希尔排序算法(主程序)*/void ShellSort(SqList &L,int dlta ,int t) /按增量序列dlta0t-1对顺序表L作Shell排序 for(k=0;kt;+k) ShellInsert(L,dltak); / ShellSort/* 希尔排序算法(其中某一趟的排序操作) */void ShellInsert(SqList &L,int dk) /对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子for(i=dk+1;i=L.length; + i) if(ri.key 0&(r0.keyrj.key); j-=dk) rj+dk=rj; rj+dk

11、=r0; /if /ShellInsert/理解难点:不提前处理i子集后部元素,每次只考虑子集的前部(j=j-dk),/第二轮也只考虑i+1那个子集的前部。/*一趟快速排序算法(针对一个子表的操作) */int Partition(SqList &L,int low,int high) /一趟快排/交换子表 rlowhigh的记录,使支点(枢轴)记录到位,并返回其位置。返回时,在支点之前的记录均不大于它,支点之后的记录均不小于它。 r0=rlow; /以子表的首记录作为支点记录,放入r0单元(续下页)pivotkey=rlow.key; /取支点的关键码存入pivotkey变量while(lo

12、w high) /从表的两端交替地向中间扫描 while(low=pivotkey ) - -high; rlow=rhigh; /比支点小的记录交换到低端; while(lowhigh & rlow.key=pivotkey) + +low; rhigh=rlow; /比支点大的记录交换到高端; rlow=r0; /支点记录到位; return low; /返回支点记录所在位置。/Partition/*整个快速排序的递归算法: */void QSort ( SqList &L, int low, int high ) /对顺序表L中的子序列r lowhigh 作快速排序if ( low hi

13、gh) pivot = Partition ( L, low, high ); QSort ( L, low, pivot-1); QSort ( L, pivot+1, high ); /if /QSort/*简单选择排序的算法*/Void SelectSort(SqList &L ) for (i=1; i0; - - i ) /把r1length建成大根堆 HeapAdjust(r, i, length ); /使rilength成为大根堆 / HeapSort/*堆排序的算法实现 */void HeapSort (HeapType &H ) /对顺序表H进行堆排序 for ( i =

14、H.length / 2; i 0; - - i ) HeapAdjust(H,i, H.length ); /for,建立初始堆 for ( i = H.length; i 1; - -i) H.r1 H.ri; /交换,要借用temp HeapAdjust( H, 1,i-1 ); /从头重建最大堆, i-1=m HeapAdjust(r, i, m )current=i; temp=ri; child=2*i; while(child=m) /检查是否到达当前堆尾,未到尾则整理 if ( childm & rchild.key=rchild.key ) breack; /根大则不必调整,

15、函数结束 else rcurrent=rchild; /否则子女中的大者上移 current= child; child=2* child; /从根降到子女位置继续向下整理! / while rcurrent=temp; /直到自下而上都满足堆定义,再安置函数入口的那个结点ri (即temp) / HeapAdjust1.顺序表的顺序查找程序代码:#include#include#define MX_LENGTH 100typedef int KeyType;typedef struct KeyType *elem; int length;SSTable;int creat(SSTable &

16、L) int k,i; L.elem=(int*)malloc(MX_LENGTH*sizeof(int); if(!L.elem) return 0; L.length=0; coutk; L.length=k; cout请输入顺序表内元素:; for(i=1;iL.elemi; int out(SSTable &L) int i; cout顺序表内元素为:; for(i=1;i=L.length;i+) coutL.elemi ; coutendl; return 0;int Search_Seq(SSTable ST,KeyType key) /Search_Seq function i

17、nt i; ST.elem0=key; for(i=ST.length;!(ST.elemi=key);-i) ; return (i); /if not find,return i=0int main() int key,x; SSTable L; creat(L); out(L); coutkey; x=Search_Seq(L,key); cout元素在顺序表的位置为(若在顺序表中没有,为0):; coutendl; coutx; coutendl;2、有序顺序表的二分查找的算法程序代码:#include#include#define MX_LENGTH 100typedef int K

18、eyType;typedef struct KeyType *elem; int length;SSTable;int creat(SSTable &L) int k,i; L.elem=(int*)malloc(MX_LENGTH*sizeof(int); if(!L.elem) return 0; L.length=0; coutk; L.length=k; cout请输入顺序表内元素:; for(i=1;iL.elemi; int out(SSTable &L) int i; cout顺序表内元素为:; for(i=1;i=L.length;i+) coutL.elemi ; coute

19、ndl; return 0;int Search_Seq(SSTable ST,KeyType key) /Search_Seq function int mid,low=1,high=ST.length; while(low=high) mid=(low+high)/2; if(key=ST.elemmid) return (mid); else if(keyST.elemmid) high=mid-1; else low=mid+1; return (0);int main() int key,x; SSTable L; creat(L); out(L); coutkey; x=Searc

20、h_Seq(L,key); cout元素在顺序表的位置为(若在顺序表中没有,为0):; coutendl; coutx; coutendl;3、二叉排序树的查找、插入、删除等基本操作的实现程序代码:#include#include#define MX_LENGTH 100#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int KeyType;typedef char TElemType;/* 二叉树节点的存储类型 */typedef struct BiTNode /define stricture BiTree T

21、ElemType data; struct BiTNode *lchild,*rchild;BiTNode, *BiTree;/*建立二叉树*/int CreateBiTree(BiTree &T) /createBiTree() sub-function TElemType ch; coutch; if(ch=/) T=NULL; else if(!(T=(BiTNode *)malloc(sizeof(BiTNode) coutdata=ch; CreateBiTree(T-lchild); /create lchild CreateBiTree(T-rchild); /create rc

22、hild return (OK); /CreateBiTree() end/*前序遍历二叉树的递归算法*/int PreOrderTraverse(BiTree T) /PreOrderTravers sub-function if(T) coutdata; /visite T if (PreOrderTraverse(T-lchild) /traverse lchild if (PreOrderTraverse(T-rchild) /traverse rchild return (OK); return (ERROR); /if end else return (OK); /PreOrder

23、Traverse() end/* 中序遍历二叉树的递归算法*/int InOrderTraverse(BiTree T) /InOrderTraverse sub-function if(T) if (InOrderTraverse(T-lchild) /traverse lchild coutdata; /visite T if(InOrderTraverse(T-rchild) /traverse rchild return (OK); return (ERROR); /if end else return (OK); /InOrderTraverse() end/*在二叉排序树中查找某关

24、键字等于 key 的数据元素*/int SearchBST(BiTree T,char key,BiTree f,BiTree &p) /SearchBST() Sub-function if(!T) p=f; return (ERROR); else if(key=T-data) p=T; return (OK); else if(keydata) SearchBST(T-lchild,key,T,p); else SearchBST(T-rchild,key,T,p);/二叉排序树的插入int Insert(BiTree &T,TElemType e) BiTree p,s; if(!SearchBST(T,e,NULL,p) s=(BiTree)malloc(sizeof(BiTNode); s-data=e; s-lchild=s-rchild=NULL; if(!p) T=s; else if(edata) p-lchild=s; else p-rchild=s; return TRUE;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1