《数据结构-实验8查找的算法.pdf》由会员分享,可在线阅读,更多相关《数据结构-实验8查找的算法.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、8.18.1 实现顺序查找的算法实现顺序查找的算法一,一, 实验目的实验目的1.熟悉掌握各种查找方法,深刻理解各种查找算法及其执行的过程;2.学会分析各种查找算法的性能。二,二, 实验内容实验内容8.18.1 实现顺序查找的算法实现顺序查找的算法编写一个程序,输出在顺序表3,6,2,10,1,8,5,7,4,9中采用顺序查找法查找关键字 5 的结果。8.28.2 实现折半查找算法实现折半查找算法编写一个程序,输出在顺序表1,2,3,4,5,6,7,8,9,10中采用折半查找方法查找关键字 9 的结果。要求: 1用非递归方法; 2用递归方法。8.38.3 实现二叉排序树的基本运算实现二叉排序树的
2、基本运算编写一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能:1由4,9,0,1,8,6,3,5,2,7创建一个二叉排序树 bt;2判断 bt 是否为一棵二叉排序树提示:在遍历过程中检查是否符合二叉排序树定义 ;3采用非递归方法查找关键字为 6 的结点,并输出其查找路径提示:查找过程中保留经过的结点信息,找到后顺序输出之 。8.48.4 实现哈希表的相关运算实现哈希表的相关运算编写一个程序,实现哈希表的相关运算,并在此基础上完成如下功能:1建立16,74,60,43,54,90,46,31,29,88,77哈希表 A012,哈希函数为H(k)=key % 11,并采用线性探测法解决冲
3、突。输出哈希表;2在上述哈希表中查找关键字为 29 的记录;3在上述哈希表中删除关键字为 77 的记录,再将其插入,然后输出哈希表。要求:输出格式哈希地址:0 1 2 . 12关键字值:三,三, 源代码及结果截图源代码及结果截图8.18.1/实现顺序查找的算法实现顺序查找的算法#include #include #define MAXL 100#define MAXL 100/定义表中最多记录个数定义表中最多记录个数typedef int KeyType;typedef int KeyType;typedef int InfoType;typedef int InfoType;typedef
4、structtypedef struct KeyType key;KeyType key;/KeyType/KeyType 为关键字的数据类型为关键字的数据类型 InfoType data; InfoType data;/其他数据其他数据 NodeType; NodeType;typedef NodeType SeqListMAXL;typedef NodeType SeqListMAXL; / /顺序表类型顺序表类型int Search(SeqList R,int n,KeyType k) /int Search(SeqList R,int n,KeyType k) /顺序查找算法顺序查找算
5、法 int i=0; int i=0; while (in & Ri.key!=k) while (i=n) if (i=n)return -1;return -1; else else printf(%d,Ri.key);printf(%d,Ri.key);return i;return i; void main()void main() SeqList R;SeqList R;int n=10;int n=10;KeyType k=5;KeyType k=5;InfoType a=3,6,2,10,1,8,5,7,4,9;InfoType a=3,6,2,10,1,8,5,7,4,9;in
6、t i;int i;for (i=0;in;i+)for (i=0;in;i+)/建立顺序表建立顺序表Ri.key=ai;Ri.key=ai;printf(printf(查找结果:查找结果:n);n);if (i=Search(R,n,k)!=-1)if (i=Search(R,n,k)!=-1)printf(nprintf(n 元素元素%d%d 的位置是的位置是:%d,k,i);:%d,k,i);elseelseprintf(nprintf(n 元素元素%d%d 不在表中不在表中n,k);n,k);printf(n);printf(n); 8.28.2/ /实现折半查找算法实现折半查找算法#
7、include #include #define MAXL 100#define MAXL 100/ /定义表中最多记录个数定义表中最多记录个数typedef int KeyType;typedef int KeyType;typedef char InfoType10;typedef char InfoType10;typedef structtypedef struct KeyType key;KeyType key;/KeyType/KeyType为关键字的数据类型为关键字的数据类型InfoType data;InfoType data;/ / /其他数据其他数据 NodeType; N
8、odeType;typedef NodeType SeqListMAXL;typedef NodeType SeqListMAXL;/ /顺序表类型顺序表类型int BinSearch1(SeqList R,int n,KeyType k)int BinSearch1(SeqList R,int n,KeyType k) / /非递归二分查找算法非递归二分查找算法 int low=0,high=n-1,mid,count=0;int low=0,high=n-1,mid,count=0;while (low=high)while (lowk)if (Rmid.keyk)/ /继续在继续在 Rl
9、ow.mid-1Rlow.mid-1中查找中查找元元素素 high=mid-1;high=mid-1;elseelselow=mid+1;low=mid+1;/ /继续在继续在 Rmid+1.highRmid+1.high中查找中查找return -1;return -1;int BinSearch2(SeqList R,KeyType k,int low,int high,int count)int BinSearch2(SeqList R,KeyType k,int low,int high,int count)/ /递归二分查找递归二分查找算法算法 int mid;int mid;if(
10、low=high)if(lowk)else if (Rmid.keyk)/ /继续在继续在 Rlow.mid-1Rlow.mid-1中查找中查找BinSearch2(R, k,low,mid-1,count);BinSearch2(R, k,low,mid-1,count);elseelseBinSearch2(R, k,mid+1,high,count);BinSearch2(R, k,mid+1,high,count);/ /继续在继续在 Rmid+1.highRmid+1.high中中查找查找 else return -1;else return -1; void main()void
11、main() SeqList R;SeqList R;KeyType k=9;KeyType k=9;int a=1,2,3,4,5,6,7,8,9,10,i,n=10;int a=1,2,3,4,5,6,7,8,9,10,i,n=10;for (i=0;in;i+)for (i=0;in;i+)Ri.key=ai;Ri.key=ai;/ /建立顺序表建立顺序表printf(printf(用非递归方法用非递归方法:n);:n);if (i=BinSearch1(R,n,k)!=-1)if (i=BinSearch1(R,n,k)!=-1)printf(printf(元素元素%d%d 的位置是的
12、位置是%dn,k,i);%dn,k,i);elseelseprintf(printf(元素元素%d%d 不在表中不在表中n,k);n,k);printf(printf(用递归方法用递归方法:n);:n);if (i=BinSearch2(R,k,0,9,0)!=-1)if (i=BinSearch2(R,k,0,9,0)!=-1)printf(printf(元素元素%d%d 的位置是的位置是%dn,k,i);%dn,k,i);elseelseprintf(printf(元素元素%d%d 不在表中不在表中n,k);n,k);8.38.3/ /实现二叉排序树的基本运算实现二叉排序树的基本运算#in
13、clude /EOF,NULL#include /EOF,NULL#include /atoi( )#include /atoi( )#include#include /cout,cin/cout,cintypedef int Status;typedef int Status;typedef struct BTNodetypedef struct BTNode int key;int key;struct BTNode *lchild;struct BTNode *lchild;struct BTNode *rchild;struct BTNode *rchild;BTNode;BTNode
14、;/ /定义二叉排序树插入结点的算法定义二叉排序树插入结点的算法int BSTInsert(BTNode *&T,int k)int BSTInsert(BTNode *&T,int k) if(T=NULL)if(T=NULL) T=(BTNode *)malloc(sizeof(BTNode);T=(BTNode *)malloc(sizeof(BTNode);T-lchild=T-rchild=NULL;T-lchild=T-rchild=NULL;T-key=k;T-key=k;return 1;return 1; elseelse if(k=T-key)if(k=T-key)retu
15、rn 0;return 0;else if(kkey)else if(kkey)return BSTInsert(T-lchild, k);return BSTInsert(T-lchild, k);elseelsereturn BSTInsert(T-rchild, k);return BSTInsert(T-rchild, k); / /定义二叉排序树的创建算法定义二叉排序树的创建算法BTNode *createBST(int k,int n)BTNode *createBST(int k,int n) BTNode *T;BTNode *T;T=NULL;T=NULL;for(int i
16、=0;i=n-1;i+)for(int i=0;iT-lchild)&(Trchild)else if(TT-lchild)&(Trchild) else return 0;else return 0;Judge(T-lchild);Judge(T-lchild);Judge(T-rchild);Judge(T-rchild); printf(%d ,T-key);printf(%d ,T-key);if(T-key=k)if(T-key=k)return T;return T;else if(kkey)else if(kkey) return BSTSearch(T-lchild, k);r
17、eturn BSTSearch(T-lchild, k); elseelse return BSTSearch(T-rchild, k);return BSTSearch(T-rchild, k); void main()void main() int a50=4,9,0,1,8,6,3,5,2,7;int a50=4,9,0,1,8,6,3,5,2,7;BTNode *bt=createBST(a,10);BTNode *bt=createBST(a,10);if(Judge(bt)=0) coutbtif(Judge(bt)=0) coutbt不是二叉排序树不是二叉排序树endl;endl
18、;else coutbtelse coutbt是二叉排序树是二叉排序树endl;endl;coutcout查找关键字查找关键字 6 6 的查找路径的查找路径:endl;:endl;BTNode *t=BSTSearch(bt,6);BTNode *t=BSTSearch(bt,6);coutendl;coutendl; 8.48.4/ /实现哈希表的相关运算实现哈希表的相关运算#include #include #define MaxSize 100#define MaxSize 100/ /定义最大哈希表长度定义最大哈希表长度#define NULLKEY 0#define NULLKEY
19、0/ /定义空关键字值定义空关键字值#define DELKEY#define DELKEY -1-1/ /定义被删关键字值定义被删关键字值typedef int KeyType;typedef int KeyType;/ /关键字类型关键字类型typedef char * InfoType;typedef char * InfoType; / /其他数据类型其他数据类型typedef structtypedef struct KeyType key;KeyType key;/ /关键字域关键字域InfoType data;InfoType data;/ /其他数据域其他数据域int coun
20、t;int count;/ /探查次数域探查次数域 HashTableMaxSize; HashTableMaxSize;/ /哈希表类型哈希表类型void InsertHT(HashTable ha,int *n,KeyType k,int p)void InsertHT(HashTable ha,int *n,KeyType k,int p)中中 / /将关键字将关键字 k k 插入到哈希表插入到哈希表int i,adr;int i,adr;adr=k % p;adr=k % p;if (haadr.key=NULLKEY | haadr.key=DELKEY)if (haadr.key=
21、NULLKEY | haadr.key=DELKEY) /xj/xj可可以以直直接接放放在在哈希表中哈希表中 void CreateHT(HashTable ha,KeyType x,int n,int m,int p)void CreateHT(HashTable ha,KeyType x,int n,int m,int p) / /创建哈希表创建哈希表 elseelse n+;n+;i=1;i=1;dodo adr=(adr+1) % p;adr=(adr+1) % p;i+;i+;/i/i 记录记录 xjxj发生冲突的次数发生冲突的次数/ /发生冲突时采用线性探查法解决冲突发生冲突时采用
22、线性探查法解决冲突haadr.key=k;haadr.key=k;haadr.count=1;haadr.count=1; while (haadr.key!=NULLKEY & haadr.key!=DELKEY); while (haadr.key!=NULLKEY & haadr.key!=DELKEY);haadr.key=k;haadr.key=k;haadr.count=i;haadr.count=i; int i,n1=0;int i,n1=0;for (i=0;im;i+)for (i=0;im;i+)/ /哈希表置初值哈希表置初值 hai.key=NULLKEY;hai.ke
23、y=NULLKEY;hai.count=0;hai.count=0; int SearchHT(HashTable ha,int p,KeyType k)int SearchHT(HashTable ha,int p,KeyType k) int i=0,adr;int i=0,adr;adr=k % p;adr=k % p;while (haadr.key!=NULLKEY & haadr.key!=k)while (haadr.key!=NULLKEY & haadr.key!=k) if (haadr.key=k)if (haadr.key=k)return adr;return adr
24、;/ /查找失败查找失败/ /查找成功查找成功i+;i+;/ /采用线性探查法找下一个地址采用线性探查法找下一个地址/ /在哈希表中查找关键字在哈希表中查找关键字 k kfor (i=0;in;i+)for (i=0;in;i+)InsertHT(ha,&n1,xi,p);InsertHT(ha,&n1,xi,p);adr=(adr+1) % p;adr=(adr+1) % p;elseelse return -1;return -1;int DeleteHT(HashTable ha,int p,int k,int *n)int DeleteHT(HashTable ha,int p,int
25、 k,int *n) / /删除哈希表中关键字删除哈希表中关键字 k k void DispHT(HashTable ha,int n,int m)void DispHT(HashTable ha,int n,int m)/ /输出哈希表输出哈希表 float avg=0;float avg=0;int i;int i;printf(printf( 哈希表地址哈希表地址:t);:t);for (i=0;im;i+)for (i=0;im;i+)printf( %3d,i);printf( %3d,i);int adr;int adr;adr=SearchHT(ha,p,k);adr=Searc
26、hHT(ha,p,k);if (adr!=-1)if (adr!=-1) elseelse/ /在哈希表中未找到该关键字在哈希表中未找到该关键字haadr.key=DELKEY;haadr.key=DELKEY;n-;n-;/ /哈希表长度减哈希表长度减 1 1/ /在哈希表中找到该关键字在哈希表中找到该关键字return 1;return 1;return 0;return 0;printf( n);printf( n);printf(printf( 哈希表关键字哈希表关键字:t);:t);for (i=0;im;i+)for (i=0;im;i+)if (hai.key=NULLKEY |
27、 hai.key=DELKEY)if (hai.key=NULLKEY | hai.key=DELKEY)printf(printf(););/ /输出输出 3 3 个空格个空格elseelseprintf( %3d,hai.key);printf( %3d,hai.key);printf( n);printf( n);printf(printf( 搜索次数搜索次数:t);:t);for (i=0;im;i+)for (i=0;im;i+)if (hai.key=NULLKEY | hai.key=DELKEY)if (hai.key=NULLKEY | hai.key=DELKEY)prin
28、tf(printf(););/ /输出输出 3 3 个空格个空格elseelseprintf( %3d,hai.count);printf( %3d,hai.count);printf( n);printf( n);for (i=0;im;i+)for (i=0;im;i+) if (hai.key!=NULLKEY & hai.key!=DELKEY)if (hai.key!=NULLKEY & hai.key!=DELKEY)avg=avg+hai.count;avg=avg+hai.count;avg=avg/n;avg=avg/n;printf(printf( 平均搜索长度平均搜索长度
29、 ASL(%d)=%gn,n,avg);ASL(%d)=%gn,n,avg);void main()void main() int x=16,74,60,43,54,90,46,31,29,88,77;int x=16,74,60,43,54,90,46,31,29,88,77;int n=11,m=13,p=13,i,k=29;int n=11,m=13,p=13,i,k=29;HashTable ha;HashTable ha;CreateHT(ha,x,n,m,p);CreateHT(ha,x,n,m,p);printf(n);DispHT(ha,n,m);printf(n);DispH
30、T(ha,n,m);printf(printf( 查找关键字查找关键字 29:n);29:n);i=SearchHT(ha,p,k);i=SearchHT(ha,p,k);if (i!=-1)if (i!=-1)printf( ha%d.key=%dn,i,k);printf( ha%d.key=%dn,i,k);elseelseprintf(printf( 未找到未找到%dn,k);%dn,k);k=77;k=77;printf(printf( 删除关键字删除关键字%dn,k);%dn,k);DeleteHT(ha,p,k,&n);DeleteHT(ha,p,k,&n);DispHT(ha,
31、n,m);DispHT(ha,n,m);i=SearchHT(ha,p,k);i=SearchHT(ha,p,k);if (i!=-1)if (i!=-1)printf( ha%d.key=%dn,i,k);printf( ha%d.key=%dn,i,k);elseelseprintf(printf( 未找到未找到%dn,k);%dn,k); printf(printf( 插入关键字插入关键字%dn,k);%dn,k);InsertHT(ha,&n,k,p);InsertHT(ha,&n,k,p);DispHT(ha,n,m);DispHT(ha,n,m);printf(n);printf(n);四,实验小结四,实验小结1、通过本次实验,加深了我对查找表的认识。2、有序表的查找之折半查找:前提必须是有序表,性能只有在均匀分布的时候才是最优的。3、二叉排序树查找:通过一系列的查找和插入过程形成的树。之所以叫做排序树,因为按照中序遍历可得一个有序的序列。
限制150内