qq_33666967 2016-01-09 16:35 采纳率: 0%
浏览 1682

求解释数据结构的程序

#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);
}

}

}
程序运行之后,建立哈希表(链地址法)没反应,而且 二次探测再散列法查找,链地址法查找 总是查找不到,求解释

  • 写回答

2条回答 默认 最新

  • threenewbee 2016-01-09 22:54
    关注

    void CreateHashTable2(HashTable2 *ht[],int *a,int num)
    这个形参不会作用到实参上的,需要用引用
    void CreateHashTable2(HashTable2 &*ht[],int *a,int num)

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大