#includestring.h#includestdlib.h#includestdio.h#defineNULL0int*p;structnode//建节点{charname[20],address[50];charnum[11];node*next;};structNode//建节点{charname[20],address[50];charnum[11];};typedefnode*Lnode;typedefNodeTnode;typedefstructlode{Lnodenext;}lode;typedefstruct{//顺序表存储下的哈希表intsize;Tnodet[10000];}Qnode;typedefstruct{//链表存储下的哈希表intsize;lodeL[10000];}Pnode;voidchuliu()//除留取余法查询电话号码{QnodeW;memset(W.t,0,sizeof(W.t));//初始化Tnodes;printf(输入录入数据个数:);intn;scanf(%d,&n);W.size=n;//录入元素printf(请输入你要录入的元素:);while(n--){printf(姓名地址电话号码\n);scanf(%s%s%s,s.name,s.name,s.address,s.num);inti=3,key;while(s.num[i]!='\0')//关键字{key+=(s.num[i]-'0');//关键字求和i++;}key=key%21;//线性探测再散列处理冲突if(!strcmp(W.t[key].num,))//查找,解决冲突W.t[key]=s;else{//第一次没解决彻底,继续解决冲突intj=1;while(strcmp(W.t[(key+j)%21].num,))j++;W.t[(key+j)%21]=s;}}printf(请输入你要查找的电话号码:);//查找charxnum[11];scanf(%s,xnum);inti=3;intkey=xnum[2]-'0';while(xnum[i]!='\0'){key+=(xnum[i]-'0');//求和i++;}key=key%21;if(!strcmp(W.t[key].num,xnum))//第一次查找,如果值相等直接赋值printf(%s%s%s\n,W.t[key].name,W.t[key].address,W.t[key].num);else{//第一次没找到,继续查找intj=1;while(strcmp(W.t[(key+j)%21].num,xnum))j++;if(j==20)printf(查找元素不存在!);elseprintf(%s%s%s\n,W.t[(key+j)%21].name,W.t[(key+j)%21].address,W.t[(key+j)%21].num);//输出查找到的元素}}voidshuzi()//按电话号码-数字分析法{Qnodeq1;printf(请输入您要输入的数据个数:);intn,m1,m2;memset(q1.t,0,sizeof(q1.t));//初始化Tnodes;scanf(%d,&n);q1.size=n;for(inti=0;i10000;i++)strcpy(q1.t[i].num,);//置空m1=m2=0;while(n--){printf(请输入您要录入的元素:);printf(姓名地址电话号码\n);scanf(%s%s%s,s.name,s.address,s.num);//读入数据_int64key;key=((_int64)s.num)%10000;//处理冲突if(!strcmp(q1.t[key].num,))q1.t[key]=s;else{i=1;m1++;while(strcmp(q1.t[(key+i)%10000].num,))i++;q1.t[(key+i)%10000]=s;}}printf(请输入您要查找的电话号码:);//查找charxnum[11];scanf(%s,xnum);intk=3;_int64key=(_int64)xnum;key=key%10000;if(!strcmp(q1.t[key].num,xnum))printf(%s%s%s,q1.t[key].name,q1.t[key].address,q1.t[key].num);else{intj=1;while(strcmp(q1.t[(key+j)%10000].num,xnum))j++;if(j==20)printf(查找元素不存在!);elseprintf(%s%s%s\n,q1.t[(key+j)%10000].name,q1.t[(key+j)%10000].address,q1.t[(key+j)%10000].num);}}voidfenxi(){Qnodeq2;printf(请输入您要输入的数据个数:);intn,m1,m2;memset(q2.t,0,sizeof(q2.t));//初始化Tnodes;scanf(%d,&n);q2.size=n;for(inti=0;i10000;i++)strcpy(q2.t[i].name,);//置空m1=m2=0;while(n--){printf(请输入您要录入的元素:);printf(姓名地址电话号码\n);scanf(%s%s%s,s.name,s.address,s.num);_int64key;key=((_int64)s.name)%10000;//处理冲突if(!strcmp(q2.t[key].name,))q2.t[key]=s;else{i=1;m1++;while(strcmp(q2.t[(key+i)%10000].name,))i++;q2.t[(key+i)%10000]=s;}}printf(请输入您要查找的名字:);//查找charxname[20];scanf(%s,xname);intk=1;_int64key=(_int64)xname;key=key%10000;if(!strcmp(q2.t[key].name,xname))printf(%s%s%s,q2.t[key].name,q2.t[key].address,q2.t[key].num);else{intj=1;while(strcmp(q2.t[(key+j)%10000].name,xname))j++;{if(j==20)printf(查找元素不存在!);elseprintf(%s%s%s\n,q2.t[(key+j)%10000].name,q2.t[(key+j)%10000].address,q2.t[(key+j)%10000].num);}}}voidmenu(){printf(********电话号码查询系统********\n);printf(根据电话号码查询1\n);printf(根据用户名查询2\n);printf(********************************\n);printf(请输入您要的选项:\n);intx,y;while(scanf(%d,&x)!=-1){if(x==1){printf(********电话号码查询********\n);printf(除留取余法1\n);printf(数字分析法2\n);printf(****************************\n);printf(请输入y值:\n);scanf(%d,&y);while(y3){switch(y){case1:chuliu();break;case2:shuzi();break;default:printf(输入指令不存在!\n);}printf(********电话号码查询********\n);printf(除留取余法1\n);printf(数字分析法2\n);printf(****************************\n);printf(请输入您要的选项:\n);scanf(%d,&y);}}elseif(x==2){printf(********用户名查询********\n);printf(分析法3\n);printf(**************************\n);fenxi();//调用分析法}elseprintf(查找方式不存在!请重新输入\n);}}intmain(){menu();return0;}