通讯录管理系统数据结构C语言版链表实现实验报告Word文档下载推荐.docx
- 文档编号:8608473
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:36
- 大小:260.82KB
通讯录管理系统数据结构C语言版链表实现实验报告Word文档下载推荐.docx
《通讯录管理系统数据结构C语言版链表实现实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统数据结构C语言版链表实现实验报告Word文档下载推荐.docx(36页珍藏版)》请在冰点文库上搜索。
2.系统分析
编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出、计算男女人数等功能。
每个记录包含编号、、性别、个人基本信息。
用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。
本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。
对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
第2章课程设计容和要求
2.1问题描述:
设计并实现一个通讯录信息系统
●建立通讯录信息,信息包含编号、、性别、;
●能够提供添加、删除和修改通讯录信息的功能;
●能够提供查询的功能;
●能够提供性别统计的功能;
●能够输出通讯录信息。
2.2设计要求:
要求设计程序输出如下:
用链表实现学生信息管理系统,完成链表建立(至少包括50个节点),以及链表息(节点)的插入、查找、删除、修改、输出等操作,具体的模块要求如下(用“文本文件”按照自定义格式存储数据记录集)。
第一个模块——主函数main()实现功能:
根据菜单的选项调用各函数,并完成相应的功能。
第二个模块——Menu()实现功能:
显示提示菜单。
第三个模块——Quit()实现功能:
退出菜单。
第四个模块——Create()实现功能:
创建新的学生信息记录。
第五个模块——Add()实现功能:
增加新的学生信息记录,并返回菜单。
第六个模块——Find()实现功能:
按要求查询相关的信息,如果找到则显示该学生信息,如果未找到则提示文件中没有该信息,并返回菜单。
第七个模块——Alter()实现功能:
修改某条学生记录的信息,如果未找到要修改的学生记录,则提示系统中无此学生记录,并返回菜单。
第八个模块——Delete()实现功能:
删除某条学生记录,如果未找到要删除的学生记录,则提示该学生记录集中没有,并返回菜单。
第九个模块——List()实现功能:
能够分页显示数据记录集中的所有学生的记录。
第十个模块——Searchbysex()实现功能:
统计通讯录中男性人数及女性人数
第3章课程设计总体方案及分析
3.1问题分析:
该程序是要将几个不同功能的函数用链表串联起来,来组成一个通讯录信息系统。
因为链表能让数据既有独立性又便于数据之间的相互联系,也便于数据的添加和删除。
用模块化程序设计的理念,对几个不同功能的函数,分块处理,这样有利于后期的调试及今后对功能的完善。
菜单中的每一个选项对应着一个子程序,这个系统就由这些子程序建立起来。
下面是这个程序的设计流程图:
图3.1设计流程图
3.2概要设计
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)退出系统函数
3.3详细设计
实现概要设计中定义的所有数据类型及操作的伪代码算法
1.节点类型和指针类型
结构体里面的数据类型:
typedefstruct//通讯录数据类型
{
charnumber[3];
//编号
charname[9];
//
charsex[10];
//性别
chartelephone[11];
}DataType
主函数
voidmain()
intk,j=1;
ListNode*l;
while(j)
{
printf("
\t\t\t熊信萌通讯录课程设计\n"
);
\t\t\t********************************"
\n\t\t\t1.通讯录的建立"
\n\t\t\t2.通讯者的插入"
\n\t\t\t3.通讯者的查询"
\n\t\t\t4.通讯者的删除"
printf("
\n\t\t\t5.通讯者的修改"
\n\t\t\t6.通讯录的输出"
\n\t\t\t7.男生女生的人数"
\n\t\t\t0.退出通讯录管理系统"
\n\t\t\t******************************"
\n请选择菜单号(0--6):
"
scanf("
%d"
&
k);
getchar();
switch(k)
{
case1:
{
printf("
\n1.通讯录的建立\n"
head=CreateList();
flag1=1;
break;
}
case2:
if(flag1!
=1)
{
printf("
请先建立表!
getchar();
}
else
{
\n2.通讯者信息的插入\n"
\n编号性别\n"
--------------------------------------\n"
p=(ListNode*)malloc(sizeof(ListNode));
/*申请新结点*/
输入编号:
\n"
scanf("
%s"
p->
data.number);
输入:
data.name);
输入性别:
data.sex);
data.telephone);
AddNode(head,p);
排序:
OrderList(l);
//调用通讯录排序函数此处放在插入模块下面
}
case3:
=1)
getchar();
system("
cls"
else
\n3.通讯录信息的查询\n"
p=ListFind(head);
if(p!
=NULL)
{
printf("
编号姓名性别联系\n"
--------------------------------------------------\n"
编号:
%s\n:
%s\n性别:
%s\n联系:
%s\n"
p->
data.number,p->
data.name,p->
data.sex,p->
---------------------------------------------------\n"
}
elseprintf("
没有查到要查询的通讯者!
case4:
{
=1)
getchar();
\n4.通讯录信息的删除\n"
DeleteNode(head);
/*删除结点*/
case5:
if(flag1!
\n5.通讯录信息的修改\n"
AlterNode(head);
case6:
\n6.通讯录链表的输出\n"
PrintList(head);
case7:
\n7.通讯录中男生女生的人数\n"
Seachbysex(head);
case0:
是否退出(y/n)?
k=getchar();
if(k=='
y'
||k=='
Y'
)
j=0;
\n\n\t\t\t使用!
使用!
\n按任意键退出"
default:
\n输入有错,请重新输入!
\n按任意键继续..."
}
}
}
2.通讯录信息系统的具体操作:
(1)添加:
可以添加通讯录记录,依次输入编号、、性别、后,会提示是否继续添加。
LinkListCreateList()//尾插法建立带头结点的通讯录链表算法
{
LinkListhead=(ListNode*)malloc(sizeof(ListNode));
//申请头结点
ListNode*p,*rear;
charflag='
;
//结束标志置y
rear=head;
//尾指针初始指向头结点
while(flag=='
p=(ListNode*)malloc(sizeof(ListNode));
//申新结点
编号性别\n"
-----------------------------------------------\n"
输入的编号:
输入的:
rear->
next=p;
//新结点连接到尾结点之后
rear=p;
//尾指针指向新结点
继续建表?
(y/n):
flag);
rear->
next=NULL;
//终端结点指针置空
returnhead;
//返回链表头指针
}
图3.2添加通讯录记录流程
(2)增加通讯录人员函数
voidAddNode(LinkListhead,ListNode*p)//在通讯录链表head中插入结点
ListNode*p1,*p2;
p1=head;
p2=p1->
next;
while(p2!
=NULL&
&
strcmp(p2->
data.number)<
0)
{
p1=p2;
//p1指向刚访问过的结点
p2=p2->
//p2指向表的下一个结点
p1->
//插入p所指向的结点
p->
next=p2;
//连接表中剩余的结点
图3.3增加通讯录记录流程图
(3)删除通讯录信息函数:
输入欲删除的那个人的编号或名字后,会自动删除他(她)的记录容。
voidDeleteNode(LinkListhead)//通讯录链表上的结点删除
chars;
ListNode*p,*q;
p=ListFind(head);
//调用查找函数
if(p==NULL)
没有查到要删除的通讯者!
return;
}
%s%s%s%s\n"
data.number,p->
真的要删除该结点吗?
(y/n):
"
scanf("
s);
if(s=='
)
{q=head;
while(p!
q->
next!
=p)
q=q->
q->
next=p->
//删除结点
free(p);
//释放被删除的结点空间
通讯者已被删除!
通讯者没有被删除!
图3.4删除通讯录记录流程图
(4)查询通讯录的函数:
用、编号两种方式查询。
ListNode*ListFind(LinkListhead)//有序通讯录链表的查找
ListNode*p;
charnumber[10];
charname[20];
chart;
----------------\n"
1.按编号\n"
2.按\n"
请选择1/2:
p=head->
//假定通讯录表带有结点
t);
if(t==1)
请输入所求的编号:
number);
while(p&
strcmp(p->
data.number,number)<
0)//优化的地方
p=p->
if(p==NULL||strcmp(p->
data.number,number)>
p=NULL;
//没有查到要查找的通讯者
else
if(t==2)
请输入要求的:
name);
while(p&
strcmp(p->
data.name,name)!
=0)
returnp;
图3.6查询通讯录信息流程图
(5)修改通讯录的函数:
输入欲修改的那个人的名字后,再依次输入编号、、性别、。
voidAlterNode(LinkListhead)//通讯录链表上的结点修改
charch;
ListNode*p,*q1;
if(p==NULL)
没有查到要修改的通讯者!
elseif(p!
=NULL)
真的要修改该结点吗?
(y/n)"
ch);
if(ch=='
||ch=='
q1=head;
printf("
\n输出新编号:
scanf("
输出新:
\n"
输出新性别:
修改成功!
n'
N'
无需修改\n"
图3.7修改通讯录信息
(6)统计性别信息的函数:
可以统计男性人数和女性人数。
voidSeachbysex(LinkListhead)
p=head;
intmen=0,women=0;
if(strcmp(p->
data.sex,"
男"
)==0)
men++;
女"
women++;
p=p->
women=%d\nmen=%d\n"
women,men);
图3.8统计性别信息流程图
3.菜单选择
intk,j=1;
注:
具体源代码见附录
3.4调试分析
在写统计男女生人数的函数时,一开始只能显示出女生的人数,而且我也没有用到strcmp,所以一直遍历整个链表不成功,后来请教了同学了之后才写出统计的函数。
原来开始没有把整个链表传入该函数中。
3.5测试结果
1.主菜单:
2.建立通讯录:
3.显示通讯录信息:
4.删除某个通讯录信息
5.查询通讯录记录:
6.修改通讯录信息
7.通讯录性别统计:
9.退出系统
3.6参考文献
①徐凤生.《数据结构(C语言版)》.机械工业,2009年9月.
②谭浩强.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通讯录 管理 系统 数据结构 语言版 实现 实验 报告