#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 11
#define HASHSIZE 53
typedef char data[max];
typedef struct elem{
data name;
data tel;
data add;
}record;
typedef struct slb{
int size;
int length;
record* elem;
}slb;
int eq(data x,data y)
{
if(strcmp(x,y)==0)
return 1;
else return 0;
}
int number;
void scanfdata(record *a)
{ int i;
printf("输入要添加的个数:\n");
scanf("%d",&number);
for(i=0;i<number;i++)
{
printf("请输入第%d个记录的用户名:\n",i+1);
scanf("%s",a[i].name);
printf("请输入%d个记录的电话号码:\n",i+1);
scanf("%s",a[i].tel);
printf("请输入第%d个记录的地址:\n",i+1);
scanf("%s",a[i].add);
}
}
void show(record *a)
{
int i;
for(i=0;i<number;i++)
printf("\n第%d个用户信息:\n 姓名:%s\n 电话号码:%s\n 联系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);
}
int fold(data s)
{
char *p;
long sum=0;
data ss;
strcpy(ss,s);
strupr(ss);
p=ss;
while(*p!='\0')
sum+=*p++;
return sum;
}
int hashm(data str)
{ long n;int m;
n=fold(str);
m=n%HASHSIZE;
return m;
}
int hashd(data str)
{int m;long n;
n=atoi(str);
m=n%HASHSIZE;
return m;
}
int collision(int p,int &c)
{
int i,q;
i=c/2+1;
while(i<HASHSIZE)
{
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 create1(slb &a,record *b)
{
int i,p,c,pp;
for(i=0;i<number;i++)
{
c=0;
p=hashm(b[i].name);
pp=p;
while(a.elem[pp].name!='\0')
{
pp=collision(p,c);
if(pp<0)
{
printf("第%d记录无法解决冲突",i+1);
break;
}
}
a.elem[pp]=b[i];
a.length++;
}
printf("\n建表完成!\n");
}
void search1(slb a,int &c)
{
data str;
printf("\n请输入要查找记录的姓名:\n");
scanf("%s",str);
int p,pp;
p=hashm(str);
pp=p;
while((a.elem[pp].name!='\0')&&(eq(str,a.elem[pp].name)==0))
pp=collision(p,c);
if(a.elem[pp].name!='\0'&&eq(str,a.elem[pp].name)==1)
{
printf("\n成功\n");
printf("姓名 %s\n电话 %s\n地址 %s\n,",a.elem[pp].name,a.elem[pp].tel,a.elem[pp].add);
}
else printf("\n查无此人\n");
}
void create2(slb &a,record *b)
{int i,p=-1,c,pp;
for(i=0;i<number;i++)
{
c=0;
p=hashd(b[i].tel);
pp=p;
while(a.elem[i].tel!='\0')
{
pp=collision(p,c);
if(pp<0)
{
printf("失败");
break;
}
}
a.elem[pp]=b[i];
a.length++;
}
}
void search2(slb a,int &c)
{
data tele;
printf("\n输入电话:\n");
scanf("%s",tele);
int p,pp;
p=hashd(tele);
pp=p;
while((a.elem[pp].tel!='\0')&&(eq(tele,a.elem[pp].tel)==-1))
pp=collision(p,c);
if(a.elem[pp].tel!='\0'!='\0'&&eq(tele,a.elem[pp].tel)==1)
{
printf("姓名:\n%s\n电话:%s\n地址:%s\n",a.elem[pp].name,a.elem[pp].tel,a.elem[pp].add);
}
else printf("不存在");
}
int main()
{
int c,flag=1;
slb h;
h.elem=(record*)malloc((max)*sizeof(record));
h.size=max;
h.length=0;
record a[max];
printf(" 欢迎使用电话号码查找系统 ");
printf("\n 1. 添加用户信息 ");
printf("\n 2. 读取所有用户信息 ");
printf("\n3. 以姓名建表 ");
printf("\n 4. 以电话号码建表 ");
printf("\n5. 查找并显示给定用户名的记录 ");
printf("\n6. 查找并显示给定电话号码的记录 ");
printf("\n7. 退出程序 ");
printf("\n 注意: ");
printf("\n Ⅰ.进行5操作前 请先输出3 ");
printf("\n Ⅱ.进行6操作前 请先输出4 ");
printf("\n");
printf("请输入你想要的操作:");
printf("\n");
while(1)
{
int num;
scanf("%d",&num);
switch(num)
{
case 1:
scanfdata(a);
break;
case 2:
show(a);
break;
case 3:
create1(h,a);
break;
case 4:
create2(h,a);
break;
case 5:
c=0;
search1(h,c);
break;
case 6:
c=0;
search2(h,c);
break;
case 7:
return 0;
break;
default:
printf("输入错误,重输");
printf("\n");
}
}
return 0;
}