制作通讯录

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浙江大学城市学院实验报告

课程名称数据结构

实验项目名称实验三线性表的应用---通讯录管理系统的设计与实现

实验成绩指导老师(签名)日期

一.实验目的和要求

1、掌握线性表的顺序存储结构;

2、掌握线性表的动态分配顺序存储结构及基本操作的实现;

3、掌握线性表的链式存储结构;

4、掌握单链表的基本操作的实现。

5、掌握线性表的应用。

二.实验内容

1、设计并实现日常生活中通讯录的管理系统。该系统需3位同学一组,按模块分工协作完成,系统具体功能需求描述如下:

①输入数据建立通讯录表:在系统使用前先需要创建通讯录,可以一次输入(或文件导入)多个成员的通讯录信息,建立通讯录。要求此表为顺序存储结构。

②查看所有通讯录信息:显示通讯录表中所有成员的通讯录信息。

③查询通讯录中满足要求的信息:可以根据不同方式查询,如按姓名查询、按姓氏查询、按编号查询等。

④新增通讯录信息:每次可添加一个新成员的通讯录信息。

⑤修改通讯录信息:修改通讯录中已有成员的信息。

⑥删除通讯录成员:删除通讯录表中已有的成员,但需要把删除的成员信息放到另一张被删成员表中,以便错误操作后允许恢复。该被删成员表要求采用链式存储。

⑦恢复被删成员信息:一旦发现误删,则可以在被删成员表中找到该成员,重新加入到通讯录表中。

系统实现要求:

①通讯录表必须使用动态分配顺序存储结构,被删成员表必须使用链式存储结构。

②通讯录信息至少包括:编号、姓名、电话1、电话2、邮箱、......等,其他可自行设置。

③用菜单方式选择相应功能,且各功能的有关操作需通过调用各函数来实现,如:

初始化通讯录表用函数void InitAddressBook(SqList &TXL)、浏览所有通讯录成员函数BrowseAddressBook(SqList TSL) 等等,这些操作因针对通讯录原始表,属于顺序结构,故可将这些子函数放在头文件test3_Seq.h中。针对被删成员表的操作,由于是链式存储结构,故针对此表的相关操作课定义在test3_link.h 中。

③建立主函数文件test3.cpp,通过调用上述头文件中的函数来实现该系统。

④给出系统数据类型的定义、存储结构定义以及各个函数之间的调用关系。

⑤实验内容中设置的功能要求必须实现,此外可自行增加合适的功能,可作为额外的实验成绩进行加分:

例如:

●通讯录和被删成员数据可用文件保存,程序运行时可从文件读入相应数

据,程序结束时可写入文件保存。

●通讯录分组,可自行考虑把通讯录成员进行分组,如同学组、亲戚组、

同事组等。

2、以小组为单位认真填写实验报告,实验报告必须包括各类数据类型的结构定义说明,各类数据的组织方式,系统的功能结构,各个操作的定义以及实现方法,运行结果与分析,难点如何解决,存在问题以及可改进之处等。同时,在实验报告中需写明小组每位同学的分工,得分(小组总分不超过12分)等。实验报告文件取名为report3.doc。每组还必须制作一个答辩PPT,该PPT的命名为PPT_通讯录管理系统_(各小组成员名字).PPT。

3、每位组长上传实验报告文件report3.doc 、源程序文件test3.cpp及

test3_Seq.h、test3_Link.h,以及答辩PPT压缩打包后到BB平台上。

难点与解决:

1.实参形参的传递,链表中指针的指向,通过看书多调试几次就能解决

2. 在程序执行switch语句时,输入一个数后,执行后,程序直接退出。switch语句的输入项,非法,导致的程序直接退出。解决的方法,可用while语句先限制流入switch语句的非法输入项,从而解决输入项非法的问题。其他输入数字选择时,亦可用此方法解决

问题:

1.无法在机房的电脑运行

2.每次编译前都需将.cpp、.h、.dev以外的文件全部删除才行,否则即使故意打错几行代码也能成功编译,删除后编译出现

[Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

3.txt文件的读取写入,参考了网上的和上课讲的,一次是进行动态内存分配的语句无法编译,一次是找不到文件,最后决定不做这个功能了。

改进

1.增加读取保存功能,增加查询方式如按电话查找

2. 编号是根据当前长度自动编号,虽然可以直接反应记录的数量使得编写程序时比较方便,但也使得无法每个人对应一个编号,也使得按编号查找如同摆设

功能模块结构图:

函数调用结构图:

运行结果与分析:

程序运行后得到开始菜单,结果如下图所示

开始菜单中包括创建通讯录、显示所有记录、查询记录、添加记录,返回本菜单以及推出程序,人们可以输入想要选择的模块进行程序的进一步运行。

输入1,创建通讯录,结果下图所示:

输入2,显示所有记录,结果下图所示:

输入3,查询记录,结果下图所示:

两种查找方式;

输入4,增添记录,结果如下图所示:

输入5,修改记录,结果如下图所示:

两种方式,先查找再修改

输入6,删除记录,结果如下图所示:

两种方式,先查找再删除

输入7进入恢复菜单,结果如下图所示:

选择恢复方式

程序清单

test3.cpp

#include

#include

#include

#define TRUE 1

#define FAlSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

struct txl

{

int num;//编号

char name[10];//姓名

char tel1[100];//电话1

char tel2[100];//电话2

char mail[100];//电子邮箱

char add[100];//家庭地址

};

struct LNode

{

struct txl data;

struct LNode *next;

};

struct Sqlist

{

int length;//当前长度

int listsize=100;//当前分配的存储,初始为100单位:sizeof(struct txl) struct txl *elem;//存储空间基址

};

typedef int status;

#include"menu.h"

#include"test3_seq.h"

#include"test3_link.h"

int main()

{

int n,k=0,j;

FILE *fp;//定义文件指针

struct Sqlist L;//定义全局变量L为结构体Sqlist

struct txl n1,*n2;

struct LNode *head;//头指针

head=(struct LNode*)malloc(sizeof(struct LNode));

head->next=NULL;

menu();

while(scanf("%d",&n),n)//限制输入,当输入为int型,且不为0时循环

相关文档
最新文档