通讯录的制作数据结构C语言版.docx

上传人:b****8 文档编号:10257839 上传时间:2023-02-09 格式:DOCX 页数:12 大小:18.09KB
下载 相关 举报
通讯录的制作数据结构C语言版.docx_第1页
第1页 / 共12页
通讯录的制作数据结构C语言版.docx_第2页
第2页 / 共12页
通讯录的制作数据结构C语言版.docx_第3页
第3页 / 共12页
通讯录的制作数据结构C语言版.docx_第4页
第4页 / 共12页
通讯录的制作数据结构C语言版.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

通讯录的制作数据结构C语言版.docx

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

通讯录的制作数据结构C语言版.docx

通讯录的制作数据结构C语言版

WTDstandardizationoffice【WTD5AB-WTDK08-WTD2C】

 

通讯录的制作数据结构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所示。

四、设计过程中存在的问题

在设计的过程中,不免出现过很多问题。

首先,设计第一个输入操作时没有考虑到返回的问题,所以如果选择了第一个操作则会无止境的重复输入,后来就在第一项操作后面设定回车直接返回的命令。

其次,为了保证通讯录的实用性和准确性,在设计完成后做了一些修改,比如,限制年龄为两位数、加入防止字符串长度超过存储空间的函数。

另外,在设计“删除”操作时,原先如果不存在删除的项目程序就会出错,后来加入了一条语句提示“该联系人不存在”。

五、有待改进的地方

由于水平有限,通讯录和最初设计的还是有很大的差别,为了更为清晰直观,我觉得可以再做一些修改,比如该程序版式比较凌乱,可以再美化以下排版;在每一个操作项后面加入一些选择条件比如“返回”之类的,更加人性化。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1