1.输入一批有序的整形数值,利用折半插找的算法实现查找某数的过程。
2.利用一批数据(不超过13个数),构建一棵二叉排序树,并实现中序遍历该树。
3.将上面的数据利用长度为15的哈希表存储,输出存储后的哈希表。哈希函数采用key%13。
4.根据全班学生的姓名,用拉链法解决碰撞的方法构造一个散列表,选择适当的散列函数,设计并实现插入、删除和查找算法。
5.设计主函数,上机实现。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 100
using namespace std;
#define N 30
typedef struct node1
{
char name[20];
struct node1 *next;
} NODE;
NODE *HashTable[N];
typedef struct node
{
int data;
struct node *lchild,*rchild;
} dsnode,*dstree;
int data[maxn];
int hs (int data[],int n,int t)
{
data[0]=t;
int r=n,l=0;
int mid;
while(r>=l)
{
mid=(r+l)/2;
if(data[mid]==t)
return mid;
else if(data[mid]>t) r=mid-1;
else
l=mid+1;
}
return 0;
}
void charu(dstree &T,int t)
{
dsnode *S;
if(!T)
{
S=(dsnode *)malloc(sizeof(dsnode));
// printf("%p\n",S);
S->data=t;
S->lchild=NULL;
S->rchild=NULL;
T=S;
}
else if(t<T->data)
charu(T->lchild,t);
else if(t>T->data)
charu(T->rchild,t);
}
void creat(dstree &T)
{
int data;
scanf("%d",&data);
while(data!=-1)
{
charu(T,data);
scanf("%d",&data);
}
//printf("%p\n",T);
}
int s[15],cnt=0;
int tt[15];
void bianli(dstree T)
{
if(T)
{
bianli(T->lchild);
printf("%d ",T->data);
s[cnt++]=T->data;
bianli(T->rchild);
}
}
void H(int key)
{
int f=key%13;
if(tt[f]==0)
tt[f]=key;
else
{
for(int i=1; i<15; i++)
{
f=(f+i)%15;
if(tt[f]==0)
{
tt[f]=key;
break;
}
}
}
}
int hh(char name[])
{
int gg=1;
for(int i=0; i<strlen(name); i++)
gg=gg+(name[i]*2);
return gg%N;
}
int searchh(char name[])
{
int hs=hh(name);
NODE *s=HashTable[hs];
int i=1;
for(; s!=NULL; s=s->next)
{
i++;
if(strcmp(s->name,name)==0)
return i;
}
return -1;
}
void creathashmap(dstree T)
{
for(int i=0; i<=15; i++)
tt[i]=0;
for(int i=0; i<cnt; i++)
H(s[i]);
}
void crhash(char name[])
{
int hasht;
hasht=hh(name);
NODE *h=(NODE *)malloc(sizeof(NODE));
strcpy(h->name,name);
h->next=HashTable[hasht];
HashTable[hasht]=h;
}
int delhh(char name[])
{
int hs=hh(name);
NODE *p=HashTable[hs],*s=HashTable[hs];
int i=0;
for(; s!=NULL; s=s->next)
{
i++;
if(strcmp(s->name,name)==0)
{
p->next=s->next;
return 1;
free(s);
}
p=s;
}
return -1;
}
int main()
{
int n,t,i;
//折半
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&data[i]);
printf("请输入要查找的数\n");
scanf("%d",&t);
printf("查找%d的结果为:\n",t);
if(hs(data,n,t)!=0)
printf("%d的位置为%d\n",t,hs(data,n,t));
else
printf("查无此数\n");
printf("请输入要查找的数\n");
scanf("%d",&t);
printf("查找%d的结果为:\n",t);
if(hs(data,n,t)!=0)
printf("%d的位置为%d\n",t,hs(data,n,t));
else
printf("查无此数\n");
//排序二叉树
dstree T=NULL;
creat(T);
printf("中序遍历结果为 :");
bianli(T);
printf("\n");
creathashmap(T);
printf("创建散列表结果为 :");
for(int i=0;i<15;i++)
printf("%d ",tt[i]);
printf("\n");
getchar();
char name[20];
printf("输入要创建hashmap的姓名\n");
gets(name);
while(strcmp(name,"end")!=0)
{
crhash(name);
gets(name);
}
//search hash
printf("\n查找tony\n");
int kk=searchh("tony");
if(kk==-1)
printf("无此人\n");
else
printf("此人存在于hashmap%d的第%d个\n",hh(name),kk);
printf("\n删除tony\n");
kk=delhh("tony");
if(kk==-1)
printf("无此人\n");
else
printf("删除成功\n");
printf("\n再次查找tony\n");
kk=searchh("tony");
if(kk==-1)
printf("无此人\n");
else
printf("此人存在于hashmap%d的第%d个\n",hh(name),kk);
return 0;
}
/*
10
2 3 6 9 15 18 19 52 62 69
62
90
89
56
32
43
53
63
52
86
95
75
65
-1
asfdsdsgsd
jhsdfjksdf
kjsdjk
dsfjlsl
kfkjrfer
jfksjk
tony
sdjfl
dfkll
skdjf
fdsjsd
ll
jj
end
*/