#include
#include
#define HashSize 53
#define MaxSize 20
typedef struct
{int key;/*关键字*/
int si;/*冲突次数*/
}HashTable1;
void CreateHashTable1(HashTable1 H,int *a,int num)//哈希表线性探测在散列;
{
int i,d,cnt;
for(i=0;i<HashSize;i++)
{
H[i].key=0;
H[i].si=0;
}
for(i=0;i<num;i++)
{
cnt=1;
d=a[i]%HashSize;
if(H[d].key==0)
{
H[d].key=a[i];
H[d].si=cnt;
}
else
{
do
{
d=(d+1)%HashSize;
cnt++;
}
while(H[d].key!=0);
H[d].key=a[i];
H[d].si=cnt;
}
}
printf("\n线性再探索哈希表已建成!");
}
void SearchHash1(HashTable1*h,int data)
{int d;
d=data%HashSize;
if(h[d].key==data)
printf("数字%d的探查次数为:%d\n",h[d].key,h[d].si);
else
{do
d=(d+1)%HashSize;
while(h[d].key!=data && d<HashSize);
if(d<HashSize)
printf("数字%d的探查次数为:%d\n",h[d].key,h[d].si);
else
printf("没有查找到你所输入的数\n");
}
}
typedef struct node{
int key;
int si;
struct node *next;}Node; typedef struct
{
Node *link;
}HashTable2;
void CreateHashTable2(HashTable2 *ht[],int *a,int num)//哈希表链地址;
{
int i,d,cnt;
Node *s,*q;
for(i=0;i<num;i++)
{
ht[i]=(HashTable2)malloc(sizeof(HashTable2));
ht[i]->link=NULL;}
for(i=0;i
{
cnt=1;
s=(Node *)malloc(sizeof(Node));
s->key=a[i];
s->next=NULL;
d=a[i]%num;
if(ht[d]->link==NULL)
{
ht[d]->link=s;
s->si=cnt;}
else
{
q=ht[d]->link;
while(q->next!=NULL)
{
q=q->next;cnt++;
}
cnt++;
s->si=cnt;
q->next=s;
}
}
}
void SearchHash2(HashTable2 * h[],int data,int num)
{int d;
Node q;
d=data%num;
q=h[d]->link;
while(q->key!=data && q->next!=NULL)
q=q->next;
if(q->next!=NULL)
printf("数字%d的查找次数为:%d\n",q->key,q->next);
else
printf("没有找到你要查找的那个数\n");
}
typedef struct
{
int * elem[HashSize];
int count;
int size;
}HashTable3;
int Collision(int p,int &c)//二次探测再散列法解决冲突
{int i,q;
i=c/2+1;
while(i
{
if(c%2==0)
{c++;
q=(p+i*i)%HashSize;
if(q>=0)
return q;
else
i=c/2+1;
}
else
{
q=(p-i*i)%HashSize;
c++;
if(q>=0)return q;
else i=c/2+1;
}
}
return (-1);}
void CreateHash3(HashTable3 *h,int *a,int num)//二次探索表
{
int i,p=-1,c,pp;
for(i=0;i
{c=0;
p=a[i]%HashSize;
pp=p;
while(h->elem[pp]!=NULL)
{
pp=Collision(p,c);
if(pp
{
printf("第%d个记录无法解决冲突\n",i+1);
continue;
}
}
h->elem[pp]=&(a[a[i]]);
h->count++;
printf("第%d个记录冲突次数为%d\n",i+1,c);
}
printf("\n建表完成!\n此哈希表容量为%d,当前表内存储的记录个数%d.\n",HashSize,h->count);
}
void SearchHash3(HashTable3 *h,int data)//哈希表二次探索再散列查找
{
int c=0,p,pp;
p=data%HashSize;
pp=p;
while((h->elem[pp]!=NULL)&&((h->elem[pp])!=data))
pp=Collision(p,c);
if((h->elem[pp]!=NULL)&&(*(h->elem[pp])==data))
printf("\n查找成功!\n查找冲突次数为%d:",c);
else
printf("\n没有查到此数!\n"); }
int num;
void GetIn(int *a)
{
printf("输入添加的个数:");
scanf("%d",&num);
for(int i=0;i
scanf("%d",&a[i]);
printf("数据已经输入完毕!\n");
}
void GetOut(int *a)
{
printf("你所输入的数据:");
for(int i=0;i
printf("%d,",a[i]);
printf("\n输出已完毕!");
}
int main()
{ int data;
HashTable1 hash1[HashSize];
HashTable2 * hash2[HashSize];
HashTable3 * ha;
ha=(HashTable3 *)malloc(sizeof(HashTable3));
for(int i=0;i
ha->elem[i]=NULL;
ha->count=0;
ha->size=HashSize;
int a[MaxSize];
while(1) {
printf("\n ┏━━━━━━━━━━━━━━━┓ ");
printf("\n ┃ 欢迎使用本系统 ┃ ");
printf("\n ┏〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┓");
printf("\n ┃★ ★ ★ ★ ★ ★散列法的实验研究★ ★ ★ ★ ★ ★┃");
printf("\n ┃ 【1】. 添加数据信息 【2】. 数据的输出 ┃");
printf("\n ┃ 【3】. 建立哈希表(线性再散列) ┃");
printf("\n ┃ 【4】. 建立哈希表(二次探测再散列) ┃");
printf("\n ┃ 【5】. 建立哈希表(链地址法) ┃");
printf("\n ┃ 【6】. 线性再散列法查找 ┃");
printf("\n ┃ 【7】. 二次探测再散列法查找 ┃");
printf("\n ┃ 【8】. 链地址法查找 ┃");
printf("\n ┃ 【0】. 退出程序 ┃");
printf("\n ┗〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒〒┛");
printf("\n");
printf("\n");
printf("请输入一个任务选项>>>");
int x;
scanf("%d",&x);
switch(x)
{
case 1:
GetIn (a);break;
case 2:
GetOut(a);break;
case 3:
CreateHashTable1(hash1,a,num);break;
case 4:
CreateHash3(ha,a,num);break;
case 5:
CreateHashTable2(hash2,a,num);break;
case 6:
printf("请输入你查找的数据:");
scanf("%d",&data);
SearchHash1(hash1,data);break;
case 7:
printf("请输入你查找的数据:");
scanf("%d",&data);
SearchHash3(ha,data);break;
case 8:
printf("请输入你查找的数据:");
scanf("%d",&data);
SearchHash2(hash2,data,num);break;
case 0:exit(-1);
}
}
}
程序运行之后,建立哈希表(链地址法)没反应,而且 二次探测再散列法查找,链地址法查找 总是查找不到,求解释
求解释数据结构的程序
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- threenewbee 2016-01-09 22:54关注
void CreateHashTable2(HashTable2 *ht[],int *a,int num)
这个形参不会作用到实参上的,需要用引用
void CreateHashTable2(HashTable2 &*ht[],int *a,int num)解决 无用评论 打赏 举报