当前位置:文档之家› 通讯录管理系统的设计与实现

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

课程设计报告课程设计名称:数据结构课程设计系:三系学生姓名:班级:学号:成绩:指导教师:开课时间:2011-2012学年一学期课程设计任务书课程名称:数据结构指导教师:专业班级:学生姓名:起止日期: 2012.12-2013.1 设计题目一:通讯录管理系统的设计与实现1 概述1.1现状分析课程设计是实践教学中的重要环节,它以某一门课程为基础,涉及和课程相关的各方面知识,是一门独立于课程外的特殊课程。

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

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

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

2 系统分析编程完成通讯录的一般性管理工作如通讯录中记录的增加、修改、查找、删除、输出等功能。

每个记录包含编号、姓名、性别、电话号码、住址个人基本信息。

用《数据结构》中的链表做数据结构结合c语言基本知识编写一个通讯录管理系统。

本程序相对简单,使用方便,几乎不用特殊的命令,只需按提示输入即可。

对于建立通讯录管理系统,则需了解并掌握数据结构与算法的设计方法,尤其在算法方面,链表及结点的联系,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

3 概要设计3.1算法的设计本实验从整体上分为七大模块:(1)通讯录链表的建立;(2)通讯者结点的插入;(3)通讯者结点的查询;(4)通讯者结点的删除;(5)通讯者结点的修改;(6)通讯录链表的输出;(7)退出通讯录管理通讯者结点的删除系统。

3.2 通讯录系统图系统功能模块图如图所示:4 详细设计4.1 主菜单模块设计编写一个主控菜单驱动程序,输入0—6以进入相应选择项。

1. 实现循环和功能选择假设输入选择用变量k ,它作为0-6之间的一个输入变量,由getchar 读入,提供给switch 语句。

使用while 语句循环实现重复选择,并在主函数void main( )中实现。

2.得到k 的合理值设计一个函数用来输出提示信息和处理信息输入,这个函数应该返回一个数值k ,以便供给switch 语句使用。

对于k 输入值,在switch 中case 语句对应数字0—6,在swith 语句中再调用相应的函数,使得程序得以执行,对于不符合要求的输入,提示输入错误并要求重新输入。

主菜单 创建通讯录 插入通讯录查找通讯录删除通讯录输出通讯录退出通讯录修改通讯录系统功能模块图4.2 通讯录建立模块设计1.系统用到的数据有:char number[5]; //编号char name[20]; //姓名char sex[10]; //性别char telephone[20]; //电话char address[20]; //地址函数:LinkList CreateList(void); //实现通讯录链表的建立功能void InsertNode(LinkList head,ListNode *p); //实现通讯录结点的插入void PaixuNode(linklist *&l); //信息按编号排序ListNode *ListFind(LinkList head); //实现通讯录结点的查找void DeleteNode(LinkList head); //实现通讯录结点的删除void ModifyNode(LinkList head); //实现通讯录结点的修改void PrintList(LinkList head); //实现通讯录结点的输出*/2.我们知道的建立链表有两种方法,一种为头插入法,一种为尾插入法。

头插入法是每次将新插入的结点插在链表的表头,而尾插入法是将新插入的结点插入在链表的尾部。

我们这里用尾插入法描述算法。

(1) 使链表的头尾指针head、rear指向新生成的头结点(也是尾结点);(2) 置结束标志为0(假);(3)while(结束标志不为真){P指向新生结点;读入一个通讯者数据至新结点的数据域;将新结点链接到尾结点之后;使为指针指向新结点;提示:是否结束建表,读入一个结束标志;}(4) 尾结点指针域置空值NULL。

具体算法如下:/-------------------------------------------------------//* 用尾插入法建立通讯录链表函数*//------------------------------------------------------/LinkList CreateList(void){//尾插入法建立带头结点的通讯录链表算法LinkList head=(ListNode *)malloc(sizeof(ListNode));//申请头结点ListNode *p,*rear;int flag=0; //结束指标置0rear=head; //尾指针初始化指向头结点while(flag==0){ p=(ListNode *)malloc(sizeof(ListNode));//申请新结点printf("编号(1) 姓名(2) 性别电话(4) 地址(5)\n");printf("-----------------------------------------------------------\n");scanf("%s%s%s%s%s",p->data.num,p->,p->data.sex,p->data.phone,p->data.addr);rear->next=p; //新结点连接到尾结点之后rear=p; //尾指针指向新结点printf("结束建表吗?(1/0):");scanf("%d",&flag); //读入一个标志数据}rear->next=NULL; //终端结点指针域置空return head; //返回链表头指针}4.3 通讯录插入模块设计插入结点的基本思想是:使用两个指针变量p1和p2分别指向当前访问过的结点和下一个待访问的结点,循环顺序查找链表,寻找插入结点的位置,其中p1指向待插入结点的前一个结点。

(1)用p1指向原链表头结点,p2指向链表的第一个结点;(2)while(p2=NULL && p2->data.num<p->data.num){p1=p2; //p1指向刚访问过的结点;p2=p2->next; //p2指向表的下一个结点(3)插入新结点。

具体算法如下:/-------------------------------------------------------//*在通讯录链表head中插入结点*//-------------------------------------------------------/void InsertNode(LinkList head,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; //连接表中剩余部分}4.4 通讯录查询模块设计查询的基本思想是:首先输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点。

如查找成功,则返回一个指向查找到的通讯者信息的结点;若查找失败,则返回一个空的指针值NULL。

当按编号好查找时,如需要查找的通讯者编号不在表中,则不一定需要循环才比较到表尾,因为表是按编号递增有序的;而当按姓名查找时,这要循环比较到表尾,才能确定查不到的情况。

具体算法如下:/-------------------------------------------------------//* 有序通讯录链表上的查找*//-------------------------------------------------------/ListNode * ListFind(LinkList head){//有序通讯录链表上的查找ListNode *p;char num[5];char name[9];int xz;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",num);while(p && strcmp(p->data.num,num)<0)p=p->next;if(p==NULL || strcmp(p->data.num,num)>0)p=NULL; //没有查到要查找的通讯者}elseif(t==2) {printf("请输入要查找者的姓名: ");scanf("%s",name);while(p && strcmp(p->,name)!=0)p=p->next;}return p;}4.5 通讯录删除模块设计删除的基本思想是:先调用查找函数,查询到要删除的结点,删除结点即可。

算法如下:/*****************************//* 通讯录链表上的结点的删除*//*****************************/void DelNode(LinkList head){char s;ListNode *p,*q;p=ListFind(head);//调用查找函数if(p==NULL){printf("没有查到要删除的通讯者!\n");return;}printf("%s%s%s%s%s\n",p->data.number ,p->,p->data.sex,p->data.telephone, p->data.address);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");}4.6通讯录修改模块设计修改的基本思想是:先调用查找函数,查询到要修改的结点,修改从新输入结点即可。

相关主题