void hashlistinit2(anode3 w){//初始化散列表开放地址法链地址法
anode2 e;
e=(anode2)malloc(n*sizeof(newnode2));
if(!e) exit(0);
w->q=e;
w->i=n;
w->j=n;
for(int h=0;h<w->j;h++){
w->q[h].number2=0;
w->q[h].v=0;
strcpy(w->q[h].address2,"无");
strcpy(w->q[h].name2,"无");
}
printf("散列表初始化完毕\n");
}
void hashinput2(anode3 w){//添加记录(以号码为关键字)开放定址法
int d,t,k;
printf("请输入数据,输入-1结束\n");
printf("电话号码:");
scanf("%d",&d);
t=d%w->j;
while(d!=-1){
k=1;
if(w->q[t].number2==0&&w->i!=0){
w->q[t].number2=d;
printf("姓名:");
scanf("%s",w->q[t].name2);
printf("地址:");
scanf("%s",w->q[t].address2);
w->i=w->i-1;
w->q[t].v=1;
}
else if(w->q[t].number2!=0){
t=(d+k)%w->j;
k=k+1;
w->q[t].v=2;
while(w->q[t].number2=0&&k<w->j){
t=(d+k)%w->j;
k=k+1;
w->q[t].v++;
}
w->q[t].number2=d;
printf("姓名:");
scanf("%s",w->q[t].name2);
printf("地址:");
scanf("%s",w->q[t].address2);
w->i=w->i-1;
}
else if(w->i==0){
printf("内存已满\n");
}
printf("电话号码:");
scanf("%d",&d);
t=d%w->j;
}
}
void hashshow2(anode3 w){//查询记录(以号码为关键字)开放地址法
int d,k,t;
k=1;
printf("输入要查询的电话号码:");
scanf("%d",&d);
t=d%w->j;
if(w->q[t].number2==d){
printf("-----------------------------\n");
printf("姓名:%s\n",w->q[t].name2);
printf("电话:%d\n",w->q[t].number2);
printf("地址:%s\n",w->q[t].address2);
printf("-----------------------------\n");
}
else{
t=(d+k)%w->j;
k=k+1;
while(w->q[t].number2!=d&&k<w->j){
t=(d+k)%w->j;
k=k+1;
}
if(w->q[t].number2==d){
printf("-----------------------------\n");
printf("姓名:%s\n",w->q[t].name2);
printf("电话:%d\n",w->q[t].number2);
printf("地址:%s\n",w->q[t].address2);
printf("-----------------------------\n");
}
else{
printf("查询号码不存在\n");
}
}
}
void hashinputname2(anode3 w){//添加记录(以用户名为关键字)开放定址法
char a[size];
int e,k,d;
printf("输入要录入的信息,输入-1结束\n");
printf("电话号码:");
scanf("%d",&d);
while(d!=-1){
k=1;
printf("姓名English:");
scanf("%s",a);
e=(int)a[0];
e=e%w->j;
if(strcmp(w->q[e].name2,"无")==0&&w->i!=0){
strcpy(w->q[e].name2,a);
w->q[e].number2=d;
printf("地址:");
scanf("%s",w->q[e].address2);
w->i=w->i-1;
w->q[e].v=1;
}
else if(w->i==0){
printf("内存已满\n");
}
else if(strcmp(w->q[e].name2,"无")!=0){
e=(e+k)%w->j;
k=k+1;
w->q[e].v=2;
while(strcmp(w->q[e].name2,"无")!=0&&k<w->j){
e=(e+k)%w->j;
k=k+1;
w->q[e].v++;
}
strcpy(w->q[e].name2,a);
w->q[e].number2=d;
printf("地址:");
scanf("%s",w->q[e].address2);
w->i=w->i-1;
}
printf("电话号码:");
scanf("%d",&d);
}
}
void hashtableshow2(anode3 w){
int i;
printf("开放定址法哈希表\n");
for(i=0;i<n;i++){
printf("%d ",i);
printf("%d ",w->q[i].number2);
printf("%s ",w->q[i].name2);
printf("%s ",w->q[i].address2);
printf("%d\n",w->q[i].v);
}
}
void hashshow2name2(anode3 w){//查询记录(以用户名为关键字)开放地址法
char a[size];
int e,k;
k=1;
printf("请输入要查询用户名English\n");
scanf("%s",a);
e=(int)a[0];
e=e%w->j;
if(strcmp(w->q[e].name2,a)==0){
printf("-----------------------------\n");
printf("姓名:%s\n",w->q[e].name2);
printf("电话:%d\n",w->q[e].number2);
printf("地址:%s\n",w->q[e].address2);
printf("-----------------------------\n");
}
else{
e=(e+k)%w->j;
k=k+1;
while(strcmp(w->q[e].name2,"无")!=0&&k<w->j){
e=(e+k)%w->j;
k=k+1;
}
if(k>=w->j){
printf("查询用户不存在\n");
}
else{
printf("-----------------------------\n");
printf("姓名:%s\n",w->q[e].name2);
printf("电话:%d\n",w->q[e].number2);
printf("地址:%s\n",w->q[e].address2);
printf("-----------------------------\n");
}
}
}
void ASL2(anode3 w){//计算ASL开放定址法
int asl,c,z;
asl=0;
z=0;
for(c=0;c<w->j;c++){
asl=asl+w->q[c].v;
}
for(c=0;c<w->j;c++){
if(w->q[c].number2!=0){
z++;
}
}
asl=asl/z;
printf("用开放地址法处理冲突:ASL=%d\n",asl);
}
开放定址法的输入出现了一些问题,比如说冲突次数的计算出了问题,还有输入数据莫名其妙跳一个空间,以用户名为关键字和以号码为关键字都出现了这种问题,求教各位大神怎么改动插入算法
你好,我是有问必答小助手。为了技术专家团更好地为您解答问题,烦请您补充下(1)问题背景详情,(2)您想解决的具体问题,(3)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。
您可以点击问题下方的【编辑】,进行补充修改问题。