通讯录管理系统数据结构C语言版链表实现实验报告.docx

上传人:b****3 文档编号:5439407 上传时间:2022-12-16 格式:DOCX 页数:35 大小:324.62KB
下载 相关 举报
通讯录管理系统数据结构C语言版链表实现实验报告.docx_第1页
第1页 / 共35页
通讯录管理系统数据结构C语言版链表实现实验报告.docx_第2页
第2页 / 共35页
通讯录管理系统数据结构C语言版链表实现实验报告.docx_第3页
第3页 / 共35页
通讯录管理系统数据结构C语言版链表实现实验报告.docx_第4页
第4页 / 共35页
通讯录管理系统数据结构C语言版链表实现实验报告.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

通讯录管理系统数据结构C语言版链表实现实验报告.docx

《通讯录管理系统数据结构C语言版链表实现实验报告.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统数据结构C语言版链表实现实验报告.docx(35页珍藏版)》请在冰豆网上搜索。

通讯录管理系统数据结构C语言版链表实现实验报告.docx

通讯录管理系统数据结构C语言版链表实现实验报告

GuangxiUniversityofScienceandTechnology

课程设计报告

课程名称:

数据结构与编程综合实训

课题名称:

通讯录管理系统的设计与实现

**********************

学号:

************

院系:

计算机科学与通信工程学院

专业班级:

通信141班

**********************

完成日期:

2015-12-18

 

第一部分课程设计报告…………………………………………………………3

第1章课程设计目的……………………………………………………3

第2章课程设计内容和要求……………………………………………3

2.1问题描述………………………………………………………3

2.2设计要求…………………………………………………………4

第3章课程设计总体方案及分析………………………………………5

3.1问题分析………………………………………………………4

3.2概要设计…………………………………………………………5

3.3详细设计…………………………………………………………6

3.4调试分析………………………………………………………18

3.5测试结果………………………………………………………18

3.6参考文献………………………………………………………22

第二部分课程设计总结………………………………………………………23

附录(源代码)…………………………………………………………………24

 

第一部分课程设计报告

第1章课程设计目的

课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。

课程设计就是让所有同学对课程更全面的应用。

本次实验项目“通讯录管理”就是针对数据结构的一门应用较为广泛的系统管理方法。

1.实现意义

本次实验应用性能很好,结构清楚,能随时添加、删除、查找、修改、输出联系人;并且可以用姓名、编号两种方式;而且其中增加了排序功能,使得插入之后排序为接下来的操作提供便利,操作更精确,以人性化的方式展现出来,效果十分突出。

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");

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();

switch(k)

{

case1:

{

printf("\n1.通讯录的建立\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->data.number);

printf("输入姓名:

\n");

scanf("%s",p->data.name);

printf("输入性别:

\n");

scanf("%s",p->data.sex);

printf("输入电话:

\n");

scanf("%s",p->data.telephone);

AddNode(head,p);

printf("排序:

\n");

OrderList(l);//调用通讯录排序函数此处放在插入模块下面

}

break;

}

case3:

{

if(flag1!

=1)

{

printf("请先建立表!

");

getchar();

system("cls");

}

else

{

printf("\n3.通讯录信息的查询\n");

p=ListFind(head);

if(p!

=NULL)

{

printf("编号姓名性别联系电话\n");

printf("--------------------------------------------------\n");

printf("编号:

%s\n姓名:

%s\n性别:

%s\n联系电话:

%s\n",

p->data.number,p->data.name,p->data.sex,p->data.telephone);

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()//尾插法建立带头结点的通讯录链表算法

{

LinkListhead=(ListNode*)malloc(sizeof(ListNode));//申请头结点

ListNode*p,*rear;

charflag='y';//结束标志置y

rear=head;//尾指针初始指向头结点

while(flag=='y')

{

p=(ListNode*)malloc(sizeof(ListNode));//申新结点

printf("编号姓名性别电话\n");

printf("-----------------------------------------------\n");

printf("输入的编号:

\n");

scanf("%s",p->data.number);

printf("输入的姓名:

\n");

scanf("%s",p->data.name);

printf("输入性别:

\n");

scanf("%s",p->data.sex);

printf("输入电话:

\n");

scanf("%s",p->data.telephone);

rear->next=p;//新结点连接到尾结点之后

rear=p;//尾指针指向新结点

printf("继续建表?

(y/n):

");

scanf("%s",&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,p->data.number)<0)

{

p1=p2;//p1指向刚访问过的结点

p2=p2->next;//p2指向表的下一个结点

}

p1->next=p;//插入p所指向的结点

p->next=p2;//连接表中剩余的结点

}

图3.3增加通讯录记录流程图

(3)删除通讯录信息函数:

输入欲删除的那个人的编号或名字后,会自动删除他(她)的记录内容。

voidDeleteNode(LinkListhead)//通讯录链表上的结点删除

{

chars;

ListNode*p,*q;

p=ListFind(head);//调用查找函数

if(p==NULL)

{

printf("没有查到要删除的通讯者!

\n");

return;

}

printf("%s%s%s%s\n",p->data.number,p->data.name,p->data.sex,p->data.telephone);

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");

}

图3.4删除通讯录记录流程图

(4)查询通讯录的函数:

用姓名、编号两种方式查询。

ListNode*ListFind(LinkListhead)//有序通讯录链表的查找

{

ListNode*p;

charnumber[10];

charname[20];

chart;

printf("----------------\n");

printf("1.按编号\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->data.number,number)<0)//优化的地方

p=p->next;

if(p==NULL||strcmp(p->data.number,number)>0)

p=NULL;//没有查到要查找的通讯者

}

else

if(t==2)

{

printf("请输入要求的姓名:

");

scanf("%s",name);

while(p&&strcmp(p->data.name,name)!

=0)

p=p->next;

}

returnp;

}

图3.6查询通讯录信息流程图

(5)修改通讯录的函数:

输入欲修改的那个人的名字后,再依次输入编号、姓名、性别、电话号码。

voidAlterNode(LinkListhead)//通讯录链表上的结点修改

{

charch;

ListNode*p,*q1;

p=ListFind(head);

if(p==NULL)

{

printf("没有查到要修改的通讯者!

\n");

return;

}

elseif(p!

=NULL)

{

printf("真的要修改该结点吗?

(y/n)");

scanf("%s",&ch);

if(ch=='y'||ch=='Y')

{

q1=head;

printf("\n输出新编号:

");

scanf("%s",p->data.number);

printf("输出新姓名:

\n");

scanf("%s",p->data.name);

printf("输出新性别:

\n");

scanf("%s",p->data.sex);

printf("输出新电话:

\n");

scanf("%s",p->data.telephone);

printf("修改成功!

\n");

}

if(ch=='n'||ch=='N')

printf("无需修改\n");

}

}

图3.7修改通讯录信息

(6)统计性别信息的函数:

可以统计男性人数和女性人数。

voidSeachbysex(LinkListhead)

{

ListNode*p;

p=head;

intmen=0,women=0;

while(p!

=NULL)

{

if(strcmp(p->data.sex,"男")==0)

men++;

if(strcmp(p->data.sex,"女")==0)

women++;

p=p->next;

}

printf("women=%d\nmen=%d\n",women,men);

}

图3.8统计性别信息流程图

3.菜单选择

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();注:

具体源代码见附录

3.4调试分析

在写统计男女生人数的函数时,一开始只能显示出女生的人数,而且我也没有用到strcmp,所以一直遍历整个链表不成功,后来请教了同学了之后才写出统计的函数。

原来开始没有把整个链表传入该函数中。

3.5测试结果

1.主菜单:

 

2.建立通讯录:

3.显示通讯录信息:

4.删除某个通讯录信息

5.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1