目录
0.功能
1预处理
2 函数声明区
3 电话号码哈希函数(哈希函数)
4 姓名哈希函数(哈希函数)
5 置空函数
6 头插法插入哈希表
7 建立哈希姓名表
8 覆盖建立哈希姓名表
9 搜索姓名函数
10 创建拉链式哈希表(电话号码)
11 打印哈希表拉链
12 覆盖电话号码哈希表
13 搜索电话号码函数
14 删除姓名函数
15 修改功能菜单函数
16 switch函数
17 全部代码
printf("-----------------------------------------------\n");
printf("-------------------功能菜单--------------------\n");
printf("--------------1.建立电话号码哈希表-------------\n");
printf("--------------2.建立姓名序列哈希表-------------\n");
printf("-------------3.打印通讯录全部成员--------------\n");
printf("----4.查找通讯录(手机号)并可选择打印全部信息---\n");
printf("-----5.查找通讯录(姓名)并可选择打印全部信息----\n");
printf("------------------6.删除姓名-------------------\n");
printf("-----------7.在同学录中添加新的人员------------\n");
printf("----------8.修改除姓名以外的全部属性-----------\n");
printf("-----------------------------------------------\n");
typedef struct
{
char name[100];
char TelephoneNumber01[20];
char TelephoneNumber02[20];
char QQNumber[20];
char Address[100];
char YouXiang[100];
}People;
typedef struct Node
{
People Info;
Node *next;
}Node;
#include
#include
#include
int hashnum(int num);//电话号码哈希函数
int hashname(int num);//姓名哈希函数
void InitHash(Node *Hash[]);//置空函数
void TouChaFa(Node *Hash[],People value,int code);//头插法插入哈希表
void CreatHashTableName(Node *Hash[],People value,char o);//建立哈希姓名表
void RecoverHashTableName(Node *Hash[],People people[],char o,int k);//覆盖建立哈希姓名表
int searchName(Node *Hash[],Node *&a);//搜索姓名函数
void CreatHashTable(Node *Hash[],People value,char o);//创建拉链式哈希表(电话号码)
void PrintHashTable(Node *Hash[]);//打印哈希表拉链
void RecoverHashTable(Node *Hash[],People people[],char o,int k);//覆盖电话号码哈希表
int searchNum(Node *Hash[],Node *&a);//搜索电话号码函数
void DeleteName(Node *Hash[]);//删除姓名函数
void pro();//总功能菜单函数
void pro2();//修改功能菜单函数
void swi(Node *Hash[],People people[],int k);//switch函数
int hashnum(int num)
{
return num%10;
}
int hashname(int num)
{
if(num<0)
return -1*num%10;
else
return num%10;
}
void InitHash(Node *Hash[])
{
for(int i=0;i<=9;i++)
{
Hash[i]=(Node *)malloc(sizeof(Node));
Hash[i]->next=NULL;
}
}
void TouChaFa(Node *Hash[],People value,int code)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
p->Info=value;
p->next=Hash[code]->next;
Hash[code]->next=p;
}
void CreatHashTableName(Node *Hash[],People value,char o)
{
int l = int(o);
int j=hashname(l);
TouChaFa(Hash,value,j);
}
void RecoverHashTableName(Node *Hash[],People people[],char o,int k)
{
int i;
for(i=0;i
int searchName(Node *Hash[],Node *&a)
{
int q,p;
//Node *a;
char o[100];
printf("想要查找人的电话是:");
scanf("%s",&o);
printf("\n");
p=int(o[0]);
q=hashname(p);
a=Hash[q];
while(a)
{
if(!strcmp(o,a->Info.name))
{
return 1;
}
a=a->next;
}
return 0;
}
void CreatHashTable(Node *Hash[],People value,char o)
{
int l = int(o);
int j=hashnum(l);
TouChaFa(Hash,value,j);
}
void PrintHashTable(Node *Hash[])
{
int i;
for(i=0;i<10;i++)
{
printf("[%d]",i);
Node *p = (Node *)malloc(sizeof(Node));
p=Hash[i];
while(p->next!=NULL)
{
p=p->next;
printf(" -> %s",p->Info.name);
}
printf(" -> NULL");
printf("\n");
}
}
void RecoverHashTable(Node *Hash[],People people[],char o,int k)
{
int i;
for(i=0;i
int searchNum(Node *Hash[],Node *&a)
{
int q,p;
//Node *a;
char o[100];
printf("想要查找人的电话是:");
scanf("%s",&o);
printf("\n");
p=int(o[0]);
q=hashnum(p);
a=Hash[q];
while(a)
{
if(!strcmp(o,a->Info.TelephoneNumber01))
{
return 1;
}
a=a->next;
}
return 0;
}
void DeleteName(Node *Hash[])
{
Node *p,*pre,*q;
int i,o=0,k=1,x;
char l[100];
printf("想要删除的元素是:");
scanf("%s",&l);
printf("\n");
x=int(l[0]);
i=hashname(x);
p=Hash[i];
q=Hash[i];
while(p)
{
o++;
if(!strcmp(l,p->Info.name))
break;
p=p->next;
}
while(q&&knext;
k++;
}
if(o>1)
{
printf("删除的元素是 %s\n",p->Info.name);
q->next=q->next->next;
free(p);
}else{
printf("删除的元素是 %s\n",p->Info.name);
free(p);
Hash[i]=NULL;
}
printf("删除成功\n");
}
void pro2()
{
printf("--------------------\n");
printf("----修改功能菜单----\n");
printf("---0.退出修改程序---\n");
printf("----1.电话号码01----\n");
printf("----2.电话号码02----\n");
printf("-------3.QQ号-------\n");
printf("-------4.地址-------\n");
printf("-------5.邮箱-------\n");
printf("--------------------\n");
}
void swi(Node *Hash[],People people[],int k)
{
int n,i;
int flag=0;
char s;
Node *a=NULL;
pro();
printf("请输入功能数字: ");
scanf("%d",&n);
printf("\n");
while(n)
{
switch(n)
{
case 0:
n=0;
break;
case 1:
if(flag==0)
{
InitHash(Hash);
RecoverHashTable(Hash,people,people[i].TelephoneNumber01[0],k);
printf("电话号码01通讯录建立成功\n");
flag=1;
}else if(flag==2){
printf("已经建立了姓名通讯录\n");
}else{
printf("已经建立过了\n");
}
break;
case 2:
if(flag==0)
{
InitHash(Hash);
RecoverHashTableName(Hash,people,people[i].name[0],k);
printf("姓名通讯录建立成功\n");
flag=2;
}else if(flag==1)
{
printf("已经建立了电话号码通讯录\n");
}else{
printf("已经建立过了\n");
}
break;
case 3:
if(flag==0)
{
printf("在进行操作三之前需要完成操作一或二\n");
}else{
PrintHashTable(Hash);
}
break;
case 4:
if(flag==1)
{
if(searchNum(Hash,a)){
printf("通讯录中存在这个人,这是%s的电话号码1\n",a->Info.name);
printf("是否打印这个人的全部信息(Y或N): ");
fflush(stdin);
scanf("%c",&s);
if(s=='Y')
{
printf("名字:%s\n",a->Info.name);
printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
printf("QQ号:%s\n",a->Info.QQNumber);
printf("地址:%s\n",a->Info.Address);
printf("QQ邮箱:%s\n",a->Info.YouXiang);
}
}else{
printf("通讯录中不存在这个人\n");
}
}else if(flag==2)
{
printf("您建立是姓名通讯录,请重新输入\n");
}else{
printf("在进行操作四之前完成操作一\n");
}
break;
case 5:
if(flag==2)
{
if(searchName(Hash,a)){
printf("通讯录中存在:%s\n",a->Info.name);
printf("是否打印这个人的全部信息(Y或N): ");
fflush(stdin);
scanf("%c",&s);
if(s=='Y')
{
printf("名字:%s\n",a->Info.name);
printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
printf("QQ号:%s\n",a->Info.QQNumber);
printf("地址:%s\n",a->Info.Address);
printf("QQ邮箱:%s\n",a->Info.YouXiang);
}
}else{
printf("通讯录中不存在这个人\n");
}
}else if(flag==1)
{
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
printf("在进行操作五之前完成操作二\n");
}
break;
case 6:
if(flag==0)
{
printf("在进行操作六之前需要完成操作一或二\n");
}else if(flag==1){
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
DeleteName(Hash);
}
break;
case 7:
if(flag==2)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
printf("请输入姓名:");
scanf("%s",p->Info.name);
printf("\n");
printf("请输入电话号码01:");
scanf("%s",p->Info.TelephoneNumber01);
printf("\n");
printf("请输入电话号码02:");
scanf("%s",p->Info.TelephoneNumber02);
printf("\n");
printf("请输入QQ号码:");
scanf("%s",p->Info.QQNumber);
printf("\n");
printf("请输入地址:");
scanf("%s",p->Info.Address);
printf("\n");
printf("请输入邮箱:");
scanf("%s",p->Info.YouXiang);
printf("\n");
CreatHashTableName(Hash,p->Info,p->Info.name[0]);
printf("插入成功\n");
}else if(flag==1)
{
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
printf("在进行操作七之前需要完成操作二\n");
}
break;
case 8:
if(flag==2)
{
Node *t;
int u;
searchName(Hash,t);
pro2();
printf("你想要修改的内容编号是:");
scanf("%d",&u);
printf("\n");
while(u)
{
switch(u)
{
case 0:
u=0;
break;
case 1:
printf("请输入新的电话号码01: ");
scanf("%s",t->Info.TelephoneNumber01);
printf("\n");
printf("修改成功\n");
break;
case 2:
printf("请输入新的电话号码02: ");
scanf("%s",t->Info.TelephoneNumber02);
printf("\n");
printf("修改成功\n");
break;
case 3:
printf("请输入新的QQ号:");
scanf("%s",t->Info.QQNumber);
printf("\n");
printf("修改成功\n");
break;
case 4:
printf("请输入新的地址:");
scanf("%s",t->Info.Address);
printf("\n");
printf("修改成功\n");
break;
case 5:
printf("请输入新的邮箱: ");
scanf("%s",t->Info.YouXiang);
printf("\n");
printf("修改成功\n");
break;
default :
printf("输入错误,请重新输入,输入范围(0~5)");
}
printf("\n\n");
pro2();
printf("你想要修改的内容编号是:");
scanf("%d",&u);
printf("\n");
}
}else if(flag==1)
{
printf("您建立是姓名通讯录,请重新输入\n");
}else
{
printf("在进行操作八之前需要进行操作二\n");
}
break;
default:
printf("输入错误\n");
}
printf("\n\n\n");
pro();
printf("请输入功能数字: ");
scanf("%d",&n);
printf("\n");
}
}
typedef struct
{
char name[100];
char TelephoneNumber01[20];
char TelephoneNumber02[20];
char QQNumber[20];
char Address[100];
char YouXiang[100];
}People;
typedef struct Node
{
People Info;
Node *next;
}Node;
#include
#include
#include
int hashnum(int num);//电话号码哈希函数
int hashname(int num);//姓名哈希函数
void InitHash(Node *Hash[]);//置空函数
void TouChaFa(Node *Hash[],People value,int code);//头插法插入哈希表
void CreatHashTableName(Node *Hash[],People value,char o);//建立哈希姓名表
void RecoverHashTableName(Node *Hash[],People people[],char o,int k);//覆盖建立哈希姓名表
int searchName(Node *Hash[],Node *&a);//搜索姓名函数
void CreatHashTable(Node *Hash[],People value,char o);//创建拉链式哈希表(电话号码)
void PrintHashTable(Node *Hash[]);//打印哈希表拉链
void RecoverHashTable(Node *Hash[],People people[],char o,int k);//覆盖电话号码哈希表
int searchNum(Node *Hash[],Node *&a);//搜索电话号码函数
void DeleteName(Node *Hash[]);//删除姓名函数
void pro();//总功能菜单函数
void pro2();//修改功能菜单函数
void swi(Node *Hash[],People people[],int k);//switch函数
//主函数
int main()
{
int k,i;
People people[100];
Node *Hash[10];
printf("就目前来说,需要录入通讯录的有几个人: ");
scanf("%d",&k);
printf("\n");
for(i=0;inext=NULL;
}
}
//头插法插入哈希表
void TouChaFa(Node *Hash[],People value,int code)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
p->Info=value;
p->next=Hash[code]->next;
Hash[code]->next=p;
}
//建立哈希姓名表
void CreatHashTableName(Node *Hash[],People value,char o)
{
int l = int(o);
int j=hashname(l);
TouChaFa(Hash,value,j);
}
//覆盖建立哈希姓名表
void RecoverHashTableName(Node *Hash[],People people[],char o,int k)
{
int i;
for(i=0;iInfo.name))
{
return 1;
}
a=a->next;
}
return 0;
}
//创建拉链式哈希表(电话号码)
void CreatHashTable(Node *Hash[],People value,char o)
{
int l = int(o);
int j=hashnum(l);
TouChaFa(Hash,value,j);
}
//打印哈希表拉链
void PrintHashTable(Node *Hash[])
{
int i;
for(i=0;i<10;i++)
{
printf("[%d]",i);
Node *p = (Node *)malloc(sizeof(Node));
p=Hash[i];
while(p->next!=NULL)
{
p=p->next;
printf(" -> %s",p->Info.name);
}
printf(" -> NULL");
printf("\n");
}
}
//覆盖电话号码哈希表
void RecoverHashTable(Node *Hash[],People people[],char o,int k)
{
int i;
for(i=0;iInfo.TelephoneNumber01))
{
return 1;
}
a=a->next;
}
return 0;
}
//删除姓名函数
void DeleteName(Node *Hash[])
{
Node *p,*pre,*q;
int i,o=0,k=1,x;
char l[100];
printf("想要删除的元素是:");
scanf("%s",&l);
printf("\n");
x=int(l[0]);
i=hashname(x);
p=Hash[i];
q=Hash[i];
while(p)
{
o++;
if(!strcmp(l,p->Info.name))
break;
p=p->next;
}
while(q&&knext;
k++;
}
if(o>1)
{
printf("删除的元素是 %s\n",p->Info.name);
q->next=q->next->next;
free(p);
}else{
printf("删除的元素是 %s\n",p->Info.name);
free(p);
Hash[i]=NULL;
}
printf("删除成功\n");
}
//总功能菜单函数
void pro()
{
printf("-----------------------------------------------\n");
printf("-------------------功能菜单--------------------\n");
printf("--------------1.建立电话号码哈希表-------------\n");
printf("--------------2.建立姓名序列哈希表-------------\n");
printf("-------------3.打印通讯录全部成员--------------\n");
printf("----4.查找通讯录(手机号)并可选择打印全部信息---\n");
printf("-----5.查找通讯录(姓名)并可选择打印全部信息----\n");
printf("------------------6.删除姓名-------------------\n");
printf("-----------7.在同学录中添加新的人员------------\n");
printf("----------8.修改除姓名以外的全部属性-----------\n");
printf("-----------------------------------------------\n");
}
//修改功能菜单函数
void pro2()
{
printf("--------------------\n");
printf("----修改功能菜单----\n");
printf("---0.退出修改程序---\n");
printf("----1.电话号码01----\n");
printf("----2.电话号码02----\n");
printf("-------3.QQ号-------\n");
printf("-------4.地址-------\n");
printf("-------5.邮箱-------\n");
printf("--------------------\n");
}
//switch函数
void swi(Node *Hash[],People people[],int k)
{
int n,i;
int flag=0;
char s;
Node *a=NULL;
pro();
printf("请输入功能数字: ");
scanf("%d",&n);
printf("\n");
while(n)
{
switch(n)
{
case 0:
n=0;
break;
case 1:
if(flag==0)
{
InitHash(Hash);
RecoverHashTable(Hash,people,people[i].TelephoneNumber01[0],k);
printf("电话号码01通讯录建立成功\n");
flag=1;
}else if(flag==2){
printf("已经建立了姓名通讯录\n");
}else{
printf("已经建立过了\n");
}
break;
case 2:
if(flag==0)
{
InitHash(Hash);
RecoverHashTableName(Hash,people,people[i].name[0],k);
printf("姓名通讯录建立成功\n");
flag=2;
}else if(flag==1)
{
printf("已经建立了电话号码通讯录\n");
}else{
printf("已经建立过了\n");
}
break;
case 3:
if(flag==0)
{
printf("在进行操作三之前需要完成操作一或二\n");
}else{
PrintHashTable(Hash);
}
break;
case 4:
if(flag==1)
{
if(searchNum(Hash,a)){
printf("通讯录中存在这个人,这是%s的电话号码1\n",a->Info.name);
printf("是否打印这个人的全部信息(Y或N): ");
fflush(stdin);
scanf("%c",&s);
if(s=='Y')
{
printf("名字:%s\n",a->Info.name);
printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
printf("QQ号:%s\n",a->Info.QQNumber);
printf("地址:%s\n",a->Info.Address);
printf("QQ邮箱:%s\n",a->Info.YouXiang);
}
}else{
printf("通讯录中不存在这个人\n");
}
}else if(flag==2)
{
printf("您建立是姓名通讯录,请重新输入\n");
}else{
printf("在进行操作四之前完成操作一\n");
}
break;
case 5:
if(flag==2)
{
if(searchName(Hash,a)){
printf("通讯录中存在:%s\n",a->Info.name);
printf("是否打印这个人的全部信息(Y或N): ");
fflush(stdin);
scanf("%c",&s);
if(s=='Y')
{
printf("名字:%s\n",a->Info.name);
printf("电话号码01:%s\n",a->Info.TelephoneNumber01);
printf("电话号码02:%s\n",a->Info.TelephoneNumber02);
printf("QQ号:%s\n",a->Info.QQNumber);
printf("地址:%s\n",a->Info.Address);
printf("QQ邮箱:%s\n",a->Info.YouXiang);
}
}else{
printf("通讯录中不存在这个人\n");
}
}else if(flag==1)
{
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
printf("在进行操作五之前完成操作二\n");
}
break;
case 6:
if(flag==0)
{
printf("在进行操作六之前需要完成操作一或二\n");
}else if(flag==1){
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
DeleteName(Hash);
}
break;
case 7:
if(flag==2)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
printf("请输入姓名:");
scanf("%s",p->Info.name);
printf("\n");
printf("请输入电话号码01:");
scanf("%s",p->Info.TelephoneNumber01);
printf("\n");
printf("请输入电话号码02:");
scanf("%s",p->Info.TelephoneNumber02);
printf("\n");
printf("请输入QQ号码:");
scanf("%s",p->Info.QQNumber);
printf("\n");
printf("请输入地址:");
scanf("%s",p->Info.Address);
printf("\n");
printf("请输入邮箱:");
scanf("%s",p->Info.YouXiang);
printf("\n");
CreatHashTableName(Hash,p->Info,p->Info.name[0]);
printf("插入成功\n");
}else if(flag==1)
{
printf("您建立是电话号码通讯录,请重新输入\n");
}else{
printf("在进行操作七之前需要完成操作二\n");
}
break;
case 8:
if(flag==2)
{
Node *t;
int u;
searchName(Hash,t);
pro2();
printf("你想要修改的内容编号是:");
scanf("%d",&u);
printf("\n");
while(u)
{
switch(u)
{
case 0:
u=0;
break;
case 1:
printf("请输入新的电话号码01: ");
scanf("%s",t->Info.TelephoneNumber01);
printf("\n");
printf("修改成功\n");
break;
case 2:
printf("请输入新的电话号码02: ");
scanf("%s",t->Info.TelephoneNumber02);
printf("\n");
printf("修改成功\n");
break;
case 3:
printf("请输入新的QQ号:");
scanf("%s",t->Info.QQNumber);
printf("\n");
printf("修改成功\n");
break;
case 4:
printf("请输入新的地址:");
scanf("%s",t->Info.Address);
printf("\n");
printf("修改成功\n");
break;
case 5:
printf("请输入新的邮箱: ");
scanf("%s",t->Info.YouXiang);
printf("\n");
printf("修改成功\n");
break;
default :
printf("输入错误,请重新输入,输入范围(0~5)");
}
printf("\n\n");
pro2();
printf("你想要修改的内容编号是:");
scanf("%d",&u);
printf("\n");
}
}else if(flag==1)
{
printf("您建立是姓名通讯录,请重新输入\n");
}else
{
printf("在进行操作八之前需要进行操作二\n");
}
break;
default:
printf("输入错误\n");
}
printf("\n\n\n");
pro();
printf("请输入功能数字: ");
scanf("%d",&n);
printf("\n");
}
}