通讯录的制作数据结构C语言版.docx
《通讯录的制作数据结构C语言版.docx》由会员分享,可在线阅读,更多相关《通讯录的制作数据结构C语言版.docx(13页珍藏版)》请在冰豆网上搜索。
通讯录的制作数据结构C语言版
通讯录的设计
一、设计思路:
经过一个学期的程序设计学习,我逐渐了解了电脑的基本原理和c语言的基本常识,并可以逐渐自己来实现一些简单的程序任务。
此次程序设计我选择了通讯录设计,通过函数、结构体的定义以及一些基本操作运用,经过一个多月的编写、调试、测试,最终完成了该程序的设计。
以下为我的设计思路:
首先,确定通讯录的功能,我初步设计了六项功能:
输入〔程序中对应enter〔〕〕、删除〔程序中对应delete〔〕〕、显示通讯录〔程序中对应list〔〕〕、搜索〔程序中对应search〔〕〕、保存〔程序中对应save〔〕〕、装载〔程序中对应load〔〕〕。
其次,对于存储的数据结构,我则主要选择了一下几个方面的信息:
、性别年龄、籍贯、、下一个指针〔用于链表的操作与实现〕、当前指针〔用于链表的操作与实现〕。
二、程序源代码:
#include
structaddress{/*创建一个address结构*/
charname[10];/**/
charsex[2];/*性别*/
charage[2];/*年龄*/
charnative[10];/*籍贯*/
chartelephone[12];/**/
structaddress*next;/*下一个入口的指针*/
structaddress*prior;/*当前记录的指针*/
}list_entry;
structaddress*start;/*指向列表中第一个入口*/
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()程序,是删除一个记录*/
break;
case3:
list();/*输入3,进入list()程序,是列表显示通信录*/
break;
case4:
search();/*输入4,进入search()程序,搜索一个街道*/
break;
case5:
save();/*输入5,保存列表到磁盘文件*/
break;
case6:
load();/*输入6,从磁盘文件读入列表*/
break;
case7:
return(0);
}
}
}
/*选择一个选项*/
menu_select()
{
chars[20];
intc;
printf("1.输入一个名字〔直接回车则退出〕\n");
printf("2.删除一个名字\n");
printf("3.列表显示\n");
printf("4.搜索查询\n");
printf("5.保存文件\n");
printf("6.装入文件\n");
printf("7.退出\n");
do{
printf("\n输入您的选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>7);
returnc;
}
/*输入名字和地址*/
voidenter()
{
structaddress*info,*dls_store();
for(;;){
info=(structaddress*)malloc(sizeof(list_entry));
if(!
info){
printf("\n内存溢出");
return;
}
inputs("输入:
",info->name,10);
if(!
info->name[0])break;/*名字长度为0,停止输入*/
inputs("输入性别:
",info->sex,2);
inputs("输入年龄:
",info->age,2);
inputs("输入籍贯:
",info->native,10);
inputs("输入:
",info->telephone,12);
start=dls_store(info,start);/*保存在第一个记录里*/
}/*输入循环*/
}
inputs(prompt,s,count)/*这个函数用于输入长度为count的一个字符串,用于防止字符串长度超过它的空间,并提出警告*/
char*prompt;
char*s;
intcount;
{
charp[255];
do{
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;
i->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;
i->prior=p->prior;
p->prior=i;
returntop;
}
i->next=p;/*新的第一个元素*/
i->prior=NULL;
p->prior=i;
returni;
}
}
old->next=i;/*设置未尾*/
i->next=NULL;
i->prior=old;
last=i;
returnstart;
}
/*从列表中删除一个元素*/
delet()
{
structaddress*info,*find();
chars[10];
printf("输入:
");
gets(s);
info=find(s);
if(info){
if(start==info){
start=info->next;
if(start)start->prior=NULL;
elselast=NULL;
}
else{
info->prior->next=info->next;
if(info!
=last)
info->next->prior=info->prior;
else
last=info->prior;
}
free(info);/*释放空间*/
}
return(0);
}
structaddress*find(name)/*一个查找的结构*/
char*name;
{
structaddress*info;
info=start;
while(info){
if(!
strcmp(name,info->name))returninfo;
info=info->next;/*获得下一个地址*/
}
printf("没有发现!
\n");
returnNULL;/*没有发现*/
}
list()/*列表*/
{
registerintt;
structaddress*info;
info=start;
while(info){
display(info);
info=info->next;/*获得下一个地址*/
}
printf("\n\n");
return(0);
}
voiddisplay(info)/*显示通信录*/
structaddress*info;
{
printf("%s\n",info->name);
printf("%s\n",info->sex);
printf("%s\n",info->age);
printf("%s\n",info->native);
printf("%s\n",info->telephone);
printf("\n\n");
}
voidsearch()/*搜索一个名字*/
{
charname[10];
structaddress*info,*find();
printf("输入查找的名字!
");
gets(name);
if(!
(info=find(name)))printf("没有找到!
\n");
elsedisplay(info);
}
voidsave()/*保存通信录*/
{
registerintt;
structaddress*info;
FILE*fp;
if((fp=fopen("mlist","wb"))==NULL){/*打开文件名mlist如果错误*/
printf("没有找到文件.\n");
exit
(1);
}
printf("\n正在保存文件...\n");
info=start;
while(info){
fwrite(info,sizeof(structaddress),1,fp);
info=info->next;/*获得下一个地址*/
}
fclose(fp);
}
voidload()/*打开一个文件*/
{
registerintt;
structaddress*info,*temp=NULL;
FILE*fp;
if((fp=fopen("mlist","rb"))==NULL){
printf("打开文件失败...\n");
exit
(1);
}
while(start){
info=start->next;
free(info);
start=info;
}
printf("\n正在读取文件...\n");
start=(structaddress*)malloc(sizeof(structaddress));
if(!
start){
printf("存贮溢出...\n");
return;
}
info=start;
while(!
feof(fp)){
if(1!
=fread(info,sizeof(structaddress),1,fp))break;
/*为下一个分配空间*/
info->next=(structaddress*)malloc(sizeof(structaddress));
if(!
info->next){
printf("存贮溢出...\n");
return;
}
info->prior=temp;
temp=info;
info=info->next;
}
temp->next=NULL;/*最后一个输入*/
last=temp;
start->prior=NULL;
fclose(fp);
}
三、调试结果
调试结果初始状态如下列图所示:
以下介绍五大重点功能:
步骤一:
输入功能。
选择1,输入名字“张三”,会出现一系列需要输入的信息,输入完毕后按回车,再重复以上动作输入两个人:
王五、李四。
如下列图所示。
步骤二:
保存功能。
按两次回车,退出输入状态,按5保存。
如图1所示。
图1
图2
步骤三:
删除功能。
选择2,输入“张三”,回车;选择5“保存”,回车。
如图2所示。
步骤四:
查看功能。
选择3,回车,得到图3所示。
图3
图4
步骤五:
搜索功能。
选择4,输入“李四”,回车,得到图4所示。
四、设计过程中存在的问题
在设计的过程中,不免出现过很多问题。
首先,设计第一个输入操作时没有考虑到返回的问题,所以如果选择了第一个操作则会无止境的重复输入,后来就在第一项操作后面设定回车直接返回的命令。
其次,为了保证通讯录的实用性和准确性,在设计完成后做了一些修改,比方,限制年龄为两位数、加入防止字符串长度超过存储空间的函数。
另外,在设计“删除”操作时,原先如果不存在删除的项目程序就会出错,后来加入了一条语句提示“该联系人不存在”。
五、有待改良的地方
由于水平有限,通讯录和最初设计的还是有很大的差异,为了更为清晰直观,我觉得可以再做一些修改,比方该程序版式比较凌乱,可以再美化以下排版;在每一个操作项后面加入一些选择条件比方“返回”之类的,更加人性化。