数据结构课程设计通讯录管理系统.docx
《数据结构课程设计通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计通讯录管理系统.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构课程设计通讯录管理系统
攀枝花学院
学生课程设计〔论文〕
题目:
通讯录管理系统
学生姓名:
学号:
所在院(系):
数学与计算机学院
专业:
信息与计算科学
班级:
2013级
指导教师:
职称:
年月日
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
题 目
通讯录管理系统
1、课程设计的目的
1)使学生进一步理解和掌握课堂上所学各种根本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
2)使学生掌握软件设计的根本内容和设计方法,并培养学生进行标准化软件设计的能力。
3〕使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的根本能力。
2、课程设计的内容和要求〔包括原始数据、技术要求、工作要求等〕
[问题描述]:
实现通讯录的建立和输出、通讯者的插入、删除和查询等几种操作功能。
[根本要求]:
用单链表作存储结构;用菜单作为应用程序的主要界面,主界面的主控菜单请按下形式给出:
*********************************************************************
*通讯录管理系统*
*1.通讯录链表的建立*
*2.通讯者结点的插入*
*3.通讯者结点的查询*
*4.通讯者结点的删除*
*5.通讯录链表的输出*
*0.退出通讯录管理系统*
*********************************************************************
请选择0—5:
使用数字0~5来选择菜单项,其他输入那么不起作用,并给出错误提示。
3、主要参考文献
[1]刘大有等,?
数据结构?
〔C语言版〕,高等教育出版社
[2]严蔚敏等,?
数据结构?
〔C语言版〕,清华大学出版社
[3]WilliamFord,WilliamTopp,?
DataStructurewithC++?
清华大学出版社
[4]苏仕华等,数据结构课程设计,机械工业出版社
4、课程设计工作进度方案
1)分析题目,查阅相关资料:
1天;
2)算法设计、数据结构设计:
1天
3)编写代码并调试:
1天
4)完成课程设计报告:
2天
指导教师〔签字〕
日期
年月日
教研室意见:
年月日
学生〔签字〕:
接受任务时间:
年月日
课程设计〔论文〕指导教师成绩评定表
题目名称
评分工程
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计〔实验〕能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力〔综合分析能力、技术经济分析能力〕
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图〔或图纸〕质量、篇幅、设计〔论文〕标准化程度
5
符合本专业相关标准或规定要求;标准化符合本文件第五条要求。
10
设计说明书〔论文〕质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名:
年 月 日
摘要
随着社会的开展,人们生活的步调日益加快,越来越多的人参加了全球化的世界。
人们不再拘泥于自己的一块小天地,随时随地能沟通是生活中非常重要的一件事,于是通讯录成为每个人必不可少的工具。
所以编写?
通讯录管理系统?
,旨在帮助人们更方便联系自己的朋友。
此“通讯录管理系统〞具有通讯录链表的建立、通讯者结点的插入、通讯者结点的查询、通讯者结点的删除、通讯录链表的输出、退出通讯录管理系统等功能。
使用数据结构编写,运用大量的函数实现通讯录的功能。
让使用者进行简单的操作即可以实现通讯录管理系统的根本功能,丰富并方便了人们的生活。
关键词数据结构,通讯录管理系统,函数
1需求分析
1.1需求概述
通讯录管理系统是一个比拟实用的小型管理系统。
随着生活节奏的加快,人们追求丰富便捷的电子产品体验,因此也提高对便捷方式的喜爱。
当今社会下人们的交际范围越来越广泛,通讯录系统的出现,方便了人们存储通讯录,便于人们日常的交际。
为方便广阔人们对通讯管理系统的使用,本设计采用作文应用程序的主界面,用控制语句来改变程序各项功能的实现。
主菜单局部主要解决的问题是程序开始选择问题,以及循环选择问题,其余各局部根据其实现功能完成代码设计。
需求环境
本课程设计需要的设备为硬件要求和软件配置要求具体要求如下:
①硬件要求:
一台计算机。
②软件配置:
WINDOWS、C/V。
1.3功能描述
本课程设计是利用图形学的相关知识在TC或VisualC++环境下用C实现一个通讯录管理系统。
具有实现通讯录的建立和输出、通讯者的插入、删除和查询等几种操作功能。
其具体功能要求如下:
a)通讯录链表的建立
b)通讯者结点的插入
c)通讯者结点的查询
d)通讯者结点的删除
e)通讯录链表的输出
f)退出通讯录管理系统
2概要设计
2.1程序功能模块
由需求分析知,本次课程设计分为以下几个模块:
通讯录链表的建立
通讯者结点的插入
通讯者结点的查询
通讯录管理系统
通讯者结点的删除
通讯录链表的输出
退出通讯录管理系统
2.2程序流程图
程序流程图
2.3数据结构的设计
由于主函数设计的是菜单项选择择项,所以在程序未退出的的情况下要实现循环运行,并且要考虑到未建立通讯录链表的情况下其他功能无法实现的情况。
故在实现循环运行的功能时定义一个变量j=1,在选择退出后再将j赋值为0,要考虑判定是否建表的情况定义了一个全局变量flag1=0,建链表后flag1赋值为1。
为了到达选择各功能,采用switch判定选择项并跳转入相应功能函数。
判定是否建表语句:
if(flag1!
=1)
{printf("请先建立表!
");
getchar();
system("cls");}
3详细设计
3.1程序初始化
代码功能
为了到达程序各项功能的实现,以及满足菜单项选择择项的功能,对每个功能的实现分别用了不同函数,并且有用到函数的嵌套以减少代码的重复。
功能实现代码
①要建立链表,首先要生成结点,因此,尾插法建立链表算法描述如下:
〔1〕使链表的头尾指针head、rear指向新生成的头结点〔也就是尾结点〕;
〔2〕置结束标志为0〔假〕;
〔3〕while(结束标志不为真)
{
P指向新生成的结点;
读入一个通讯者数据至新结点的数据域;
将新结点链到尾结点之后;
使尾指针指向新结点;
提示是否继续建表,读入一个结束的标志;
}
〔4〕尾结点的指针域置空置NULL。
具体算法实现如下:
/*******尾插法建立带头结点的通讯录链表算法*******/
LinkListCreateList(void)
{
LinkListhead=(ListNode*)malloc(sizeof(ListNode));/*申请头结点*/
ListNode*p,*rear;
charflag='y';//intflag=0;/*结束标志置0*/
rear=head;/*尾指针初始指向头结点*/
while(flag=='y')
{
p=(ListNode*)malloc(sizeof(ListNode));/*申新结点*/
printf("编号(4)姓名(8)性别(11)地址(31)\n");
printf("-----------------------------------------------\n");
printf("\n添加的编号:
\n");
scanf("%s",p->data.num);
printf("\n添加的姓名:
\n");
scanf("%s",p->data.name);
printf("\n性别:
\n");
scanf("%s",p->data.sex);
printf("\n:
\n");
scanf("%s",p->data.phone);
printf("\n地址:
\n");
scanf("%s",p->data.addr);
rear->next=p;/*新结点连接到尾结点之后*/
rear=p;/*尾指针指向新结点*/
printf("继续建表?
(y/n):
");
scanf("%s",&flag);
}
rear->next=NULL;/*终端结点指针置空*/
returnhead;/*返回链表头指针*/
}
链表结点的插入
代码功能
要求将一个通讯者记录的数据结点按其编号的次序插入有序通讯表相应位置,以保持通讯录的有序性。
插入的根本思想是:
使用两个指针变量p1和p2分别指向当前访问过的结点和下一个结点,循环顺序查找链表。
寻找插入结点的位置,其中p1指向待插入位置的前一个结点。
功能实现代码
插入操作是非常简单的。
具体实现算法如下:
〔1〕用p1指向原链表头结点,p2指向链表的第一个结点;
〔2〕while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;/*p1指向刚访问过的结点*/
p2=p2->next;/*p2指向下一个结点*/
}
(3)插入新结点。
具体算法如下:
/*********在通讯录链表head中插入结点************/
voidInsertNode(LinkListhead,ListNode*p)
{
ListNode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;/*p1指向刚访问过的结点*/
p2=p2->next;/*p2指向表的下一个结点*/
}
p1->next=p;/*插入p所指向的结点*/
p->next=p2;/*连接表中剩余的结点*/
}
通讯者结点信息的查找
3.3.1代码功能
通讯录结点查找的根本思想是:
首先输入要查找的通讯者编号或姓名,从表头顺序访问表中结点。
如果查找成功,那么返回一个指向查找道德通讯者信息;假设查找失败,那么返回一个空的指针NULL。
功能实现代码
/**********有序通讯录链表的查找****************/
ListNode*ListFind(LinkListhead)
{
ListNode*p;
charnum[5];
charname[9];
charpp;
printf("==================\n");
printf("a.按编号查询\n");
printf("b.按姓名查询\n");
printf("==================\n");
printf("请选择:
");
p=head->next;
scanf("%s",&pp);
if(pp=='a'||pp=='A')
{
printf("请输入要查找者的编号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)!
=0)p=p->next;
if((p==NULL))p=NULL;/*没有查到要查找的通讯信息*/
}
else
if(pp=='b'||pp=='B')
{
printf("请输入要查找者的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)p=p->next;
}
returnp;
}
通讯者结点信息的删除能
.1代码功能
通讯录结点的删除,先调用查找函数,查询到要删除的结点,删除即可。
.2功能实现代码
/********通讯录链表上的结点删除*****************/
voidDelNode(LinkListhead)
{
charcho;
ListNode*p,*q;
p=ListFind(head);/*调用查找函数*/
if(p==NULL)
{
printf("没有查到要删除的通讯者!
\n");
return;
}
elseif(p!
=NULL)
{
printf("真的要删除该结点吗?
〔y/n〕");
scanf("%s",&cho);
if(cho=='y'||cho=='Y')
{
q=head;
while((q!
=NULL)&&(q->next!
=p))q=q->next;
q->next=p->next;/*删除结点*/
free(p);/*释放被删结点空间*/
printf("删除成功!
\n");
}
}
}
通通讯者结点信息的输出
通讯录链表的输出只要讲表头指针赋给一个指针变量p,然后用p向后扫描,直到表尾,p为空为止。
因此,其输出链表的算法实现如下:
/********通讯录链表的输出函数**********/
voidPrintList(LinkListhead)
{
ListNode*p;
p=head->next;
printf("编号姓名性别联系地址\n");
printf("------------------------------------------\n");
while(p!
=NULL)
{
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.addr);
printf("----------------------------------------------\n");
p=p->next;/*后移一个结点*/
}
}
4测试与运行
由需求分析可知,通讯录对于人们的意义,也不止于仅仅像记事簿一样显示通讯地址,而是也在向着个性化、人性化的方向开展。
随着人们对通讯录的更高要求,我们对通讯录管理系统的具体功能进行了改进和扩展,我所制作的通讯录管理系统也更加完善。
图4.1通讯录管理系统主菜单界面
图通讯录链表的建立功能
图4.3通讯者结点的插入功能
图4.4通讯录结点的查询界面〔按编号查询〕
通讯录结点的查询界面〔按姓名查询〕
界面
图4.7通讯录链表的输出界面
结束语
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术开展的日新日异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。
本课程设计的主要目的是使学生一步理解和掌握课堂上所学各种根本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法;掌握软件设计的根本内容和设计方法,并培养学生进行标准化软件设计的能力;掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的根本能力。
提供一个既动手又动脑,独立实践的时机,将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力,从而进一步提高了实际运用的能力。
在做此课程设计时,初步拿到任务书还不太清楚从何入手,于是在网上参考了些资料,这些资料对我后来完成课程设计有了很大帮助,在后来的设计中也遇到不少问题,在老师同学的帮助下最终完成,也使我深刻体会到“没有做不到的,只有想不到的〞,“团结就是力量〞,“实践是检验真理的标准〞。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学到的理论知识与实践相结合起来,从理论中得出结论,将结论辅助与理论,才能真正学到知识并写出有用的程序来为他人效劳,更为社会效劳,所以提高自己的实际动手能力和独立思考的能力是十分重要的。
同时通过这次设计,也让我体验到了编程的的乐趣。
总之,这次的课程设计是一次珍贵的经验,它不仅锻炼了我动手的能力,也锻炼了我克服困难,持之以恒的精神。
既收获了知识,又磨练了意志。
我想这第一次的课程设计必将成为我人生道路上一段美好的回忆。
参考文献
[1]?
数据结构?
〔C语言版〕,严蔚敏等,清华大学出版社,1997
[2]?
数据结构?
〔C语言版〕,刘大有等,高等教育出版社,2001
[3]?
DataStructurewithC++?
,WilliamFord,WilliamTopp,清华大学出版社,1996
[4]?
数据结构课程设计?
,苏仕华等,机械工业出版社,2005
[5]刘振安,孙忱,刘燕君,?
C程序设计课程设计?
,机械工业出版社
[6]汪诗林,?
数据结构算法与应用?
,机械工业出版社
附录:
程序清单
#include
#include"string.h"
#include"stdlib.h"
intflag1=0;
typedefstruct{/*通讯录结点类型*/
charnum[5];/*编号*/
charname[9];/*姓名*/
charsex[3];/*性别*/
charphone[13];/**/
charaddr[31];/*地址*/
}DataType;
typedefstructnode{/*结点类型定义*/
DataTypedata;/*结点数据域*/
structnode*next;/*结点指针域*/
}ListNode;
typedefListNode*LinkList;
LinkListhead;
ListNode*p;
LinkListCreateList(void);
voidInsertNode(LinkListhead,ListNode*p);
ListNode*ListFind(LinkListhead);
voidDelNode(LinkListhead);
voidPrintList(LinkListhead);
/*******尾插法建立带头结点的通讯录链表算法*******/
LinkListCreateList(void)
{
LinkListhead=(ListNode*)malloc(sizeof(ListNode));/*申请头结点*/
ListNode*p,*rear;
charflag='y';//intflag=0;/*结束标志置0*/
rear=head;/*尾指针初始指向头结点*/
while(flag=='y')
{
p=(ListNode*)malloc(sizeof(ListNode));/*申新结点*/
printf("编号姓名性别地址\n");
printf("-----------------------------------------------\n");
printf("\n添加的编号:
\n");
scanf("%s",p->data.num);
printf("\n添加的姓名:
\n");
scanf("%s",p->data.name);
printf("\n性别:
\n");
scanf("%s",p->data.sex);
printf("\n:
\n");
scanf("%s",p->data.phone);
printf("\n地址:
\n");
scanf("%s",p->data.addr);
rear->next=p;/*新结点连接到尾结点之后*/
rear=p;/*尾指针指向新结点*/
printf("继续建表?
(y/n):
");
scanf("%s",&flag);
}
rear->next=NULL;/*终端结点指针置空*/
returnhead;/*返回链表头指针*/
}
/*********在通讯录链表head中插入结点************/
voidInsertNode(LinkListhead,ListNode*p)
{
ListNode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;/*p1指向刚访问过的结点*/
p2=p2->next;/*p2指向表的下一个结点*/
}
p1->next=p;/*插入p所指向的结点*/
p->next=p2;/*连接表中剩余的结点*/
}
/**********有序通讯录链表的查找****************/
ListNode*ListFind(LinkListhead)
{
ListNode*p;
charnum[5];
charname[9];
charpp;
printf("==================\n");
printf("a.按编号查询\n");
printf("b.按姓名查询\n");
printf("==================\n");
printf("请选择:
");
p=head->nex