数据结构 通讯录管理系统.docx
- 文档编号:16083011
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:29
- 大小:124.17KB
数据结构 通讯录管理系统.docx
《数据结构 通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构 通讯录管理系统.docx(29页珍藏版)》请在冰点文库上搜索。
数据结构通讯录管理系统
宜春学院数学与计算机科学学院
课程设计说明书
课程名称:
数据结构程序设计
课程代码:
题目:
通讯录管理系统
年级/专业/班:
学生姓名:
**********************************************
学号:
指导教师:
开题时间:
2013年6月16日
完成时间:
2013年6月19日
---------------通讯录管理系统---------------
一、问题叙述
通讯录是用来记载和查询联系人通讯信息的工具。
电子通讯录已成为手机、电子词典等电子设备不可缺少的工具软件。
设计一个能够满足要求的通讯录管理系统是很有作用的。
本文运用单链表结构进行设计和实现。
基本功能模块如下图:
二、数据结构和功能函数的说明
这里介绍你的代码中用到的主要的数据类型和函数功能,例如:
1.结构体
structNode
{
intid;
stringname;//姓名
stringunit;//单位
stringadress;//住址
stringtelenum;//电话
Node*next;//指向下一结点的指针
};
此结构体用于存放联系人的各种数据(如,id,姓名,单位,住址,电话),作为链表中的一个节点。
2.链表类
classLink
{
private:
Node*head;//链表的头指针,为Node对象类型的值
public:
Link();//构造函数,初始化变量
boollinkIsEmpty();//判断链表是否为空
voidlinkInsert(Node*newnode);//向链表中插入新的结点
boollinkDelete(intnid);//根据id从链表中删除结点
voidlinkView();//查看链表中数据
voidlinkcreate();
voidlinkmend(intnid);//找到链表中要修改的节点
Node*linkFind(stringkeyword);//在链表中查找关键字的结点,返回指向该结点的指针
boollinkFind(intnid);//判断是否有相同的ID号的联系人
voidlinkClear();//清空链表中数据
Node*getHead();//获取头指针
};
Link类,把数据以链表的形式存储,链表的每个结点为一个Node对象。
3.linkman类
classlinkman
{
private:
Linkslink;
boolk;
public:
linkman();
voidlinkmancreate();//创建联系人
voidlinkmanView();//显示
voidlinkmanFind();//查找联系人
voidlinkmanInsert();//插入联系人
voidlinkmanDelete();//删除联系人
voidlinkmanSave();//将数据保存到文件
voidlinkmanLoad();//从文件中读入数据,创建链表
voidlinkmanmend();//修改
voidlinkmanClear();//清空联系人记录
voidExit();//退出程序
voiddoMenu(intn);//执行相应菜单项功能
};
类linkman,用于包装Link类及菜单操作。
其中包括两个私有数据:
Link对象成员slink,用于访问Link类中的成员;k记录数据是否被修改,开始初始化为false,如果有函数改变了(包括插入,删除,修改某条记录等)其中的数据,则k变成true。
下面介绍九大功能函数:
1.Voidlinkmancreate()创建联系人函数
该函数用于创建用户指定n值的联系人数据信息。
2.voidlinkmanInsert()添加联系人函数
当用户需要增加新的联系人时,该函数可以通过判断联系人列表中是否含有相同id值,如果没有则添加到联系人列表中,否则添加失败。
3.voidlinkmanDelete()删除联系人函数
当用户不需要某个联系人时,该函数可以通过用户输入的id号先查找到,再将其删除,如果没有找到则删除失败。
4.voidlinkmanFind()查找联系人函数
该函数通过用户输入的关键词如姓名和电话号码进行查找。
5.voidlinkmanView()显示所有联系人
6.voidlinkmanSave()将数据保存到文件
将内存中正在被操作的通讯录以文件形式保存到磁盘。
7.voidlinkmanmend()修改
通过用户输入的id可以将修改联系人的姓名、单位、住址、电话。
8.voidlinkmanClear()清空联系人记录
9.voidExit()退出程序
先判断数据是否被修改,若被修改则保存数据,再退出。
三、代码实现
#include
#include
#include
#include
usingnamespacestd;
structNode//结点类,用于存放联系人的各种数据
{
intid;
stringname;//姓名
stringunit;//单位
stringadress;//住址
stringtelenum;//电话
Node*next;//指向下一结点的指针
};
classLink//Link类,把数据以链表的形式存储,链表的每个结点为一个Node对象
{
private:
Node*head;//链表的头指针,为Node对象类型的值
public:
Link();//构造函数,初始化变量
boollinkIsEmpty();//判断链表是否为空
voidlinkInsert(Node*newnode);//向链表中插入新的结点
boollinkDelete(intnid);//根据id从链表中删除结点
voidlinkView();//查看链表中数据
voidlinkcreate();
voidlinkmend(intnid);//找到链表中要修改的节点
Node*linkFind(stringkeyword);//在链表中查找关键字的结点,返回指向该结点的指针
boollinkFind(intnid);//判断是否有相同的ID号的联系人
voidlinkClear();//清空链表中数据
Node*getHead();//获取头指针
};
Link:
:
Link()
{
head=NULL;
}
boolLink:
:
linkIsEmpty()
{
return(head==NULL);
}
voidLink:
:
linkInsert(Node*newnode)
{
Node*p;
if(head==NULL)
{
head=newnode;
}
else
{
p=head;
while(p->next)
{
p=p->next;
}
p->next=newnode;
}
newnode->next=NULL;
}
voidLink:
:
linkcreate()
{
Node*p=head,*q;
intn;
cout<<"输入要创建联系人数:
";
cin>>n;
for(inti=1;i<=n;i++)
{
cout<<"请输入第"<
"< q=newNode; cout<<"请输入ID: "; cin>>q->id; cout<<"请输入姓名: "; cin>>q->name; cout<<"请输入单位: "; cin>>q->unit; cout<<"请输入地址: "; cin>>q->adress; cout<<"请输入电话号码: "; cin>>q->telenum; linkInsert(q); } } boolLink: : linkDelete(intnid) { Node*p=head,*q; if(head==NULL)//链表为空的情况 returnfalse; if(head->id==nid)//删除的为第一个结点的情况 { head=head->next; deletep; returntrue; } while(p->next)//删除的为第二个及以后结点的情况 { if((p->next)->id==nid) { q=p->next; p->next=(p->next)->next; deleteq; returntrue; } p=p->next; } returnfalse; } voidLink: : linkClear() { Node*p; while(head) { p=head; head=head->next; deletep; } } voidLink: : linkView() { Node*p=head; cout< while(p) { cout< p=p->next; } } voidLink: : linkmend(intnid) { strings,s1,s2,s3,s4; charreply='y'; Node*p=head; while(p) { if((p->id)==nid) break; p=p->next; } if(p) { while(reply=='y') { cout<<"请选择要修改的数据项(name,unit,adressortelenum): "; cin>>s; if(s=="name") { cout<<"输入新名字: "; cin>>s1; p->name=s1; } if(s=="unit") { cout<<"输入新单位: "; cin>>s2; p->unit=s2; } if(s=="adress") { cout<<"输入新地址: "; cin>>s3; p->adress=s3; } if(s=="telenum") { cout<<"输入新电话: "; cin>>s4; p->telenum=s4; } cout<<"想要继续修改吗: (yorn)"; cin>>reply; } } } boolLink: : linkFind(intnid) { Node*p=head;//没找到符合条件的结点的话,返回的指针值为NULL while(p) { if(p->id==nid) returntrue; p=p->next; } returnfalse; } Node*Link: : linkFind(stringkeyword)//在链表中查找的结点,返回指向该结点的指针 { Node*p=head; while(p) { if((p->name)==keyword) { returnp; } if((p->telenum)==keyword) { returnp; } p=p->next; } returnNULL; } Node*Link: : getHead() { returnhead; } classlinkman//类linkman,用于包装Link类及菜单操作 { private: Linkslink;//Link对象成员 boolk;//记录数据是否被修改 public: linkman(); voidlinkmancreate();//创建联系人 voidlinkmanView();//显示 voidlinkmanFind();//查找联系人 voidlinkmanInsert();//插入联系人 voidlinkmanDelete();//删除联系人 voidlinkmanSave();//将数据保存到文件 voidlinkmanLoad();//从文件中读入数据,创建链表 voidlinkmanmend();//修改 voidlinkmanClear();//清空联系人记录 voidExit();//退出程序 voiddoMenu(intn);//执行相应菜单项功能 }; linkman: : linkman() { Link();//调用成员对象的构造函数 linkmanLoad();//从文件中读取数据,创建链表 k=false;//设置数据被修改 } voidlinkman: : linkmancreate()//输入联系人 { slink.linkcreate(); k=true; } voidlinkman: : linkmanView()//显示 { if(slink.linkIsEmpty()) { cout<<"没有学生记录! "< } else slink.linkView(); } voidlinkman: : linkmanFind()//查找联系人 { stringstr,str1,str2; Node*p; if(slink.linkIsEmpty())//链表为空的情况 cout<<"没有学生记录! "< else { cout<<"请输入你要查找的关键字(name或telenum): \n"; cin>>str; if(str=="name") { cout<<"请输入要查找的姓名: "; cin>>str1; p=slink.linkFind(str1);//获得找到的结点的指针 if(p)//指针值不为NULL时 { cout< cout< } else//指针值为NULL时 { cout<<"没有找到姓名为"< "< } } else { cout<<"请输入要查找的电话号码: "< cin>>str2; p=slink.linkFind(str2);//获得找到的结点的指针 if(p)//指针值不为NULL时 { cout< cout< } else//指针值为NULL时 cout<<"没有找到电话号码为"< "< } } } voidlinkman: : linkmanInsert()//插入联系人 { Node*p=newNode; cout<<"请输入ID: "; cin>>p->id; cout<<"请输入姓名: "; cin>>p->name; cout<<"请输入单位: "; cin>>p->unit; cout<<"住址: "; cin>>p->adress; cout<<"电话号码: "; cin>>p->telenum; if(! slink.linkFind(p->id))//判断ID是否存在 { slink.linkInsert(p); k=true; } else cout<<"ID为"< "< } voidlinkman: : linkmanDelete()//删除联系人 { inti; if(slink.linkIsEmpty())//链表为空的情况 cout<<"没有联系人记录! "< else { cout<<"请输入ID: "; cin>>i; if(slink.linkDelete(i)) { cout<<"成功删除ID为"< "< k=true; } else cout<<"没有找到ID为"< "< } } voidlinkman: : linkmanSave()//将数据保存到文件 { Node*p=slink.getHead(); ofstreamoutfile("data.txt"); if(! outfile) cerr<<"错误: 数据文件不能打开! \n"; else { while(p) { outfile< p=p->next; } k=false; cout<<"保存成功! "< } outfile.close(); } voidlinkman: : linkmanLoad()//从文件中读入数据,创建链表 { Node*p; intnid; ifstreaminfile("data.txt"); if(! infile) cerr<<"错误: 数据文件不能打开! \n"; else { while(infile>>nid)//读取ID,直到读空 { p=newNode(); p->id=nid; infile>>p->name>>p->unit>>p->adress>>p->telenum;//读取姓名 slink.linkInsert(p); } } infile.close();//关闭文件 } voidlinkman: : linkmanmend()//修改 { inti; if(! slink.linkIsEmpty()) { cout<<"请输入要修改的ID: "; cin>>i; slink.linkmend(i); cout<<"修改成功! "; k=true; } else { cout<<"修改失败! "; } } voidlinkman: : linkmanClear()//清空联系人记录 { slink.linkClear(); cout<<"成功清空学生记录! "< } voidlinkman: : Exit()//退出程序 { chars='Y'; if(k)//判断数据是否修改 { cout<<"数据已经改变,是否保存? (y/n): "; cin>>s; if(s=='y'||s=='Y') linkmanSave(); } cout<<"已安全退出! "< exit(0); } voidlinkman: : doMenu(intn)//执行相应菜单项功能 { switch(n) { case1: linkmancreate();break;//创建: 创建联系人数据 case2: linkmanInsert();break;//添加: 插入一条联系人数据 case3: linkmanDelete();break;//删除: 删除指定联系人数据 case4: linkmanFind();break;//查找: 查找关键字数据 case5: linkmanView();break;//显示: 显示所有数据 case6: linkmanSave();break;//保存: 保存所有数据 case7: linkmanmend();break;//修改 case8: linkmanClear();break;//清空 case0: Exit();break;//退出: 安全的退出本系统 default: cout<<"输入错误! "; } } intmain() { linkmans; inti; system("cls");//清除屏幕 system("color2a"); cout<<"\n\n\t\t当前日期: "; _sleep(600); system("DATE[/T]"); _sleep(600); cout<<"\n\t\t当前时间: ";_sleep(600); system("TIME[/T]"); cout<<"\n\n\t\t通"; _sleep(600);cout<<"讯"; _sleep(600); cout<<"录"; _sleep(600); cout<<"管";_sle
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 通讯录管理系统 通讯录 管理 系统