制作通讯录_通讯录制作
制作通讯录由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“通讯录制作”。
浙江大学城市学院实验报告
课程名称
数据结构
实验项目名称
实验三
线性表的应用---通讯录管理系统的设计与实现
实验成绩
指导老师(签名)
日期
一.实验目的和要求
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:返回菜单
请输入您的选择: ");