通讯录的设计一、设计思路:经过一个学期的程序设计学习,我逐渐了解了计算机的基本原理和c语言的基本常识,并可以逐渐自己来实现一些简单的程序任务。
此次程序设计我选择了通讯录设计,通过函数、结构体的定义以及一些基本操作运用,经过一个多月的编写、调试、测试,最终完成了该程序的设计。
以下为我的设计思路:首先,确定通讯录的功能,我初步设计了六项功能:输入(程序中对应enter())、删除(程序中对应delete())、显示通讯录(程序中对应list())、搜索(程序中对应search())、保存(程序中对应save())、装载(程序中对应load())。
其次,对于存储的数据结构,我则主要选择了一下几个方面的信息:姓名、性别年龄、籍贯、手机、下一个指针(用于链表的操作与实现)、当前指针(用于链表的操作与实现)。
二、程序源代码:#include<stdio.h>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(),s ave(),load();menu_select(),list(),delet(),inp uts();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_sto re();for(;;){info=(structaddress*)malloc(si zeof(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 ;elselast=info->prior;}free(info); /*释放空间*/}return(0);}structaddress*find(name)/*一个查找姓名的结构*/ char*name;{structaddress*info;info=start;while(info){if(!strcmp(name,info->name))r eturninfo;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->teleph one);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*)mall oc(sizeof(structaddress));if(!start){printf("存贮溢出...\n");return;}info=start;while(!feof(fp)){if(1!=fread(info,sizeof(structad dress),1,fp))break;/*为下一个分配空间*/info->next=(structaddress*)m alloc(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); }三、调试结果调试结果初始状态如下图所示:以下介绍五大重点功能:步骤一:输入功能。