H->elem[i]=NULL;
H->size=HASHSIZE;
H->count=0;
Recorda[MAXSIZE];
donghua();
while
(1)
{
face();
printf("请输入一个任务选项>>>");
printf("\n");
intnum;
scanf("%d",&num);getchar();
switch(num){
case1:
Create(a);break;
case2:
Append(a);break;
case3:
CreateHash(H,a);break;
case4:
c=0;Find(H,c);break;
case5:
c=0;Delete(H,c);break;
case6:
c=0;Alter(H,c);break;
case7:
List(a);break;
case8:
Save(H);break;
case9:
Load();break;
case0:
Quit();return0;break;
case10:
;;break;
default:
printf("你输错了,请重新输入!
");
printf("\n");}
system("CLS");
}
return0;
}
六、软件说明书
双击程序,程序运行后,进入通信录查询系统菜单的操作界面,然后采用键盘进行操作。
各功能键的选择如下:
1、创建新的通讯录并写入新的信息
2、添加某人的信息
3、以电话号码建立散列表
4、查找并显示给定电话号码的记录
5、删除某人的信息
6、修改某人的信息
7、显示通讯录中所有记录
8、保存通讯录所有记录到指定文件
9、从指定文件中读取通讯录中的记录
0、退出选单
选择1,建立新的通讯录,通讯录创建成功,按Enter键进入添加信息界面,界面会出现
根据系统提示进行相应的添写,添加成功之后,按Enter键返回主菜单。
选择2,在通讯录的末尾写入新的信息,与上诉添加信息操作相同。
同样按Enter键返回主菜单。
选择3,会立即调用冲突处理函数以及建立散列表,界面上会显示冲突次数,哈希表容量和当前储存记录的个数,按Enter键返回主菜单。
3功能键必须在4、5、6功能键之前选择,才能使4、5、6功能键派上用场。
选择4,查找某人信息,写入查找的电话号码,如果通讯录中有则会出现查找成功否则出现此人不存在,查找不成功。
按Enter键返回主菜单。
选择5,删除某人信息,写入删除的电话号码,如果通讯录中有则会出现删除成功否则出现此人不存在,删除不成功。
按Enter键返回主菜单。
选择6,修改某人信息,写入修改的电话号码,通过查找函数找到要修改的信息,在对找的的信息进行修改,如果通讯录中有则会出现原信息让用户输入修改后的信息,根据系统的提示输入修改后的信息,按Enter键会出现修改成功,否则出现此人不存在,修改不成功。
按Enter键返回主菜单。
选择7,界面会输出全部成员的信息。
按Enter键返回主菜单。
选择8,利用存盘函数保存数据到指定文件,界面会出现保存成功,按Enter键返回主菜单。
选择9,载入存储过的电话、姓名、地址,界面会出现指定文件所存储的所有信息。
按Enter键返回主菜单。
选择0,显示再见,按Enter键退出系统。
七、源程序清单
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineMAXSIZE20//电话薄记录数量
#defineMAX_SIZE20//人名的最大长度
#defineHASHSIZE60//定义表长
#defineSUCCESS1
#defineUNSUCCESS-1
#defineLENsizeof(HashTable)//为建立的对象定义长度
typedefintStatus;//为现有类型添加一个同义字
typedefcharNA[MAX_SIZE];//typedef掩饰数组类型
staticintm=0;
typedefstructpeople//记录
{
NAname;
NAtel;//关键字
NAadd;
}Record;//查找表中记录类型
typedefstruct//建立哈希表
{
Record*elem[HASHSIZE];//数据元素存储基址
intcount;//当前数据元素个数
intsize;//当前容量
}HashTable;
inti;
voidMenu()
{
printf("######################################################################\n");
printf("##\t\t\t――――――\t\t\t##\n");
printf("#\t\t\t丨1.创建丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨2.写入丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨3.建表丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨4.查找丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨5.删除丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨6.修改丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨7.查看丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨8.保存丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨9.读取丨#\n");
printf("#\t\t\t――――――#\n");
printf("#\t\t\t丨0.退出丨#\n");
printf("##\t\t\t――――――##\n");
printf("######################################################################\n");
}
voidbenGetTime()//建立时间函数
{
SYSTEMTIMEsys;
GetLocalTime(&sys);
printf("%4d/%02d/%02d%02d:
%02d:
%02d.%03d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds);
}
StatusNUM_BER;//记录的个数
StatusNUM_BER1;
voidCreate(Record*a)//创建新的通讯录
{
system("CLS");//调用DOS命令CLS能够清屏
FILE*fp1,*fp2;
if((fp1=fopen("record.txt","r"))!
=NULL)//打开文件
{
fclose(fp1);//关闭文件
}
else
{
fp2=fopen("record.txt","w");//如果不存在record.txt就创建一个
fclose(fp2);
}
printf("\n");
printf("#############################################################\n");
printf("====================→创建成功←===================\n");
printf("#############################################################\n");
printf("\n");
printf("◇◆请按ENTER进入添加通讯信息菜单◇◆\n");
getchar();
system("CLS");
system("CLS");//调用DOS命令CLS能够清屏
printf("#############################################################\n");
printf("====================→用户信息记录表←===================\n");
printf("#############################################################\n");
printf("输入要添加的个数:
\n");
scanf("%d",&NUM_BER);
for(i=0;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);
}
getchar();
printf("####################################\n");
printf("添加成功!
!
!
\n");
benGetTime();
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("◇◆请按ENTER返回功能操作菜单◇◆\n");
printf("####################################\n");
getchar();
}
Statuseq(NAx,NAy)//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS
{
if(strcmp(x,y)==0)
{
returnSUCCESS;
}
elsereturnUNSUCCESS;
}
voidAppend(Record*a)//键盘输入各人的信息
{
system("CLS");//调用DOS命令CLS能够清屏
printf("#############################################################\n");
printf("====================→用户信息记录表←===================\n");
printf("#############################################################\n");
printf("输入要添加的个数:
\n");
scanf("%d",&NUM_BER1);
intj=i;
for(i;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);
}
getchar();
printf("####################################\n");
printf("添加成功!
!
!
\n");
benGetTime();
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("◇◆请按ENTER返回功能操作菜单◇◆\n");
printf("####################################\n");
getchar();
}
voidList(Record*a)//显示通讯录中所有记录
{
Record*p;
p=a;
inti;
system("CLS");//调用DOS命令CLS能够清屏
printf("#############################################################\n");
printf("====================→用户信息记录表←===================\n");
printf("#############################################################\n");
if(a!
=NULL)
{
printf("\n\n姓名\t电话号\t\t地址\n");
printf("_____________________________________________________\n");
for(i=0;i{
printf("%s\t%s\t\t%s\n",a[i].name,a[i].tel,a[i].add);
printf("_____________________________________________________\n");
}
}
else
{
printf("对不起!
!
没有任何联系人记录!
!
\n\n");
printf("=============================================================\n");
}
benGetTime();
printf("#################################\n");
printf("◇◆请按ENTER返回功能操作菜单◇◆\n");
printf("#################################\n");
getchar();
}
intHash(NAstr)//哈希函数
{
system("CLS");//调用DOS命令CLS能够清屏
longn;
intm;
n=atoi(str);//把字符串转换成整型数.
m=n%HASHSIZE;//用除留余数法构造哈希函数
returnm;//并返回模值
}
Statuscollision(intp,int&c)//冲突处理函数,采用二次探测再散列法解决冲突
{
inti,q;
i=c/2+1;
while(i{
if(c%2==0)
{
c++;
q=(p+i*i)%HASHSIZE;
if(q>=0)
{
returnq;
}
else
{
i=c/2+1;
}
}
else
{
q=(p-i*i)%HASHSIZE;
c++;
if(q>=0)
{
returnq;
}
else
{
i=c/2+1;
}
}
}
returnUNSUCCESS;
}
voidCreateHash(HashTable*H,Record*a)//建表,以电话号码为关键字,建立相应的散列表
{
system("CLS");//调用DOS命令CLS能够清屏
inti,p=-1,c,pp;
for(i=0;i{
c=0;
p=Hash(a[i].tel);
pp=p;
while(H->elem[pp]!
=NULL)
{
pp=collision(p,c);//若哈希地址冲突,进行冲突处理
if(pp<0)
{
printf("#################################