哈希表的应用
基本要求: 根据给定的一组整数,建立哈希表。
1)设计哈希函数;
2)分别采用线性探测再散列法和链地址法解决冲突;
3)对哈希表进行查找,输出查找成功和不成功的信息。
测试数据要求: 建立哈希表时输入的数据可以有相同的值。
/*设计哈希表
根据给定的一组整数,建立哈希表。
基本要求:
(1)设计哈希函数;
(2)分别采用线性探测再散列法和链地址法解决冲突;
(3)输入元素,在哈希表中进行查找,输出查找成功和不成功的信息。
测试数据要求:
建立哈希表时输入的数据可以有相同的值。
*/
#include <stdio.h>
#include<stdio.h>
#include<stdlib.h>
#define Max 20//初始大小
#define listincrement 10//增量
#define Chushusize 7
typedef struct{
int *data;//数据存储
int length;//表的长度
int listsize;//申请空间大小
}sqlist;//顺序表
typedef struct{
int *data;//哈希表数据存储
int length;//表的长度
int listsize;//申请空间大小
}Hsqlist;//线性哈希表
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode,*HLinklist;
typedef struct HNode{
Lnode *firstarc;//指向第一个依附于该点的指针
}HNode,Hlist[Max];
typedef struct {
Hlist vertices;//哈希表链地址
int listnum;//哈希地址个数
}HashTable;
void Initlist(sqlist &l){
//建立顺序表
printf("请输入线性表的大小:");
scanf("%d",&l.length);
l.data=(int*)malloc(Max*sizeof(int));
l.listsize=Max;
printf("请输入数据元素:");
for(int i=0;i<l.length;i++){
scanf("%d",&l.data[i]);
}
}
void InitHsqlist(sqlist L1,Hsqlist &L2){
//转化哈希表 线性探测再散列法
int i,j,key;
L2.length=Chushusize;
L2.listsize=Max;
L2.data=(int*)malloc(Max*sizeof(int));
for(i=0;i<Max;i++)//初始化哈希表
L2.data[i]=0;
for(i=0;i<L1.length;i++){
key = L1.data[i]%Chushusize;
if(L2.data[key]){
for(j=1;L2.data[key];j++){
key=(L1.data[i]%Chushusize+j)%10;
}
}
L2.data[key]=L1.data[i];
printf("%d-%d\n",key,L1.data[i]);
}
}
void InitHashTable(sqlist L1,HashTable &L2){
//链地址法解决冲突
Lnode *p,*q;
int i,j,key;
L2.listnum = L1.length;
for(i = 0 ; i < Max ; i ++)
L2.vertices[i].firstarc=NULL;
for(i = 0;i < L1.length;i++){
p=(Lnode*)malloc(sizeof(Lnode));
p->data=L1.data[i];
p->next=NULL;
key=L1.data[i]%7;
q=L2.vertices[key].firstarc;
if(q){
while(q->next)
q=q->next ;
q->next=p;
}
else
L2.vertices[key].firstarc=p;
}
return;
}
void Output(Hsqlist L){
int i;
for(i=0;L.data[i]!='\0';i++)
printf("%5d",L.data[i]);
putchar('\n');
}
void Output(HashTable L){
int i;
HLinklist p,q;
for(i=0;i<L.listnum;i++){
p=L.vertices[i].firstarc;
printf("%d----",i);
while(p){
printf("%d->",p->data);
p=p->next;
}
putchar('\n');
}
return ;
}
void ChazhaoHsqlist(Hsqlist H){
//查找 线性探测再散列法哈希表
int n;
printf("根据给出的哈希地址查找元素:");
scanf("%d",&n);
printf("查找元素为:%d\n",H.data[n]);
}
void ChazhaoHsqlist(HashTable H){
//查找 链地址法解决冲突哈希表
int n;
Lnode *temp;
printf("根据给出的哈希地址查找元素:");
scanf("%d",&n);
temp=H.vertices[n].firstarc;
printf("查找元素为:");
while(temp){
printf("%5d",temp->data);
temp=temp->next;
}
}
int main(){
sqlist L1;
Hsqlist L2;
HashTable L3;
Initlist(L1);
InitHsqlist(L1,L2);//转化哈希表 线性探测再散列法
Output(L2);
InitHashTable(L1,L3);// 链地址法解决冲突
Output(L3);
ChazhaoHsqlist(L2);//查找
ChazhaoHsqlist(L3);
return 0;
}