求大神看看我的散列表为什么不能存进去数据。。。按联系人姓名为关键字建立散列表。。。
程序代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define M 20//规定最多只能存20个用户 typedef struct number { int pnum;//电话号码 char name[20];//用户名 char address[30];//地址 int flag; }tel; int hash(int x) { int y; y=x % 19;//对19取余就是0-19.刚好有20个数。 return y; } main() { tel t[M]; int n,i,j,x,w; tel a[M]; //散列表 char s[20]; printf("\n请输入联系人个数:"); scanf("%d",&n); for(i=0;i<M;i++)//初始化a数组。 { a[i].flag=0; } for(i=0;i<n;i++) { printf("请输入第%d个人的用户名:",i+1); scanf("%s",t[i].name); x=t[i].name[0]; //将用户名首字母转换成ASCLL码 x=abs(x); w=hash(x); //将用户名首字母的ASCLL码作为关键字放入散列表 printf("请输入第%d个人的电话号码:",i+1); scanf("%d",&t[i].pnum); printf("请输入第%d个人的地址:",i+1); scanf("%s",t[i].address); printf("%d\n",x); printf("%d\n",w); //建立散列表 if(a[w].flag==0) { strcpy(a[w].name,t[i].name); a[w].pnum=t[i].pnum; strcpy(a[w].address,t[i].address); a[w].flag=1; } else if(a[w].flag!=0) { for(j=1;j<=3;j++) { if(a[w+j].flag==0) { strcpy(a[w+j].name,t[i].name); a[w+j].pnum=t[i].pnum; strcpy(a[w+j].address,t[i].address); a[w+j].flag=1; break; } else if(j==3)//当探索3次之后都不为空时。提示溢出 printf("%s溢出无法插入!!!\n",t[i].name); } } } //列出散列表 for(i=0;i<M;i++) { printf("%d ",i); } printf("\n"); for(i=0;i<M;i++) { printf("%s",a[i].name); } }