1二○一一年九月设计要求题目三通讯录管理系统任务:自学C语言中相关知识,设计出通讯录管理系统。要求如下所述:建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;;能够提供添加、删除和修改通讯录信息的功能,并给出确认是否保存或删除记录的提示信息;能够提供按姓名或电话等查询并显示相应记录信息;将通讯录保存在文件中;能够按表格方式输出通讯录信息。二、要求为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。源程序要求书写规范,结构清晰。重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和修正。程序详解首先,定义结构体2structstudent{longnum;//用于存储学号charname[20];//姓名intage;//年龄longtelephone;//电话号码charadress[40];//地址charE_mail[30];//邮箱intQQ[12];//增设的QQ一栏structstudent*next;//用于存放下一级指针}first;first为第一个节点,继而在其后动态的开创若干节点。以下是用于链表处理的各个函数:structstudent*creat(structstudent*p)//输入函数voidprintall(structstudent*head)//显示所有记录structstudent*delet(structstudent*head)//删除函数structstudent*insert(structstudent*head)//插入函数structstudent*searchbynum(structstudent*head)//按学号查找structstudent*searchbyname(structstudent*head)//按姓名查找structstudent*search(structstudent*head)//查找函数menu_select()//选择函数以下是各个函数的详细说明:Creat()函数用于创建链表,其中以n记录节点的个数,并在创建时实现自加,以便于后面函数的处理,其循环输入的实现,依靠库函数malloc()和后面的while循环。Printall函数用于显示当前的的所有记录,依靠头指针找到链表首地址,有while循环实现所有记录的输出。Delet()函数用于删除某个记录,删除可以按姓名或学号这两种方式进行的,但本程序中没有这个功能即只可以按学号进行删除(因为学号唯一)。Insert()函数用于插入,同样以头指针找到链表的首地址,并将要插入的学号依次与各个节点中得num比较,然后按顺序将一个节点插入。3Search()函数用于查找,查找函数提供了两种方式,即按姓名查找和按学号查找。在search()函数中可以按提示调用searchbyname()和searchbynum()。Menu_select()函数用于提供函数选项,旨在简化主函数。流程图此即为该程序的主流程图。源程序以下是详细的源程序及部分注释:#includestdio.h#includestring.h#includemalloc.h#includeconio.h#includestdlib.h#defineNULL0#defineLENsizeof(structstudent)#defineSHU%d\n%s\n%5d\n%ld\n%s\n%s\n%sintn;21主函数Menu_select()Printall()Search()Delet()Insert()Searchbyname()Searchbynum()Creat()124304structstudent{longnum;charname[20];intage;longtelephone;charadress[40];charE_mail[30];intQQ[12];structstudent*next;}first;structstudent*creat(structstudent*p)//创建链表的函数,即输入函数{structstudent*head;structstudent*p1,*p2;n=0;//先给n赋值0p1=p2=(structstudent*)malloc(LEN);//强制类型转换printf(\t\t\t****************请输入用户信息****************\n);printf(\t\t\t输入学号:\n);scanf(%ld,&p1-num);printf(\t\t\t输入姓名:\n);scanf(%s,&p1-name);printf(\t\t\t输入年龄:\n);scanf(%d,&p1-age);printf(\t\t\t输入电话:\n);scanf(%ld,&p1-telephone);printf(\t\t\t输入地址\n);scanf(%s,&p1-adress);printf(\t\t\t输入E-mail:\n);scanf(%s,&p1-E_mail);printf(\t\t\t输入QQ\n);scanf(%s,&p1-QQ);//40head=NULL;while(p1-num!=0){n=n+1;//实现n的自加,记录节点的个数if(n==1)head=p1;elsep2-next=p1;p2=p1;p1=(structstudent*)malloc(LEN);printf(\t\t\t****************请输入用户信息****************\n);printf(\t\t\t输入学号:\n);5scanf(%ld,p1-num);printf(\t\t\t输入姓名:\n);scanf(%s,p1-name);printf(\t\t\t输入年龄:\n);scanf(%d,p1-age);printf(\t\t\t输入电话:\n);scanf(%ld,p1-telephone);printf(\t\t\t输入地址\n);scanf(%s,p1-adress);printf(\t\t\t输入E-mail:\n);scanf(%s,p1-E_mail);printf(\t\t\t输入QQ\n);scanf(%s,p1-QQ);}p2-next=NULL;return0;}voidprintall(structstudent*head)//显示所有记录{structstudent*p;printf(\n全部的记录如下\n:);p=head;do{printf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E_mail,p-QQ);p=p-next;}while(p!=NULL);}//80structstudent*delet(structstudent*head)//删除函数{longnum;printf(请输入要删除的号码:\n);scanf(%ld,&num);structstudent*p1,*p2;if(head==NULL){printf(列表为空!n);returnhead;}p1=head;while(num!=p1-num&&p1-next!=NULL){p2=p1;p1-next;6}if(num==p1-num){if(p1==head)//要删除的节点为首节点head=p1-next;elsep2-next=p1-next;printf(delet:%d\n,num);n=n-1;//节点减一}elseprintf(%d未找到该节点!\n,num);returnhead;}structstudent*insert(structstudent*head)//插入函数{structstudent*stud;structstudent*p0,*p1,*p2;p1=head;p0=stud;//p0指向的是要插入的节点if(head==0){head=p0;p0-next=NULL;//120}else{while((p0-nump1-num)&&(p1-next!=NULL)){p2=p1;p1=p1-next;}if(p0-num=p1-num){if(head==p1)head=p0;//插入到原来第一个节点之前elsep2-next=p0;p0-next=p1;//插入到p2所指的节点之后}}n=n+1;returnhead;}7structstudent*searchbynum(structstudent*head)//按学号查找{longnumb;printf(请输入要删除的号码:\n);scanf(%ld,&numb);structstudent*p;p=head;//147scanf(%ld,&numb);if(numb!=p-num)p=p-next;elseprintf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E_mail,p-QQ);returnhead;}structstudent*searchbyname(structstudent*head)//按姓名查找{chara[100];printf(请输入要查找的姓名:\n);scanf(%s,a);structstudent*p;p=head;scanf(%s,a);if(strcmp(a,p-name)!=0)p=p-next;elseprintf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E_mail,p-QQ);returnhead;}structstudent*search(structstudent*head){charchoic;printf(\t\t\t1-按电话号码查找2-按姓名查找);printf(\t\t\t请选择:);choic=getch();switch(choic){case'1':searchbynum(&first);break;case'2':searchbyname(&first);break;}returnhead;}intmenu_select(){chars[80];8inta;//定义整形变量system(cls);printf(\t\t***********欢迎进入通讯管理界面********\n\n);printf(\t\t\t0.输入记录\n);printf(\t\t\t1.显示记录\n);printf(\t\t\t2.查找\n);printf(\t\t\t3.插入记录\n);printf(\t\t\t4.删除记录\n);printf(\t\t\t5.Quit\n);printf(\t\t***********************************************\n\n);do{printf(Enteryouchoice(0~5):);scanf(%s,s);a=atoi(s);}while(a0||a5);returna;}main(){printf(\t\t************************************************\n);printf(\