通讯录的制作数据结构C语言版Word格式.docx
《通讯录的制作数据结构C语言版Word格式.docx》由会员分享,可在线阅读,更多相关《通讯录的制作数据结构C语言版Word格式.docx(12页珍藏版)》请在冰豆网上搜索。

structaddress*last;
/*指向列表中最后一个入口*/
voidenter(),display(),search(),save(),load();
menu_select(),list(),delet(),inputs();
main()
{
chars[20],choice;
structaddress*info;
start=last=NULL;
/*列表长度清零*/
for(;
;
){/*列循环的一个用法*/
switch(menu_select()){
case1:
enter();
/*输入1,进入enter()程序,是输入通讯录*/
break;
case2:
delet();
/*输入2,进入delete()程序,是删除一个记录*/
case3:
list();
/*输入3,进入list()程序,是列表显示通信录*/
case4:
search();
/*输入4,进入search()程序,搜索一个街道*/
case5:
save();
/*输入5,保存列表到磁盘文件*/
case6:
load();
/*输入6,从磁盘文件读入列表*/
case7:
return(0);
}
}
}
/*选择一个选项*/
menu_select()
chars[20];
intc;
printf("
1.输入一个名字(直接回车则退出)\n"
);
2.删除一个名字\n"
3.列表显示\n"
4.搜索查询\n"
5.保存文件\n"
6.装入文件\n"
7.退出\n"
do{
printf("
\n输入您的选择:
"
gets(s);
c=atoi(s);
}while(c<
0||c>
7);
returnc;
/*输入名字和地址*/
voidenter()
structaddress*info,*dls_store();
){
info=(structaddress*)malloc(sizeof(list_entry));
if(!
info){
printf("
\n内存溢出"
return;
inputs("
输入姓名:
info->
name,10);
info->
name[0])break;
/*名字长度为0,停止输入*/
输入性别:
sex,2);
输入年龄:
age,2);
输入籍贯:
native,10);
输入电话:
telephone,12);
start=dls_store(info,start);
/*保存在第一个记录里*/
}/*输入循环*/
inputs(prompt,s,count)/*这个函数用于输入长度为count的一个字符串,用于防止字符串长度超过它的空间,并提出警告*/
char*prompt;
char*s;
intcount;
charp[255];
printf(prompt);
/*显示这个函数的字符串*/
gets(p);
/*从键盘获得255个输入*/
if(strlen(p)>
count)printf("
n字符串超过长度!
/*如果数组P中的长度超过调用函数中的参数count,提示*/
}while(strlen(p)>
count);
/*如果输入的字符串长度超过count,循环重新输入,否则退出,返回调用者*/
strcpy(s,p);
/*s是目标字符串,输出时字符串在s中*/
return(0);
/*产生一个又链接表,当一个新元素插入到列表的开始时,一个指向第一个元素的指针被返回*/
structaddress*dls_store(i,top)/*存贮顺序*/
structaddress*i;
/*新的元素*/
structaddress*top;
/*列表中的第一个元素*/
structaddress*old,*p;
if(last==NULL){/*列表中的第一个元素*/
i->
next=NULL;
prior=NULL;
last=i;
returni;
p=top;
/*从列表的顶部开始*/
old=NULL;
while(p){
if(strcmp(p->
name,i->
name)<
0){
old=p;
p=p->
next;
else{
if(p->
prior){
p->
prior->
next=i;
i->
next=p;
prior=p->
prior;
prior=i;
returntop;
}
i->
/*新的第一个元素*/
p->
returni;
old->
/*设置未尾*/
i->
prior=old;
last=i;
returnstart;
/*从列表中删除一个元素*/
delet()
structaddress*info,*find();
chars[10];
gets(s);
info=find(s);
if(info){
if(start==info){
start=info->
if(start)start->
elselast=NULL;
else{
info->
next=info->
if(info!
=last)
info->
next->
prior=info->
else
last=info->
free(info);
/*释放空间*/
structaddress*find(name)/*一个查找姓名的结构*/
char*name;
info=start;
while(info){
if(!
strcmp(name,info->
name))returninfo;
info=info->
/*获得下一个地址*/
姓名没有发现!
\n"
returnNULL;
/*没有发现姓名*/
list()/*列表*/
registerintt;
display(info);
/*获得下一个地址*/
\n\n"
voiddisplay(info)/*显示通信录*/
structaddress*info;
%s\n"
name);
sex);
age);
native);
telephone);
voidsearch()/*搜索一个名字*/
输入查找的名字!
gets(name);
if(!
(info=find(name)))printf("
没有找到!
elsedisplay(info);
voidsave()/*保存通信录*/
FILE*fp;
if((fp=fopen("
mlist"
"
wb"
))==NULL){/*打开文件名mlist如果错误*/
没有找到文件.\n"
exit
(1);
\n正在保存文件...\n"
fwrite(info,sizeof(structaddress),1,fp);
fclose(fp);
voidload()/*打开一个文件*/
structaddress*info,*temp=NULL;
rb"
))==NULL){
打开文件失败...\n"
while(start){
info=start->
start=info;
\n正在读取文件...\n"
start=(structaddress*)malloc(sizeof(structaddress));
start){
存贮溢出...\n"
return;
while(!
feof(fp)){
if(1!
=fread(info,sizeof(structaddress),1,fp))break;
/*为下一个分配空间*/
info->
next=(structaddress*)malloc(sizeof(structaddress));
next){
prior=temp;
temp=info;
temp->
/*最后一个输入*/
last=temp;
start->
三、调试结果
调试结果初始状态如下图所示:
以下介绍五大重点功能:
步骤一:
输入功能。
选择1,输入名字“张三”,会出现一系列需要输入的信息,输入完毕后按回车,再重复以上动作输入两个人:
王五、李四。
如下图所示。
步骤二:
保存功能。
按两次回车,退出输入状态,按5保存。
如图1所示。
图1
图2
步骤三:
删除功能。
选择2,输入“张三”,回车;
选择5“保存”,回车。
如图2所示。
步骤四:
查看功能。
选择3,回车,得到图3所示。
图3
图4
步骤五:
搜索功能。
选择4,输入“李四”,回车,得到图4所示。
四、设计过程中存在的问题
在设计的过程中,不免出现过很多问题。
首先,设计第一个输入操作时没有考虑到返回的问题,所以如果选择了第一个操作则会无止境的重复输入,后来就在第一项操作后面设定回车直接返回的命令。
其次,为了保证通讯录的实用性和准确性,在设计完成后做了一些修改,比如,限制年龄为两位数、加入防止字符串长度超过存储空间的函数。
另外,在设计“删除”操作时,原先如果不存在删除的项目程序就会出错,后来加入了一条语句提示“该联系人不存在”。
五、有待改进的地方
由于水平有限,通讯录和最初设计的还是有很大的差别,为了更为清晰直观,我觉得可以再做一些修改,比如该程序版式比较凌乱,可以再美化以下排版;
在每一个操作项后面加入一些选择条件比如“返回”之类的,更加人性化。