第1页共11页学院:计算机与控制工程学院专业:网络工程姓名:光先生修改密码:nucschool实验一线性表的应用(2学时)1、实验目的通过本实验,掌握线性表链式存储结构的基本原理和基本运算以及在实际问题中的应用。2、实验内容建立某班学生的通讯录,要求用链表存储。具体功能包括:(1)可以实现插入一个同学的通讯录记录;(2)能够删除某位同学的通讯录;(3)对通讯录打印输出。3、实验要求(1)定义通讯录内容的结构体;(2)建立存储通讯录的链表结构并初始化;(3)建立主函数:1)建立录入函数(返回主界面)2)建立插入函数(返回主界面)3)建立删除函数(返回主界面)4)建立输出和打印函数(返回主界面)I)通过循环对所有成员记录输出II)输出指定姓名的某个同学的通讯录记录5)退出具体代码及测试结果界面在下一页第2页共11页#includestdio.h#includestdlib.h#includestring.hstructABInfo{charnumber[11];//学号charname[10];//姓名charphone[13];//电话};typedefstructABList{structABInfoinfo;structABList*next;}list;intmenu(){//主菜单函数intset;printf(\t**********************欢迎使用班级通讯录**********************\n\n);printf(\t\t\t╔━━━━━═操作目录═━━━━━╗\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇1.显示通讯录记录┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇2.添加通讯录成员┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇3.删除通讯录成员┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇4.查找通讯录成员┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇5.插入通讯录记录┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t┃◇6.退出班级通讯录┃\n);printf(\t\t\t┃┃\n);printf(\t\t\t╚━━━━━━━━━━━━━━━━╝\n);printf(\n\t**************************************************************\n);printf(\n\n\t\t\t请选择操作:);scanf(%d,&set);printf(\n);returnset;}voidkey(){//任意键函数printf(\n\t\t\t\t[按任意键返回主界面]\n\n);getchar();getchar();}第3页共11页list*init(list*p){//新建结点函数——建立一个空的节点并初始化其next为NULLlist*q;q=(list*)malloc(sizeof(list));p-next=q;p=q;p-next=NULL;returnp;}voidprint(list*p){//显示函数printf(\t\t\t┏━━━━━━━━━━━━━━━━┑\n);printf(\t\t\t学号:%s\t\t\n,p-info.number);printf(\t\t\t姓名:%s\t\t\n,p-info.name);printf(\t\t\t电话:%s\t\t\n,p-info.phone);printf(\t\t\t┗━━━━━━━━━━━━━━━━┛\n\n);}list*scan(list*p){//录入函数printf(\t请输入添加成员学号:);scanf(%s,p-info.number);printf(\n);printf(\t请输入添加成员姓名:);scanf(%s,p-info.name);printf(\n);printf(\t请输入添加成员电话:);scanf(%s,p-info.phone);printf(\n\t\t\t\t[添加成功!]\n\n);returnp;//返回p是为了方便下面的插入函数}voiddisplay(list*p){//打印函数——输出通讯录所有记录inti=1;if(p-next==NULL)printf(\n\t\t\t[对不起,通讯录是空的!请添加通讯录记录]\n\n);else{printf(\n\t现有通讯录成员如下:\n\n);while(p-next){//当p-next=NULL时退出遍历printf(\t\t\t编号:%d\t\t\n,i++);print(p);//调用显示函数p=p-next;}printf(\n\n);}key();//调用任意键函数}list*add(list*p){//添加函数——添加一个新记录scan(p);//调用录入函数p=init(p);//调用新建结点函数,添加一个未初始化结点,为下一次录入做准备key();//调用任意键函数returnp;//始终让p指向最后一个未初始化结点并返回p}第4页共11页void*find(list*head,char*name){//查找函数-通过姓名查找某同学的通讯录记录并输出list*p;p=head;if(!(head-next))printf(\n\t\t\t[通讯录为空,无可查找记录!]\n\n);else{printf(请输入需要查找同学的姓名:);scanf(%s,name);printf(\n);while(p){if(strcmp(p-info.name,name)==0)break;elsep=p-next;//若查找失败,p会被赋值为最后一个未初始化的节点的next,值为NULL}if(p){printf(\n\t%s同学的通讯录记录如下:\n\n,name);print(p);//调用显示函数}elseprintf(\n\t\t\t[通讯录中没有该同学的记录,请添加!]\n\n);}key();//调用任意键函数}list*dele(list*head,char*name){//删除函数-通过姓名查找某同学的通讯录记录并删除list*p,*q;//q会指向p的前驱结点p=head;if(!(head-next))printf(\n\t\t\t[通讯录为空,无可删除记录!]\n\n);else{//原本以调用find函数的方式找p,但是q是个拦路虎,代码量不能有效减少printf(请输入需要删除记录同学的姓名:);scanf(%s,name);printf(\n);while(p){if(strcmp(p-info.name,name)==0)break;else{q=p;p=p-next;//若查找失败,p会被赋值为最后一个未初始化的节点的next,值为NULL}}if(p){if(p==head)head=head-next;elseq-next=p-next;free(p);printf(\n\t\t\t\t[删除成功!]\n);}else{printf(\n\t\t\t[删除失败!通讯录中没有该同学的记录。]\n\n);}}key();//调用任意键函数第5页共11页returnhead;}list*snumfind(list*head,inti){//序号查找函数——找到第i-1个记录存放位置intj=1;list*q=head;list*p=head;if(i1){printf(\n\t\t\t[你输入的序号有误!!!]\n\n);p-next=NULL;}while(p-next&&i!=j){q=p;p=p-next;j++;}if(!(p-next)){//未找到第i-1个节点,循环就终止printf(\n\t\t\t[你输入的序号有误!!!]\n\n);}returnq;}list*insert(list*head){//插入函数inti;list*p,*q;if(!(head-next))printf(\n\t\t\t[通讯录为空,不可插入,请添加!]\n\n);else{printf(请问你要将新记录插入到哪个序号:);scanf(%d,&i);q=snumfind(head,i);//调用序号查找函数,得到所查序号所在的前驱结点printf(\n);if(q-next!=NULL){if(i==1){//插入记录到第一个记录前p=(list*)malloc(sizeof(list));//为插入新通讯录记录分配空间p=scan(p);//调用录入函数,录入新通讯录记录p-next=head;head=p;}elseif(q-next-next!=NULL){p=(list*)malloc(sizeof(list));p=scan(p);p-next=q-next;q-next=p;}}}key();returnhead;}第6页共11页intquit(){//退出函数——其实是个鸡肋,没必要写成函数,我只是强迫症犯了printf(\t\t\t\t退出成功,欢迎下次使用!\n);printf(\t\t\t\t[MADEBYLAG]\n);return0;}voidsetwrong(){//功能选择错误函数——和上面那位一样是个鸡肋printf(\n\t\t\t\tWRONG!!!无该选项。\n\n);key();//调用任意键函数}intmain(){list*p,*head;p=(list*)malloc(sizeof(list));p-next=NULL;head=p;charname[10];system(color3F);//背景湖蓝色,字体白色intset=1;while(set){switch(menu()){//主菜单函数case1:display(head);break;//打印函数-输出通讯录所有记录case2:p=add(p);break;//添加函数-添加一个新记录case3:head=dele(head,name);break;//删除函数-通过姓名删除通讯录记录case4:find(head,name);break;//查找函数-通过姓名查找通讯录记录并输出case5:head=insert(head);break;//插入函数-插入一个新记录case6:set=quit();break;//退出函数-退出通讯录程序default:setwrong();//功能选择错误提示函数}}return0;}下一页附上测试结果界面第7页共11页1.主菜单——功能选择2.功能选择错误时的提示第8页共11页3.通讯录为空时的提示4.添加功能第9页共11页5.显示(输出)功能6.删除功能2同学已经被删除,通讯录中无该记录,故提示删除失败第10页共11页7.查找功能8.插入功能第11页共11页9.退出