当前位置:文档之家› 通讯录系统

通讯录系统

《数据结构》课程设计报告通讯录系统姓名:专业:班级:学号:指导老师:设计时间: 2010年5月8日目录目录 ................................................................................. 错误!未定义书签。

1.设计内容 ............................................................................ 错误!未定义书签。

1.1问题描述.................................................................. 错误!未定义书签。

1.2问题分析.................................................................. 错误!未定义书签。

1.3需求分析:.............................................................. 错误!未定义书签。

2.概要设计 ............................................................................ 错误!未定义书签。

2.1结构体定义.............................................................. 错误!未定义书签。

2.2确定所需模块.......................................................... 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

................................................................................ 错误!未定义书签。

3.算法分析 ............................................................................ 错误!未定义书签。

4.测试结果 ............................................................................ 错误!未定义书签。

5.程序源代码 ........................................................................ 错误!未定义书签。

6.实验心得 ............................................................................ 错误!未定义书签。

7.参考资料 ............................................................................ 错误!未定义书签。

1.1问题描述要求:设计一个含有多个菜单项的主控菜单程序,以实现以下功能:通讯录的建立;记录插入;记录查询;记录删除;通讯录的输入在以上功能的基础上,可以发挥。

1.2问题分析通讯录是为了在工作和生活中,能够直接在通讯中查找需要的通讯者、删除没有联系的通讯信息、添加需要使用的通讯信息和查看通讯录目录等。

为了能把通讯者信息储存在计算机中并能够在计算机数据中进行查找、插入、删除等操作,建立通讯录管理系统。

我采用链表的存储形式设计此系统,并使用主控菜单进行相关的功能编辑。

使用动态查找对通讯录信息进行对应的查找、删除等操作,使用开关语句来控制菜单界面的功能选择。

1.3需求分析本演示程序用TC兼VC++编写,完成通讯录链表的生成,插入、删除,以及确定某一元素在单链表中的位置。

①输入的形式和输入值的范围:插入结点时需要输入插入的位置和结点的值;删除结点时输入删除结点的位置;查找操作时需要输入结点关键字的值。

②输出的形式:在所有操作中,都回有相应的提示语句。

为了谨慎操作,在做相应操作都回有确定提示。

③程序所能达到的功能:完成通讯录链表的生成(通过插入操作)、插入、删除、查找操作2.1结构体定义为了实现上述程序功能,需要定义通讯录链表的数据类型:typedef struct{char num[5];char name[9];char sex[3];char phone[11];char addr[31];}DateType;2.2确定所需模块此模块显示功能菜单界面供用户选择操作。

此算法建立一个带头结点的单链表,在这里使用尾插法建立单链表的算法设计思想及具体的算法实现。

要建立单链表,首先要生成头结点,因此使用链表的头尾结点指针head,rear指向新生成的头结点,时间复杂度为O(n)。

链表结点的插入,是要求按照通讯者的编号来插入到有序链表的相应的位置,保持链表的有序性。

因此,用p1指向原链表的头结点,p2指向链表的第一个结点。

链表的输出函数,只要将头指针的值赋给一个指针变量P,然后再控制指针P向后搜索,并输出结果。

直到表尾,使得P值为空。

删除结点首先要调用查找函数ListFind()进行结点对比,找到要删除的结点,再进行删除操作,同时释放该结点占用的空间。

链表的查找,它可以按通讯者的编号或者是姓名进行查找。

当按编号进行查找时如果查找的信息不存在,可以直接执行break语句。

当按姓名查找时,要循环对比到表尾。

首先进入主菜单界面。

选择要进行的操作。

1调用模块二,生成一个链表;2调用模块三,按照通讯者的编号来插入到有序链表的相应的位置;3调用模块五,找到要删除的结点,再进行删除操作,同时释放该结点占用的空间;4调用模块六,按通讯者的编号或者是姓名进行查找;5调用模块四,将头指针的值赋给一个指针变量P,然后再控制指针P向后搜索,并输出结果。

3.算法分析实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。

对主程序和其他模块也都需要写出伪码算法。

1) 结点类型和指针类型typedef struct node {DataType data;struct node *next;}ListNode;2) 通讯录链表的基本操作为了方便,在链表中设头结点,其data域没有意义。

LinkList CreateList(void){LinkList head=(ListNode *)malloc(sizeof(ListNode));ListNode *p,*rear;int flag=0;rear=head;while(flag==0){p=(ListNode *)malloc(sizeof(ListNode));printf("编号(4) 姓名(8) 性别电话(11) 地址(31)\n");printf("-------------------------------------\n");cin>>p->date.num, p->, p->date.sex,p->date.phone, p->date.addr;rear->next=p;rear=p;printf("结束建表吗?(1/0):");scanf("%d",&flag);}rear->next=NULL;return head;}这里是要建立一个带头结点的单链表,在这里使用尾插法建立单链表的算法设计思想及具体的算法实现。

要建立单链表,首先要生成头结点,因此使用链表的头尾结点指针head,rear指向新生成的头结点。

结束标志设置为0;While(结束标志不为真){p指向新生成的结点;读入一个通讯者数据至新的结点的数据域;将新的结点连接到尾结点之后,同时尾结点指针指向新结点。

}尾结点指针制空值NULLvoid InsertNode(LinkList head,ListNode *p){ListNode *p1,*p2;p1=head;p2=p1->next;while(p2!=NULL&&strcmp(p2->date.num,p->date.num)<0){p1=p2;p2=p2->next; }p1->next=p;p->next=p2;}链表结点的插入,是要求按照通讯者的编号来插入到有序链表的相应的位置,保持链表的有序性。

因此,用p1指向原链表的头结点,p2指向链表的第一个结点;whie(p2!=NULL&&P2->data.num<p->data.num){p1=p2;P2=p2->next;}再插入新的结点。

int menu_select(){int sn;printf(" 通讯录管理系统\n");printf("=======================================================\n");printf(" * 1.通讯录链表的建立*\n");printf(" * #################### *\n");printf(" * 2.通讯录结点的插入*\n");printf(" * #################### *\n");printf(" * 3.通讯者结点的删除*\n");printf(" * #################### *\n");printf(" * 4.通讯者结点的查询*\n");printf(" * #################### *\n");printf(" * 5.通讯者结点的输出*\n");printf(" * #################### *\n");printf(" * 0. 退出管理系统*\n");printf("======================================================== \n");printf(" 请选择0-5: ");for( ; ; ){scanf("%d",&sn);if(sn<0 || sn>5 )cout<<"\n\t输入错误,从选0-5: ";elsebreak;}return sn;}这个算法主要是要显示一个功能菜单界面,同时定义了一个局部变量sn,用来返回一个值,以便switch语句使用。

相关主题