关于哈希表问题,开放定址法的电话查询系统的一些问题

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)问题相关代码图片或者报错信息。便于技术专家团更好地理解问题,并给出解决方案。

您可以点击问题下方的【编辑】,进行补充修改问题。