通讯录管理系统数据结构C语言版链表实现实验报告.docx
《通讯录管理系统数据结构C语言版链表实现实验报告.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统数据结构C语言版链表实现实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
![通讯录管理系统数据结构C语言版链表实现实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/c4882cb4-dc42-4382-804e-8871b0a3f789/c4882cb4-dc42-4382-804e-8871b0a3f7891.gif)
通讯录管理系统数据结构C语言版链表实现实验报告
GuangxiUniversityofScienceandTechnology
课程设计报告
课程名称:
数据结构与编程综合实训
课题名称:
通讯录管理系统的设计与实现
姓名:
熊信萌
学号:
2003
院系:
计算机科学与通信工程学院
专业班级:
通信141班
指导教师:
周坚和
完成日期:
2015-12-18
第一部分课程设计报告…………………………………………………………3
第1章课程设计目的……………………………………………………3
第2章课程设计内容和要求……………………………………………3
问题描述………………………………………………………3
设计要求…………………………………………………………4
第3章课程设计总体方案及分析………………………………………5
问题分析………………………………………………………4
概要设计…………………………………………………………5
详细设计…………………………………………………………6
调试分析………………………………………………………18
测试结果………………………………………………………18
参考文献………………………………………………………22
第二部分课程设计总结………………………………………………………23
附录(源代码)…………………………………………………………………24
第一部分课程设计报告
第1章课程设计目的
课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。
课程设计就是让所有同学对课程更全面的应用。
本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。
1.实现意义
本次实验应用性能很好,结构清楚,能随时添加、删除、查找、修改、输出联系人;并且可以用姓名、编号两种方式;而且其中增加了排序功能,使得插入之后排序为接下来的操作提供便利,操作更精确,以人性化的方式展现出来,效果十分突出。
2.系统分析
编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出、计算男女人数等功能。
每个记录包含编号、姓名、性别、电话号码个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
第2章课程设计内容和要求
问题描述:
设计并实现一个通讯录信息系统
建立通讯录信息,信息包含编号、姓名、性别、电话;
能够提供添加、删除和修改通讯录信息的功能;
能够提供查询的功能;
能够提供性别统计的功能;
能够输出通讯录信息。
设计要求:
要求设计程序输出如下:
用链表实现学生信息管理系统,完成链表建立(至少包括50个节点),以及链表中信息(节点)的插入、查找、删除、修改、输出等操作,具体的模块要求如下(用“文本文件”按照自定义格式存储数据记录集)。
第一个模块——主函数main()实现功能:
根据菜单的选项调用各函数,并完成相应的功能。
第二个模块——Menu()实现功能:
显示提示菜单。
第三个模块——Quit()实现功能:
退出菜单。
第四个模块——Create()实现功能:
创建新的学生信息记录。
第五个模块——Add()实现功能:
增加新的学生信息记录,并返回菜单。
第六个模块——Find()实现功能:
按要求查询相关的信息,如果找到则显示该学生信息,如果未找到则提示文件中没有该信息,并返回菜单。
第七个模块——Alter()实现功能:
修改某条学生记录的信息,如果未找到要修改的学生记录,则提示系统中无此学生记录,并返回菜单。
第八个模块——Delete()实现功能:
删除某条学生记录,如果未找到要删除的学生记录,则提示该学生记录集中没有,并返回菜单。
第九个模块——List()实现功能:
能够分页显示数据记录集中的所有学生的记录。
第十个模块——Searchbysex()实现功能:
统计通讯录中男性人数及女性人数
第3章课程设计总体方案及分析
问题分析:
该程序是要将几个不同功能的函数用链表串联起来,来组成一个通讯录信息系统。
因为链表能让数据既有独立性又便于数据之间的相互联系,也便于数据的添加和删除。
用模块化程序设计的理念,对几个不同功能的函数,分块处理,这样有利于后期的调试及今后对功能的完善。
菜单中的每一个选项对应着一个子程序,这个系统就由这些子程序建立起来。
下面是这个程序的设计流程图:
图设计流程图
概要设计
1.①构建一个结构体用于建立一个链表。
②链表里面包括了要储存学生的信息的代号。
③屏幕上显示出菜单。
2.本程序包含8个函数:
(1)主函数main()
(2)创建函数LinkListCreateList()
(3)增加通讯录人员函数voidAddNode(LinkListhead,ListNode*p)
(4)删除某个学生信息的函数voidDeleteNode(LinkListhead)
(5)查询通讯录人员的函数ListNode*ListFind(LinkListhead)
(6)修改通讯录人员的函数voidAlterNode(LinkListhead)
(7)性别统计的函数voidSeachbysex(LinkListhead)
(8)通讯录输出函数voidPrintList(LinkListhead)
(9)退出系统函数
详细设计
实现概要设计中定义的所有数据类型及操作的伪代码算法
1.节点类型和指针类型
结构体里面的数据类型:
typedefstruct讯录的建立\n");
head=CreateList();
flag1=1;
break;
}
case2:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n2.通讯者信息的插入\n");
printf("\n编号姓名性别电话\n");
printf("--------------------------------------\n");
p=(ListNode*)malloc(sizeof(ListNode));/*申请新结点*/
printf("输入编号:
\n");
scanf("%s",p->;
printf("输入姓名:
\n");
scanf("%s",p->;
printf("输入性别:
\n");
scanf("%s",p->;
printf("输入电话:
\n");
scanf("%s",p->;
AddNode(head,p);
printf("排序:
\n");
OrderList(l);讯录信息的查询\n");
p=ListFind(head);
if(p!
=NULL)
{
printf("编号姓名性别联系电话\n");
printf("--------------------------------------------------\n");
printf("编号:
%s\n姓名:
%s\n性别:
%s\n联系电话:
%s\n",
p->,p->,p->,p->;
printf("---------------------------------------------------\n");
}
elseprintf("没有查到要查询的通讯者!
\n");
break;
}
case4:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n4.通讯录信息的删除\n");
DeleteNode(head);/*删除结点*/
}
break;
}
case5:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
system("cls");
}
else
{
printf("\n5.通讯录信息的修改\n");
AlterNode(head);
}
break;
}
case6:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n6.通讯录链表的输出\n");
PrintList(head);
}
break;
}
case7:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
system("cls");
}
else
{
printf("\n7.通讯录中男生女生的人数\n");
Seachbysex(head);
}
break;
}
case0:
printf("是否退出(y/n)");
k=getchar();
if(k=='y'||k=='Y')
{
j=0;
printf("\n\n\t\t\t谢谢使用!
谢谢使用!
");
printf("\n按任意键退出");
}
break;
default:
printf("\n输入有错,请重新输入!
\n");
printf("\n按任意键继续...");
getchar();
break;
}
}
}
}
2.通讯录信息系统的具体操作:
(1)添加:
可以添加通讯录记录,依次输入编号、姓名、性别、电话号码后,会提示是否继续添加。
LinkListCreateList()
开始
输入y或n
用if判断输入了y还是n
y
n
输入要输入的资料
将数据保存到指定的文件里
结束
按编号\n");
printf("2.按姓名\n");
printf("----------------\n");
printf("请选择1/2:
");
p=head->next;
单选择
intk,j=1;
ListNode*l;
while(j)
{
printf("\t\t\t熊信萌通讯录课程设计\n");
printf("\t\t\t**");
printf("\n\t\t\t1.通讯录的建立");
printf("\n\t\t\t2.通讯者的插入");
printf("\n\t\t\t3.通讯者的查询");
printf("\n\t\t\t4.通讯者的删除");
printf("\n\t\t\t5.通讯者的修改");
printf("\n\t\t\t6.通讯录的输出");
printf("\n\t\t\t7.男生女生的人数");
printf("\n\t\t\t0.退出通讯录管理系统");
printf("\n\t\t\t");
printf("\n请选择菜单号(0--6):
");
scanf("%d",&k);
getchar();注:
具体源代码见附录
调试分析
在写统计男女生人数的函数时,一开始只能显示出女生的人数,而且我也没有用到strcmp,所以一直遍历整个链表不成功,后来请教了同学了之后才写出统计的函数。
原来开始没有把整个链表传入该函数中。
测试结果
1.主菜单:
2.建立通讯录:
3.显示通讯录信息:
4.删除某个通讯录信息
5.查询通讯录记录:
6.修改通讯录信息
7.通讯录性别统计:
9.退出系统
参考文献
①徐凤生.《数据结构(C语言版)》.机械工业出版社,2009年9月.
②谭浩强.《C程序设计(第三版)》.清华大学出版社.2009年1月.
第2部分课程设计总结
课程设计,使我懂得了做什么事情只要专心去做,就能够克服各种困难,达到自己的说想要的结果。
当然了,同学们和老师的帮助必不可少。
从理论中得出结论。
此次课程设计使我对自己的专业有了更深刻的认识,从而提高了自己实际动手能力和独立思考问题的能力,总而言之,此次课程设计让我受益颇丰。
⑴该通讯录管理系统可以顺利高效运行,实现相关的要求,当然任何程序都存在不足,我这个程序也不例外:
虽然努力在程序中添加了排序模块增加了程序的优化和可读性但是我可以将其中的排序模块的调用放到输出模块中,最后的输出可以更优化些,而不是放在插入后,这样只能根据指示一步一步去调用,相对繁琐一点,其次在程序中增加了修改模块,通过全局的头结点head可以任意修改相关信息,使程序更加可读性和灵活性。
⑵同时在这次课程设计中让我们认识到做程序设计这项工作中我门要具备以下素质:
①良好的文档是正规研发流程中非常重要的环节,缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。
②此外编程是一项高要求的工作所以我们要有规范化,标准化的代码编写习惯通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。
③我们还要有模块化思维能力,模块化思维就是编程任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作。
在编制过程中,可能在实际应用中有些功能不到位,对更多的功能也未能实现。
我将不断提高自己,尤其在相关结点知识方面多努力去学习,多看书,多实践,争取今后在编制程序时,能够认真努力编写出有个性且可读性和应用性较强的数据结构系统。
附录
源文件
#include<>
#include<>
#include<>
#include""
intflag1=0;讯录的建立\n");
head=CreateList();
flag1=1;
break;
}
case2:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n2.通讯者信息的插入\n");
printf("\n编号姓名性别电话\n");
printf("--------------------------------------\n");
p=(ListNode*)malloc(sizeof(ListNode));/*申请新结点*/
printf("输入编号:
\n");
scanf("%s",p->;
printf("输入姓名:
\n");
scanf("%s",p->;
printf("输入性别:
\n");
scanf("%s",p->;
printf("输入电话:
\n");
scanf("%s",p->;
AddNode(head,p);
printf("排序:
\n");
OrderList(l);讯录信息的查询\n");
p=ListFind(head);
if(p!
=NULL)
{
printf("编号姓名性别联系电话\n");
printf("--------------------------------------------------\n");
printf("编号:
%s\n姓名:
%s\n性别:
%s\n联系电话:
%s\n",
p->,p->,p->,p->;
printf("---------------------------------------------------\n");
}
elseprintf("没有查到要查询的通讯者!
\n");
break;
}
case4:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n4.通讯录信息的删除\n");
DeleteNode(head);/*删除结点*/
}
break;
}
case5:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n5.通讯录信息的修改\n");
AlterNode(head);
}
break;
}
case6:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n6.通讯录链表的输出\n");
PrintList(head);
}
break;
}
case7:
{
if(flag1!
=1)
{
printf("请先建立表!
");
getchar();
}
else
{
printf("\n7.通讯录中男生女生的人数\n");
Seachbysex(head);
}
break;
}
case0:
printf("是否退出(y/n)");
k=getchar();
if(k=='y'||k=='Y')
{
j=0;
printf("\n\n\t\t\t谢谢使用!
谢谢使用!
");
printf("\n按任意键退出");
}
break;
default:
printf("\n输入有错,请重新输入!
\n");
printf("\n按任意键继续...");
getchar();
break;
}
}
}
}
头文件
typedefstruct按编号\n");
printf("2.按姓名\n");
printf("----------------\n");
printf("请选择1/2:
");
p=head->next;//假定通讯录表带有结点
scanf("%d",&t);
if(t==1)
{
printf("请输入所求的编号:
");
scanf("%s",number);
while(p&&strcmp(p->,number)<0)//优化的地方
p=p->next;
if(p==NULL||strcmp(p->,number)>0)
p=NULL;//没有查到要查找的通讯者
}
else
if(t==2)
{
printf("请输入要求的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->,name)!
=0)
p=p->next;
}
returnp;
}
voidDeleteNode(LinkListhead)//通讯录链表上的结点删除
{
chars;
ListNode*p,*q;
p=ListFind(head);//调用查找函数
if(p==NULL)
{
printf("没有查到要删除的通讯者!
\n");
return;
}
printf("%s%s%s%s\n",p->,p->,p->,p->;
printf("真的要删除该结点吗(y/n):
");
scanf("%s",&s);
if(s=='y')
{q=head;
while(p!
=NULL&&q->next!
=p)
q=q->next;
q->next=p->next;//删除结点
free(p);//释放被删除的结点空间
printf("通讯者已被删除!
\n");
return;
}
printf("通讯者没有被删除!
\n");
}
voidAlterNode(LinkListhead)//通讯录链表上的结点修改
{
charch;
ListNode*p,*q1;
p=ListFind(head);
if(p==NULL)
{
printf("没有查到要修改的通讯者!
\n");
return;
}
els