制作通讯录_通讯录制作

2020-02-27 其他范文 下载本文

制作通讯录由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“通讯录制作”。

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

课程名称

数据结构

实验项目名称

实验三

线性表的应用---通讯录管理系统的设计与实现

实验成绩

指导老师(签名)

日期

一.实验目的和要求

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

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

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

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

5、掌握线性表的应用。

二.实验内容

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

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

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

④ 新增通讯录信息:每次可添加一个新成员的通讯录信息。⑤ 修改通讯录信息:修改通讯录中已有成员的信息。

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

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

系统实现要求:

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

②通讯录信息至少包括:编号、姓名、电话

1、电话

2、邮箱、......等,其他可自行设置。

③用菜单方式选择相应功能,且各功能的有关操作需通过调用各函数来实现,如:初始化通讯录表用函数void InitAddreBook(SqList &TXL)、浏览所有通讯录成员函数 BrowseAddreBook(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时循环

} {

switch(n){ case 1: Create(L,fp);k=1;break;//k=1表示已创建通讯录

case 2: if(k==1)ListTraverse(L);break;case 3: if(k==1)Search(L,n1);break;case 4: if(k==1)Insert(L);break;case 5: if(k==1)Modify(L);break;case 6: if(k==1)Delete(L,head);break;case 7: Recover(L,head);break;case 8: menu();break;

default:printf(“请输入0-8!n”);} if(k==0&&n>=2&&n

//菜单函数

printf(“n”);printf(“ttt**************************n”);printf(“ttt*

欢迎使用

*n”);printf(“ttt*

通讯录管理系统

*n”);printf(“ttt**************************n”);printf(“n”);printf(“tt *************************************n”);printf(“tt *

1.创建通讯录

*n”);printf(“tt *

2.显示所有记录

*n”);printf(“tt *

3.查询记录

*n”);printf(“tt *

4.添加记录

*n”);printf(“tt *

5.修改记录

*n”);printf(“tt *

6.删除记录

*n”);printf(“tt *

7.恢复记录

*n”);printf(“tt *

8.显示菜单

*n”);printf(“tt *

0.退出程序

*n”);printf(“tt *************************************nnn”);

} void menu_1(){

//菜单函数

printf(“n”);printf(“ttt**************************n”);printf(“ttt*

欢迎使用

*n”);printf(“ttt*

通讯录恢复系统

*n”);printf(“ttt**************************n”);printf(“n”);printf(“tt *************************************n”);printf(“tt *

1.按编号恢复

*n”);printf(“tt *

2.按姓名恢复

*n”);printf(“tt *

0.退出恢复系统

*n”);printf(“tt *************************************nnn”);

}

test3_Seq.h int Create(struct Sqlist &L,FILE * &fp)//创建通讯录

{ system(“cls”);//清屏

int i,n,s=0;char k;

printf(“你所想创建通讯录个数(

L.elem=(struct txl*)malloc(L.listsize*sizeof(struct txl));//存储分配

if(!L.elem)//分配失败

{

exit(OVERFLOW);

}

for(i=0;i

L.elem[i].num=i+1;

printf(”编号为%d“,L.elem[i].num);//第i条记录的编号为i

printf(”请输入姓名:“);

scanf(”%s“,L.elem[i].name);

printf(”请输入电话1:“);

scanf(”%s“,L.elem[i].tel1);

printf(”请输入电话2:“);

scanf(”%s“,L.elem[i].tel2);

printf(”请输入电子邮箱:“);

scanf(”%s“,L.elem[i].mail);

printf(”请输入家庭地址:“);

scanf(”%s“,L.elem[i].add);

}

printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);

} int ListTraverse(struct Sqlist &L){//显示所有信息

system(”cls“);//清屏

int i;for(i=0;i

printf(”编号:%d “,L.elem[i].num);

printf(”姓名:%s “,L.elem[i].name);

printf(”电话1:%s “,L.elem[i].tel1);

printf(”电话2: %s “,L.elem[i].tel2);

printf(”电子邮箱: %s “,L.elem[i].mail);

printf(”家庭地址: %sn“,L.elem[i].add);

} printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);} int Search(struct Sqlist &L,struct txl &n){//查找信息

system(”cls“);//清屏

int i,n1,j=0,k=0;char name1[10];//查找的姓名

int num1;//查找的编号

printf(”输入1按姓名查找

“);printf(”输入2按编号查找 “);while(scanf(”%d“,&n1)){

if(n1==1)

{

printf(”请输入您要查找的姓名:“);

scanf(”%s“,name1);

for(i=0;i

{

if(strcmp(name1,L.elem[i].name)==0)//姓名相同时

{

n=L.elem[i];

printf(”编号:%d “,L.elem[i].num);

printf(”名字:%s “,L.elem[i].name);

printf(”电话1:%s “,L.elem[i].tel1);

printf(”电话2: %s “,L.elem[i].tel2);

printf(”电子邮箱: %s “,L.elem[i].mail);

printf(”家庭地址: %sn“,L.elem[i].add);

k=1;

break;

}

}

if(k==0)//没有该姓名时

{

printf(”没有这个记录n“);

}

break;

}

if(n1==2)

{

printf(”请输入你要查找的编号: “);

while(scanf(”%d“,&num1),num1){//限制输入

break;

}

if(num1=L.length)//没有该编号时

{

printf(”没有这个记录n“);

}

for(i=0;i

{

if(num1==L.elem[i].num)//编号相同时

{

n=L.elem[i];

printf(”编号:%d “,L.elem[i].num);

printf(”名字:%s “,L.elem[i].name);

printf(”电话1:%s “,L.elem[i].tel1);

printf(”电话2: %s “,L.elem[i].tel2);

printf(”电子邮箱: %s “,L.elem[i].mail);

printf(”家庭地址: %sn“,L.elem[i].add);

break;

}

}

break;

}

if(n1!=1&&n1!=2)

printf(”请输入1或2!“);

} printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);} int Search_1(struct Sqlist &L,struct txl &n){//被其他函数调用以查找信息

int i,n1,j=0,k=0;char name1[10];//查找的姓名

int num1;//查找的编号

printf(”输入1按姓名查找

“);printf(”输入2按编号查找 “);while(scanf(”%d“,&n1)){ if(n1==1){

printf(”请输入您要查找的姓名:“);

scanf(”%s“,name1);

for(i=0;i

{

if(strcmp(name1,L.elem[i].name)==0)//姓名相同时

{

n=L.elem[i];

printf(”编号:%d “,L.elem[i].num);

printf(”名字:%s “,L.elem[i].name);

printf(”电话1:%s “,L.elem[i].tel1);

printf(”电话2: %s “,L.elem[i].tel2);

printf(”电子邮箱: %s “,L.elem[i].mail);

printf(”家庭地址: %sn“,L.elem[i].add);

k=1;

break;

}

}

if(k==0)//没有该姓名时

{

printf(”没有这个记录n“);

}

break;

} if(n1==2){

printf(”请输入你要查找的编号: “);

while(scanf(”%d“,&num1),num1){//限制输入

break;

}

if(num1=L.length)//没有该编号时

{

printf(”没有这个记录n“);

}

for(i=0;i

{

if(num1==L.elem[i].num)//编号相同时

{

n=L.elem[i];

printf(”编号:%d “,L.elem[i].num);

printf(”名字:%s “,L.elem[i].name);

printf(”电话1:%s “,L.elem[i].tel1);

printf(”电话2: %s “,L.elem[i].tel2);

printf(”电子邮箱: %s “,L.elem[i].mail);

printf(”家庭地址: %sn“,L.elem[i].add);

break;

}

}

break;

}

if(n1!=1&&n1!=2)

printf(”请输入1或2!“);

} } int Insert(struct Sqlist &L){//添加信息

system(”cls“);int i;char k;struct txl *newbase;if(L.length>=L.listsize)////当前存储空间已满,增加分配

{

newbase=(struct txl*)realloc(L.elem,(L.listsize+10)*sizeof(struct txl));

if(!newbase)//存储分配失败

{

exit(OVERFLOW);

}

L.elem=newbase;} printf(”请输入新成员的信息:“);printf(”这是第%d位“,L.length+1);//添加到最后

L.elem[L.length].num=L.length+1;

printf(”请输入姓名:“);

scanf(”%s“,L.elem[L.length].name);

printf(”请输入电话1:“);

scanf(”%s“,L.elem[L.length].tel1);

printf(”请输入电话2:“);

scanf(”%s“,L.elem[L.length].tel2);

printf(”请输入电子邮箱:“);

{

scanf(”%s“,L.elem[L.length].mail);

}

printf(”请输入家庭地址:“);

{

scanf(”%s“,L.elem[L.length].add);

}

L.length++;//长度增加

printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);

} int Modify(struct Sqlist &L){//修改信息

system(”cls“);struct txl n,gai;int k,k1;while(1

Search_1(L,n);//查找记录

printf(”是否修改此记录:(1=Y/2=N)n“);

while(scanf(”%d“,&k)){//限制输入,当k成功赋值时循环

if(k!=1&&k!=2)

printf(”请输入1或2!“);

else

break;

}

if(k==2)

{

break;//输入1修改,输入2不修改并结束循环返回

}

if(k==1)

{

gai.num=n.num;

printf(”请修改姓名:“);

scanf(”%s“,gai.name);

printf(”请修改电话1:“);

scanf(”%s“,gai.tel1);

printf(”请修改电话2:“);

scanf(”%s“,gai.tel2);

printf(”请修改电子邮箱:“);

scanf(”%s“,gai.mail);

printf(”请修改家庭地址:“);

scanf(”%s“,gai.add);

L.elem[n.num-1]=gai;

}

printf(”是否继续修改?(1=Y/2=N)“);

while(scanf(”%d“,&k)){

if(k!=1&&k!=2)

printf(”请输入1或2!“);

else

break;

}

if(k1==1)//继续循环

{

;

}

if(k1==2)//跳出循环

{

break;

} }

} printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);test3_link.h int Delete(struct Sqlist &L,struct LNode* &head)//删除通讯录并保存到链表

{ system(”cls“);static int j=1;//当前编号

int i,k;struct txl n;struct LNode *p,*q;

p=(struct LNode *)malloc(sizeof(struct LNode));if(!p)exit(OVERFLOW);//分配存储

q=(struct LNode *)malloc(sizeof(struct LNode));if(!q)exit(OVERFLOW);

printf(”请输入你想删的成员:n“);

Search_1(L,n);//查找记录

printf(”是否删除此记录?(1=Y/2=N)n“);//输入1删除,输入2不删除并结束循环返回

while(scanf(”%d“,&k)){

if(k!=1&&k!=2)

printf(”请输入1或2!“);

else

break;

}

if(k==1)

{

p->data=n;//将 Search_1函数所找到的数据赋值给p->data

p->data.num=j;//为删除的记录编号

p->next=head->next;

head->next=p;

q=head->next;

for(i=n.num;i

{

L.elem[i-1]=L.elem[i];

L.elem[i-1].num=i;//编号

}

L.length--;

j++;

}

if(k==2)

{

;

}

printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: “);

} int Recover(struct Sqlist &L,struct LNode* &head){ system(”cls“);int n,number,k,a=0;char name1[10];struct txl n1;struct LNode* q,*p;q=(struct LNode*)malloc(sizeof(struct LNode));//存储分配

p=(struct LNode*)malloc(sizeof(struct LNode));q=head->next;//指向第一个节点

p=head;//指向头指针

menu_1();//显示恢复菜单

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

{

printf(”请问要恢复哪个成员?n“);

while(q!=NULL)//依次输出所有被删记录

{

printf(”编号:%d “,q->data.num);

printf(”名字:%s “,q->data.name);

printf(”电话1:%s “,q->data.tel1);

printf(”电话2: %s “,q->data.tel2);

printf(”电子邮箱: %s “,q->data.mail);

printf(”家庭地址: %sn“,q->data.add);

q=q->next;} if(n==1){ printf(”请输入所要恢复的编号n“);scanf(”%d“,&number);while(p!=NULL){

if(p->next->data.num==number)

{

L.elem[L.length]=p->next->data;//添加到末尾

L.elem[L.length].num=L.length+1;//编号

p->next=p->next->next;//将该记录从链表中删除

L.length++;

printf(”恢复成功!n“);

a=1;//标记有此记录,并已恢复

break;

}

p=p->next;} if(a==0)printf(”没有该编号n“);

break;

} if(n==2){ printf(”请输入所要恢复的姓名n“);

scanf(”%s“,name1);

while(p!=NULL){

if(strcmp(p->next->data.name,name1)==0)

{

L.elem[L.length]=p->next->data;//添加到末尾

L.elem[L.length].num=L.length+1;//编号

p->next=p->next->next;//将该记录从链表中删除

L.length++;

printf(”恢复成功!n“);

a=1;//标记有此记录,并已恢复

break;

}

p=p->next;}

}

if(a==0)

printf(”没有该姓名n“);

break;} if(n!=1&&n!=2&&n!=0){

printf(”请输入0-2!n“);

} } printf(”输入 0:退出, 输入8:返回菜单

请输入您的选择: ");

《制作通讯录.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
制作通讯录
点击下载文档
相关专题 通讯录制作 通讯录 通讯录制作 通讯录
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文