通讯录的设计一、设计思路:经过一个学期的程序设计学习,我逐渐了解了计算机的基本原理和c语言的基本常识,并可以逐渐自己来实现一些简单的程序任务。
此次程序设计我选择了通讯录设计,通过函数、结构体的定义以及一些基本操作运用,经过一个多月的编写、调试、测试,最终完成了该程序的设计。
以下为我的设计思路:首先,确定通讯录的功能,我初步设计了六项功能:输入(程序中对应 enter ())、删除(程序中对应delete())、显示通讯录(程序中对应list())、搜索(程序中对应search())、保存(程序中对应save())、装载(程序中对应 load())。
其次,对于存储的数据结构,我则主要选择了一下几个方面的信息:姓名、性别年龄、籍贯、手机、下一个指针(用于链表的操作与实现)、当前指针(用于链表的操作与实现)。
二、程序源代码:#include <stdio.h>struct address{ /*创建一个address结构*/char name[10]; /*姓名*/char sex[2]; /*性别*/char age[2]; /*年龄*/char native[10]; /*籍贯*/char telephone[12]; /*手机*/struct address *next; /*下一个入口的指针*/struct address *prior; /*当前记录的指针*/} list_entry;struct address *start; /*指向列表中第一个入口*/struct address *last; /*指向列表中最后一个入口*/voidenter(),display(),search(),save(),loa d();menu_select(),list(),delet(),inp uts();main(){char s[20],choice;struct address *info;start=last=NULL; /*列表长度清零*/for(;;) { /*列循环的一个用法*/switch(menu_select()){case 1: enter(); /*输入1,进入enter()程序,是输入通讯录*/break;case 2:delet(); /*输入2,进入delete()程序,是删除一个记录*/break;case 3:list(); /*输入3,进入list()程序,是列表显示通信录*/break;case 4:search(); /*输入4,进入search()程序,搜索一个街道*/break;case 5:save(); /*输入5,保存列表到磁盘文件*/break;case 6:load(); /*输入6,从磁盘文件读入列表*/break;case 7:return(0);}}}/*选择一个选项*/menu_select(){char s[20];int c;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);return c;}/*输入名字和地址*/void enter(){struct address *info,*dls_store();for(;;){info=(struct address *) 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;int count;{char p[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);}/*产生一个又链接表,当一个新元素插入到列表的开始时,一个指向第一个元素的指针被返回*/struct address *dls_store(i,top) /*存贮顺序*/struct address *i;/*新的元素*/struct address *top;/*列表中的第一个元素*/ {struct address *old,*p;if(last==NULL) { /*列表中的第一个元素*/i->next=NULL;i->prior=NULL;last=i;return i;}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;return top;}i->next=p; /*新的第一个元素*/i->prior=NULL;p->prior=i;return i;}}old->next=i; /*设置未尾*/i->next=NULL;i->prior=old;last=i;return start;}/*从列表中删除一个元素*/delet(){struct address *info,*find();char s[10];printf("输入姓名:");gets(s);info=find(s);if(info){if (start==info){start=info->next;if(start)start->prior=NULL;else last=NULL;}else {info->prior->next=info->next;if (info!=last)info->next->prior=info->prior ;elselast=info->prior;}free(info); /*释放空间*/}return(0);}struct address *find(name)/*一个查找姓名的结构*/ char *name;{struct address *info;info=start;while(info){if(!strcmp(name,info->name)) return info;info=info->next;/*获得下一个地址*/}printf("姓名没有发现!\n");return NULL; /*没有发现姓名*/}list() /*列表*/{register int t;struct address *info;info=start;while(info){display(info);info=info->next;/*获得下一个地址*/}printf("\n\n");return(0);}void display(info) /*显示通信录*/struct address *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");}void search() /*搜索一个名字*/{char name[10];struct address *info,*find();printf("输入查找的名字!");gets(name);if(!(info=find(name))) printf("没有找到!\n");else display(info);}void save() /*保存通信录*/{register int t;struct address *info;FILE *fp;if((fp=fopen("mlist","wb")) ==NULL) { /*打开文件名mlist 如果错误*/printf("没有找到文件.\n");exit(1);}printf("\n正在保存文件...\n");info=start;while(info){fwrite(info,sizeof(struct address),1,fp);info=info->next;/*获得下一个地址*/}fclose(fp);}void load() /*打开一个文件*/{register int t;struct address *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=(struct address*) malloc(sizeof(struct address));if(!start){printf("存贮溢出...\n");return;}info=start;while(!feof(fp)){if(1!=fread(info,sizeof(struct address ),1,fp)) break;/*为下一个分配空间*/info->next=(struct address*)malloc (sizeof(struct address));if(!info->next){printf("存贮溢出...\n");return;}info->prior=temp;temp=info;info=info->next;}temp->next=NULL; /*最后一个输入*/last=temp;start->prior=NULL;fclose(fp);}三、调试结果调试结果初始状态如下图所示:以下介绍五大重点功能:步骤一:输入功能。