哈希表设计实验报告.docx
《哈希表设计实验报告.docx》由会员分享,可在线阅读,更多相关《哈希表设计实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
哈希表设计实验报告
哈希表设计实验报告
//头文件main.c
#include
#include
structkeyNum*hash[100];
structkeyNum*insertHash(structkeyNum*,int);//关键字插入链表
intsearchHash(structkeyNum*,intm);//查找链表中是否存在值为m的整数
voidprint(structkeyNum*);//打印链表
structkeyNum
{
intkey;//关键字
structkeyNum*next;
};
voidmain()
{
inti,k,m,n,num,flag,l,j;
inta[]={280,700,603,430,641,907,640};
structkeyNum*head=NULL;
num=sizeof(a)/sizeof(int);
for(i=0;i{
k=a[i];
m=k%(num+1);//计算得到关键字的哈希值
hash[m]=insertHash(hash[m],k);//将关键字k插入到哈希值为m的链表中
}
printf("采用链地址法得到的哈希表为:
\n");
for(i=0;i{
printf("第%d行:
",i);
print(hash[i]);
printf("\n");
}
printf("请输入要查找的整数值:
\n");
scanf("%d",&n);
for(i=0;i{
l=searchHash(hash[i],n);
if(l==1)
{
j=i;
break;
}
}
if(l==1)printf("整数值%d在哈希表中,位置为链表%d\n",n,j);
}
structkeyNum*insertHash(structkeyNum*head,intm)
{
structkeyNum*p0,*p1,*p2,*temp;
temp=(structkeyNum*)malloc(sizeof(structkeyNum));
temp->key=m;
p1=head;
p0=temp;//要插入的节点(值为m);
if(head==NULL)//1,原来的链表为空,插入到head后
{
head=p0;
p0->next=NULL;
}
else//原来的链表不为空
{
while((p0->key>p1->key)&&(p1->next!
=NULL))//移动到适当位置
{
p2=p1;
p1=p1->next;
}
if(p0->key<=p1->key)
{
if(head==p1)head=p0;//2,插入到第一个节点之前
elsep2->next=p0;//3,插入到p2指向的节点之后
p0->next=p1;
}
else//4,插入到结尾处
{
p1->next=p0;
p0->next=NULL;
}
}
return(head);
}
intsearchHash(structkeyNum*head,intm)//查找链表head中是否存在m
{
intk=0;
structkeyNum*p;
p=head;
if(head!
=NULL)
do
{
if(p->key==m)//存在m
{
k=1;
break;
}
p=p->next;
}while(p!
=NULL);
return(k);//存在m值则返回1,否则返回0;
}
voidprint(structkeyNum*head)//打印链表head
{
structkeyNum*p;
p=head;
if(head!
=NULL)
{
do
{
printf("->%d",p->key);
p=p->next;
}while(p!
=NULL);
}
else
printf("null");
}
头文件HashTable.h
typedefstructKeyNum
{
intkey;
structKeyNum*next;
}keyNum;
//插入
keyNum*insertHash(keyNum*head,intm)
{
keyNum*p0,*p1,*p2,*temp;
temp=(keyNum*)malloc(sizeof(keyNum));
temp->key=m;
p1=head;
p0=temp;//要插入的节点(值为m);
if(head==NULL)//1,原来的链表为空,插入到head后
{
head=p0;
p0->next=NULL;
}
else//原来的链表不为空
{
while((p0->key>p1->key)&&(p1->next!
=NULL))//移动到适当位置
{
p2=p1;
p1=p1->next;
}
if(p0->key<=p1->key)
{
if(head==p1)head=p0;//2,插入到第一个节点之前
elsep2->next=p0;//3,插入到p2指向的节点之后
p0->next=p1;
}
else//4,插入到结尾处
{
p1->next=p0;
p0->next=NULL;
}
}
return(head);
}
//查找
intsearchHash(keyNum*head,intm)//查找链表head中是否存在m
{
intk=0;
keyNum*p;
p=head;
if(head!
=NULL)
do
{
if(p->key==m)//存在m
{
k=1;
break;
}
p=p->next;
}while(p!
=NULL);
return(k);//存在m值则返回1,否则返回0;
}
voidprint(keyNum*head)//打印链表head
{
keyNum*p;
p=head;
if(head!
=NULL)
{
do
{
printf("->%d",p->key);
p=p->next;
}while(p!
=NULL);
}
else
printf("null");
}
测试程序Main.c
#include
#include
#definemSize100//数组最大个数
#include"HashTable.h"
voidmain()
{
inti,k,m,n,num,l,j;
inta[]={180,750,600,430,541,900,640};
keyNum*hash[mSize];
keyNum*head=NULL;
num=sizeof(a)/sizeof(int);
for(i=0;ihash[i]=NULL;
for(i=0;i{
k=a[i];
m=k%(num+1);//计算得到关键字的哈希值
hash[m]=insertHash(hash[m],k);//将关键字k插入到哈希值为m的链表中
}
printf("当前哈希表如下:
\n");
for(i=0;i{
printf("第%d行:
",i);
print(hash[i]);
printf("\n");
}
printf("\n");
printf("请输入要查找的元素:
\n");
scanf("%d",&n);
for(i=0;i{
l=searchHash(hash[i],n);
if(l==1)
{
j=i;
break;
}
}
if(l==1)printf("\n整数值%d在哈希表中,位置为链表%d\n",n,j);
elseprintf("\n整数值%d不在哈希表中!
\n");
}