数据结构实验8查找的算法Word格式文档下载.docx
《数据结构实验8查找的算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验8查找的算法Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
输出哈希表;
(2)在上述哈希表中查找关键字为29的记录;
(3)在上述哈希表中删除关键字为77的记录,再将其插入,然后输出哈希表。
输出格式
哈希地址:
012………..12
关键字值:
……………………
三,源代码及结果截图
8.1
//实现顺序查找的算法
#include<
stdio.h>
#defineMAXL100//定义表中最多记录个数
typedefintKeyType;
typedefintInfoType;
typedefstruct
{
KeyTypekey;
//KeyType为关键字的数据类型
InfoTypedata;
//其他数据
}NodeType;
typedefNodeTypeSeqList[MAXL];
//顺序表类型
intSearch(SeqListR,intn,KeyTypek)//顺序查找算法
{
inti=0;
while(i<
n&
&
R[i].key!
=k)
{
printf("
%d"
R[i].key);
i++;
//从表头往后找
}
if(i>
=n)
return-1;
else
%d"
returni;
}
voidmain()
SeqListR;
intn=10;
KeyTypek=5;
InfoTypea[]={3,6,2,10,1,8,5,7,4,9};
inti;
for(i=0;
i<
n;
i++)//建立顺序表
R[i].key=a[i];
printf("
查找结果:
\n"
);
if((i=Search(R,n,k))!
=-1)
\n元素%d的位置是:
k,i);
else
\n元素%d不在表中\n"
k);
8.2
//实现折半查找算法
#defineMAXL100//定义表中最多记录个数
typedefcharInfoType[10];
//KeyType为关键字的数据类型
//顺序表类型
intBinSearch1(SeqListR,intn,KeyTypek)//非递归二分查找算法
intlow=0,high=n-1,mid,count=0;
while(low<
=high)
{
mid=(low+high)/2;
printf("
第%d次查找:
在[%d,%d]中查找到元素R[%d]:
%d\n"
++count,low,high,mid,R[mid].key);
if(R[mid].key==k)//查找成功返回
returnmid;
if(R[mid].key>
k)//继续在R[low..mid-1]中查找
high=mid-1;
else
low=mid+1;
//继续在R[mid+1..high]中查找
return-1;
intBinSearch2(SeqListR,KeyTypek,intlow,inthigh,intcount)//递归二分查找算法
intmid;
if(low<
elseif(R[mid].key>
BinSearch2(R,k,low,mid-1,count);
BinSearch2(R,k,mid+1,high,count);
elsereturn-1;
KeyTypek=9;
inta[]={1,2,3,4,5,6,7,8,9,10},i,n=10;
i++)//建立顺序表
用非递归方法:
if((i=BinSearch1(R,n,k))!
元素%d的位置是%d\n"
元素%d不在表中\n"
用递归方法:
if((i=BinSearch2(R,k,0,9,0))!
8.3
//实现二叉排序树的基本运算
#include<
//EOF,NULL
stdlib.h>
//atoi()
iostream.h>
//cout,cin
typedefintStatus;
typedefstructBTNode
intkey;
structBTNode*lchild;
structBTNode*rchild;
}BTNode;
//定义二叉排序树插入结点的算法
intBSTInsert(BTNode*&
T,intk)
if(T==NULL)
T=(BTNode*)malloc(sizeof(BTNode));
T->
lchild=T->
rchild=NULL;
key=k;
return1;
if(k==T->
key)
return0;
elseif(k<
T->
returnBSTInsert(T->
lchild,k);
rchild,k);
//定义二叉排序树的创建算法
BTNode*createBST(intk[],intn)
BTNode*T;
T=NULL;
for(inti=0;
=n-1;
i++){
BSTInsert(T,k[i]);
returnT;
//判断是否为二叉排序树
StatusJudge(BTNode*&
T)
return1;
elseif((T>
lchild)&
(T<
rchild))
Judge(T->
lchild);
rchild);
elsereturn0;
//定义二叉排序树的查找算法
BTNode*BSTSearch(BTNode*&
returnNULL;
{printf("
T->
key);
if(T->
key==k)
returnBSTSearch(T->
inta[50]={4,9,0,1,8,6,3,5,2,7};
BTNode*bt=createBST(a,10);
if(Judge(bt)==0)cout<
<
"
bt不是二叉排序树"
endl;
elsecout<
bt是二叉排序树"
cout<
查找关键字6的查找路径:
BTNode*t=BSTSearch(bt,6);
8.4
//实现哈希表的相关运算
#defineMaxSize100//定义最大哈希表长度
#defineNULLKEY0//定义空关键字值
#defineDELKEY-1//定义被删关键字值
//关键字类型
typedefchar*InfoType;
//其他数据类型
typedefstruct
//关键字域
//其他数据域
intcount;
//探查次数域
}HashTable[MaxSize];
//哈希表类型
voidInsertHT(HashTableha,int*n,KeyTypek,intp)//将关键字k插入到哈希表中
inti,adr;
adr=k%p;
if(ha[adr].key==NULLKEY||ha[adr].key==DELKEY)//x[j]可以直接放在哈希表中
ha[adr].key=k;
ha[adr].count=1;
else//发生冲突时采用线性探查法解决冲突
i=1;
//i记录x[j]发生冲突的次数
do
{
adr=(adr+1)%p;
i++;
}w