1.需求分析
本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。
(1)按提示输入相应的联系人的相关资料;
(2)以相应的输出形式输出所存储的的联系人的资料;
(3)程序可以达到建立、添加、查找、打印的功能;
(4)程序可以判断用户输入的非法数据并引导正确的输入。
2.概要设计
存储电话号码的记录时,若在存储位置和其关键字之间建立某种确定的对应关系使得每个关键字和存储结构中一个唯一的存储位置相对应,那么在进行查找时,根据这个对应关系f就可以找到给定值K的像f(K)。若存储结构中存在关接找到所查记录。这个对应关系f称为哈希(Hash)函数或散列函数。按照以上思路建立的表称为哈希表或散列表。本案例设计主要考察散列表的建立、查找和修改。。
3.详细设计
#include
#include
#include
typedef struct node
{
char num[11],name[15],address[20],city[15],etp[20];
struct node *next;
}NUM;
struct NUM *num_list[19];
int hash(char num[])
{
int i,k=0;
for(i=0;num[i]!='\0';i++)
{
k=10*k+num[i]-48; //字符转化为数字
}
k=(k%19); //除余法求散列地址
return k;
}//c除留余数法处理电话号码
void create()
{
struct node *p1;
int k1,m=0;
while(m==0)
{
printf("请输入你想添加人的信息:num name address city etp,\n");
p1=(struct node *)malloc(sizeof(struct node));
scanf("%s",p1->num);
scanf("%s",p1->name);
scanf("%s",p1->address);
scanf("%s",p1->city);
scanf("%s",p1->etp);
k1=hash(p1->num);//用num数组值作为参数传递给哈希函数得到k1
p1->next=num_list[k1];//將k1得到的值作为数组的储存地址赋值给头结点的下一个节点
num_list[k1]=p1;//再將p1的数据传递给数组,故p1可以释放作为下一个节点产生
printf("结束请按1,再次输入请按0\n");
scanf("%d",&m);
}
printf("通讯表已经创建\n");
}
void dlter()
{
char num[11];
int k1;
int find=0;
struct node *f;
printf("请查询要修改的联系人的电话:\n:");
scanf("%s",num);
k1=hash(num);
f=num_list[k1];
while(f!=NULL)
{
if(strcmp(f->num,num)==0)
{
printf("查找到了!请输入要修改的人的资料:\n");
scanf("%s%s%s",f->num,f->name,f->address,f->city,f->etp);
find=1;
}
f=f->next;
}
if(find=0)
printf("没有找到要删除的节点!");
}
void list()
{
struct node *f;//打印节点指针
int i;
printf("打印通讯录如下:\n");
for(i=0;i<19;i++)
{
f=num_list[i];
while(f!=NULL)
{
printf("--->num:%s\t name:%s\t address:%s\t city:%s\t etp:%s\t \n",f->num,f->name,f->address,f->city,f->etp);
f=f->next;
}
}
}
void add()
{
char num[11],name[15],address[20],city[15],etp[20];
struct node *p1;
int k1;
printf("请输入新添加的人的信息:电话 姓名 地址 城市 邮箱\n");
p1=(struct node *)malloc(sizeof(struct node));
scanf("%s%s%s",num,name,address);
strcpy(p1->num,num);
strcpy(p1->name,name);
strcpy(p1->address,address);
strcpy(p1->city,city);
strcpy(p1->etp,etp);
k1=hash(p1->num);
p1->next=num_list[k1];
num_list[k1]=p1;
printf("ok\n");
}
void search()
{
char num[11];
int k1;
int find=0;
struct node *f;
printf("请输入查询人的电话号码:");
scanf("%s",num);
k1=hash(num);
f=num_list[k1];
while(f!=NULL)
{
if(strcmp(f->num,num)==0)
{
printf("所要查找的联系人信息 :num:%s name:%s address:%s city:%s etp:%s\n",f->num,f->name,f->address,f->city,f->etp);
find=1;
}
f=f->next;
}
if(find=0)
printf("此联系人没有找到!");
}
void main()
{
int i;
char x;
for(i=0;i<19;i++)
{
num_list[i]=NULL;
}
while(1)
{
// system("cls");
printf("\n");
printf("★★★★★★★★★通讯录★★★★★★★★★\n");
printf("★◆----------------------------------◆★\n");
printf("★| 1.建立 |★\n");
printf("★| |★\n");
printf("★| 2.查找 |★\n");
printf("★| |★\n");
printf("★| 3.添加 |★\n");
printf("★| |★\n");
printf("★| 4.修改 |★\n");
printf("★| |★\n");
printf("★| 5.打印 |★\n");
printf("★| |★\n");
printf("★| 6.结束 |★\n");
printf("★◆----------------------------------◆★\n");
printf("★★★★★★★★★★★★★★★★★★★★★\n");
// x=getchar();
scanf("%s",&x);
switch(x)
{
case '1': create();break;
case '2': search();break;
case '3': add();break;
case '4': dlter();break;
case '5': list();break;
case '6': return;
default:printf("请重新输入;\n");
}
}
}