海南大学信息科学技术学院数据结构课程设计数据结构课程设计设计题目:电话簿管理系统组员:_________________________专业班级:11电子信息工程2班马晨20111601310056潘耀明201116013100582013年12月30号海南大学信息科学技术学院数据结构课程设计摘要随着科技的进步和信息产业的飞速发展,电话簿成为了现代生活中的一个重要的工具。本电话簿管理系统利用计算机对通讯录进行统一管理,包括添加、显示、查找、删除、帮助等功能,实现通讯录管理的系统化、规范化和自动化,为人们的工作和生活提供便利。在本章,我们将重点介绍如何利用结构数组实现此电话簿管理系统。海南大学信息科学技术学院数据结构课程设计1.1设计目的本程序旨在训练自己的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的DAT文件盒结构数组的各种基本操作。本程序中涉及结构体,数组,文件等方面的知识。通过训练,可以让我们对文件操作有一个更深刻的了解,掌握利用数组存储结构实现电话簿管理的原理,为进一步开发出高质量的信息管理系统打下坚实的基础。1.2功能描述如图1.1所示,电话簿管理系统和工资管理系统类似,主要利用链表来实现,其链表结点元素是结构体类型,整个系统由如下几大功能模块组成。1.输入记录模块。输入记录主要完成将数据存入链表中的工作。再次电话簿管理系统中,记录可以从键盘输入逐个,并存在以文本形式存储的数据文件中。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的链表元素中。2.显示记录模块。输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将链表中存储的记录信息写入数据文件。第二,它实现将链表中存储的记录信息在屏幕上打印出来。3.查询记录模块。查询记录模块主要完成在链表中查找满足相关条件的记录。在此电话簿管理系统中,用户可以按照联系人姓名在链表中进行查找。若找到该记录,则打印出来;否则,返回一个-1值,并打印出未找到该记录的提示信息。4.删除记录模块。删除记录模块主要完成在链表中查找满足相关条件的记录。在此电话薄管理系统中,用户可以按照联系人姓名在链表中进行查找。若找到该记录,则删除。否则,返回一个-1值,并打印出未找到该记录的提示信息。5.请求帮助模块。请求帮助模块主要用于指导用户如何使用电话薄。图1.1电话簿管理系统功能模块图海南大学信息科学技术学院数据结构课程设计1.3总体设计1.3.1功能模块设计主控main()函数执行流程电话簿管理系统执行主流程如图8.2所示。它先以可读写的打开方式打开DAT类型的数据文件,此文件默认为“FRIENDS.DAT”,若该文件不存在,则新建此数据文件。当打开文件操作成功后,从文件中一次读出一条记录,添加到新建的链表中,然后执行显示主菜单和进入主循环操作,进行按键判断。值得一提的是,文本类型文件与二进制类型文件不同,它可以使用Windows自带的DAT打开并查看到存储的文件内容。在判断按键时,有效的输入为1~6之间的任意数值,其他输入都被视为错误按键。若输入为6,则会进行数据存盘操作。然后,系统执行退出电话簿管理系统的操作。若选择1,则调用AddRecord_f(),执行增加记录的操作;若选择2,则调用DisplayList_f(),显示全记录的操作;若选择3,则调用SearchByName_f(),执行查找指令并打印信息到屏幕;若选择4,则调用DeleteRecord_f(),执行删除符合要求的记录;若选择5,则调用Help_f(),执行请求帮助的记录;若选择6,则保存数据。图1.2主控制函数执行流程图海南大学信息科学技术学院数据结构课程设计1.3.2数据结构设计本程序定义了结构体node,用于存放联系人的基本信息。这里有三个与联系人有关的字段。#defineNodestructnodeNode//结构体类型定义,包括:姓名、电话号码和联系地址{charszName[20];charszPhoneNum[12];charszAddress[30];Node*next;};其各字段的值含义如下:szName[20]:保存联系人姓名。szPhoneNum[12]:保存联系人电话号码。szAddress[20]:保存联系人地址。1.3.3函数功能描述表1.1voidHandleChoice_f(int)函数用于响应键值,并进行相应操作voidAddRecord_f()用于添加新记录voidInsertNode_f(Node*)用于把新的结点加到链表的后面Node*InsertPoint_f(char*)根据新增记录的姓氏,返回其将插入的正确位置voidMakeNewHead_f(Node*)新结点成为链表的头结点voidAddToEnd_f(Node*)新结点成为链表的尾结点voidMoveToEnd_f()当前指针移到链表尾voidDisplayList_f()显示所有记录voidDeleteRecord_f()删除相应的记录voidDelHead_f()删除头结点voidDelEnd_f(Node*)删除尾结点voidDelMid_f(Node*)删除链表中的结点intVerifyDel_f()删除信息时要求予以确认voidDelNode_f(Node*)删除结点voidDelList_f()删除链表SearchByName_f()通过名字查找并打印内容WriteFile_f()写文件,并保存voidLoadFile_f()载入文件,并读取voidHelp_f()帮助模块Intmain()主函数部分海南大学信息科学技术学院数据结构课程设计1.4程序实现详细请见附录1.4.1源码分析1.程序预处理包括加载头文件,定义结构体、常量和变量,并对他们进行初始化工作。#includeconio.h#includestdio.h#includestring.h#includestdlib.h#includetime.h#defineNodestructnodeNode//结构体类型定义,包括:姓名、电话号码和联系地址{charszName[20];charszPhoneNum[12];charszAddress[30];Node*next;};Node*strpHead;//全局变量,链表头指针Node*strpCurrent;//用于指向当前正在操作的结点//函数原型声明voidHandleChoice_f(int);voidAddRecord_f();voidInsertNode_f(Node*);Node*InsertPoint_f(char*);voidMakeNewHead_f(Node*);voidAddToEnd_f(Node*);voidMoveToEnd_f();voidDisplayList_f();voidDeleteRecord_f();voidDelHead_f();voidDelEnd_f(Node*);voidDelMid_f(Node*);intVerifyDel_f();voidDelNode_f(Node*);voidDelList_f();voidSearchByName_f();voidWriteFile_f();voidLoadFile_f();voidHelp_f();2.主函数main()main()函数主要实现对整个程序的运行控制,以及相关功能模块的调用。详细分析可以参考图8.2。intmain(){intnChoice;system(color1b);printf(欢迎来到电话簿管理系统\n);system(pause);system(cls);strpHead=NULL;海南大学信息科学技术学院数据结构课程设计LoadFile_f();do{printf(☆☆☆☆☆☆☆☆☆菜单☆☆☆☆☆☆☆☆☆☆\n);printf(┌─────────────────────┐\n);printf(│1.增加记录│\n);printf(│2.显示所有记录│\n);printf(│3.按名字查找朋友的信息│\n);printf(│4.删除记录│\n);printf(│★5.请求帮助│\n);printf(│6.退出程序│\n);printf(└─────────────────────┘\n);printf(请选择代码(1,2,3,4,5,6):);scanf(%d,&nChoice);HandleChoice_f(nChoice);/*接受用户的选择*/}while(nChoice!=6);return0;}3.界面响应模块用户进入电话簿管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用voidHandleChoice_f(intnChoice)/*根据用户选择nChoice调用相应的函数*/{switch(nChoice){case1:AddRecord_f();break;case2:DisplayList_f();break;case3:SearchByName_f();break;case4:DeleteRecord_f();break;case5:Help_f();break;case6:WriteFile_f();/*将链表中的数据写回文件*/if(strpHead!=NULL){DelList_f();}break;default:printf(没有您要的选项!\n);break;}}海南大学信息科学技术学院数据结构课程设计4.添加记录模块调用AddRecord_f()函数,完成在链表中添加电话簿记录的功能。在刚进入电话簿管理系统时,默认数据文件为空,从链表头部开始添加记录;否则,将此记录添加在链表尾部。voidAddRecord_f(){Node*strpNew;/*为新记录定义临时指针变量*/strpNew=(Node*)malloc(sizeof(Node));/*开辟空间存放新记录数据*/getchar();printf(姓名:);gets(strpNew-szName);printf(电话号码:);gets(strpNew-szPhoneNum);printf(联系地址:);gets(strpNew-szAddress);InsertNode_f(strpNew);system(cls);}voidInsertNode_f(Node*strpNew){Node*strpFront;Node*strpBack;system(cls);if(strpHead==NULL){strpNew-next=NULL;strpHead=strpNew;}else{if(strcmp(strpNew-szName,strpHead-szName)0){MakeNewHead_f(strpNew);}else//查找新结点的位置{strpCurrent=InsertPoint_f(strpNew-szName);strpFront=strpCurrent;strpBack=strpCurrent-next;if(strpBack==NULL){AddToEnd_f(strpNew);}else{strpFront-next=strpNew;strpNew-next=strpBack;}}}}海南大学信息科学技术学院数据结构课程设计5.显示记录由于记录显示操作经常进行,所以这部分用独立函数时间,利用单链表的遍历就可以很容易的实现。voidDisplayList_f(){strpCurrent=strpHead;if(strpCurrent!=NULL){printf(\n);printf(姓名电话号码联系地址\n);printf(------------------------------------------------------------\n);do{printf(%10s,strpCurrent-sz