哈希表的实例 (五)

2014-11-24 03:23:27 · 作者: · 浏览: 2
ata[a].address,address);
strcpy(h2.data[a].name,name);
h2.count++;

}
puts("\t成功将电话记录导入电话簿2!");
disp(h2);
fclose(fp);
printf("按任意键继续!\n");
getch();}
flag=0;
break;
case 2:
printf("添加电话记录到电话簿1:\n");
printf("请输入您要添加电话记录的数目:\n");
scanf("%d",&n);
for(i=0;i {
printf("请输入第%d条电话记录的姓名、地址和电话号码(用空格隔开)\n",i+1);
scanf("%s%s%s",name,address,num);
if(HashSearch1(h1,num,a))
{
printf("已存在");
i--;
}
else
{
strcpy(h1.data[a].num,num);
strcpy(h1.data[a].address,address);
strcpy(h1.data[a].name,name);
h1.count++;
}
}
disp(h1);
printf("按任意键继续!\n");
getch();
break;
case 3:printf("添加电话记录到电话簿2:\n");
printf("请输入您要添加电话记录的数目\n");
scanf("%d",&n);
for(i=0;i {
printf("请输入第%d条电话记录的姓名、地址和电话号码(用空格隔开)\n",i+1);
scanf("%s%s%s",name,address,num);
if(HashSearch2(h2,num,a))
{
printf("已存在");
i--;
}
else
{
strcpy(h2.data[a].num,num);
strcpy(h2.data[a].address,address);
strcpy(h2.data[a].name,name);
h2.count++;
}
}
disp(h2);
printf("按任意键继续!\n");
getch();
break;
case 4:disp(h1);
printf("请输入您要在电话簿1中查找的人的电话号码:\n");
scanf("%s",num);
printf("\n");
if(m=HashSearch1(h1,num,a))
{
printf("查找的结果为:\n");
printf("您要查找的人的姓名、地址和电话号码分别为:\n%s,%s,%s\n",h1.data[m].name,h1.data[m].address,h1.data[m].num);
}
else
printf("对不起,没有您要找的人!\n");
printf("按任意键继续!\n");
getch();
break;
case 5:disp(h2);
printf("请输入您要在电话簿2中查找的人的电话号码:\n");
scanf("%s",num);
printf("\n");
if(m=HashSearch2(h2,num,a))
{
printf("查找的结果为:\n");
printf("您要查找的人的姓名、地址和电话号码分别为:\n%s,%s,%s\n",h2.data[m].name,h2.data[m].address,h2.data[m].num);
}
else
printf("对不起,没有您要找的人!\n");
printf("按任意键继续!\n");
getch();
break;
case 6:printf("在电话簿1中查找的ASL为:\n");
printf("%d %d\n",compasl(h1),h1.count);
printf("按任意键继续!\n");
getch();
break;
case 7:printf("在电话簿2中查找的ASL为:\n");
printf("%d %d\n",compasl(h2),h2.count);
printf("按任意键继续!\n");
getch();
break;
}
}
}

下面是课程设计的报告:

一、课程设计的目的与要求

1. 目的: 应用数据结构和算法来设计相应的程序,培养学生问题求解模块的框架设计和详细设计、相关程序实现和调试能力,完成创新能力和实践能力的训练。

2. 要求: 用高级程序设计语言C编码,用VC++开发平台调试。

二、设计正文

(一) 课程设计题目

设计哈希表实现电话号码查询系统

(二) 需求分析

设每个记录有下列数据项:电话号码、用户名、地址;

(1)数据导入(从文件中读取各记录,分别以电话号码为关键字建立哈希表);

(2)从键盘读记录,并插入到哈希表中;

(3)查找并显示给定电话号码的记录;

(4)将电话号码记录保存在文件中;

(5)尝试各种不同类型处理冲突的方法,考察平均查找长度的变化。

分析:由于题目要求以电话号码为关键字建表,考虑到电话号码长短不一,如果直接以表示电话号码的字符串为关键字,可能会造成一定的麻烦。故而,利用一个函数将表示电话号码的字符串转换成其相应的数字,然后把这些数字之和作为关键字即可将上述麻烦解除。

(三) 概要设计

为了实现上述程序的功能,需要定义下列抽象数据类型:

ADT hashtable {

数据对象:哈希表中存储的个条电话记录;

数据关系:表中相邻元素之间有前去和后继的关系;

基本操作:

init(Hashtable &h)

操作结果:初始化了哈希表;

int exchange(char str[])

操作结果:球取关键字;

int HashSearch1(Hashtable &h,char *str,int &p)

操作结果:在表中线性探测数据,返回数据的插入位置;

int HashSearch2(Hashtable &h,char *str,int