C++通信录系统.docx
- 文档编号:16189540
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:27
- 大小:21.89KB
C++通信录系统.docx
《C++通信录系统.docx》由会员分享,可在线阅读,更多相关《C++通信录系统.docx(27页珍藏版)》请在冰点文库上搜索。
C++通信录系统
一、基于双向链表上的C++程序设计通讯录程序,要求按姓名的字典序排序。
通信录系统简介:
一、功能:
具有增加,删除,修改,查询功能。
,代码健壮,界面友好!
功能简介:
--编者--冯天明
注:
以下操作均建立在第一个新建联系人基础,若要进行相关操作,必须要先存储联系人。
选项1:
新添加联系人
进入该选项后会提示输入保存的联系人数目。
选项2:
查询已保存的联系人信息
进入选项,如果为空则没有任何信息显示,可以选择添加和返回,反之会显示所有的联系人信息。
英文名字按照字典顺序排序,中文名字则随机编排。
选项3:
指定联系人,修改信息
进入选项,如果为空,则显示通信录中没有任何信息。
反之,会提示输入姓名进行查找修改。
修改选项有:
修改名字,地址,电话,以及全部信息均修改等以及返回按钮。
选项4:
进入选项,如果为空则不可以进行相关删除操作,反之,可以根据输入需要删除的联系人信息可以进行删除操作。
选项0:
退出通信录系统,结束程序!
实验代码:
/*************基于双向链表实现的简单通信录系统*****************/
/**************姓名按照字典字母排序(英文名才可排序)************/
/********************实现增、删、改、查、功能*****************/
#include
#include
#include
#include
voidwelcome();//登录界面
voidshowMenu();//菜单函数
voidadd();//添加联系人
voidshowInfo();//输出信息
voidsearch();//查找修改函数
voiddeleteInfo();//删除联系人函数
voidshowEmpty();//非成员函数判断链表是否为空
usingnamespacestd;
/****************Object类定义********************/
classObject
{//定义一个用于派生结点信息的抽象类
public:
Object(){}
virtualintIsEqual(Object&)=0;//判二个结点是否相等
virtualvoidShow()=0;//输出一个结点上的数据
virtualintIsGreat(Object&)=0;//判二个结点的大小
virtual~Object(){};
};
classNode//结点类
{
private:
Object*Info;//指向描述结点的数据域
Node*Prev,*Next;//用于构成链表的前后向指针
public:
Node(){Info=0;Prev=0;Next=0;}
Node(Node&node)//完成拷贝功能的构造函数
{
Info=node.Info;Prev=node.Prev;Next=node.Next;
}
voidFillInfo(Object*obj)//使Info指向数据域
{
if(Info)
{
delete(Info);
Info=NULL;
}
Info=obj;
}
Object*GetInfo()
{
returnInfo;
}
friendclassList;//定义友元类
};
/**********************List链表类定义*************************/
classList
{//实现双向链表操作的类
Node*Head,*Tail;//链表首和链表尾指针
public:
List(){Head=Tail=0;}//置为空链表
~List(){DeleTelist();}//释放链表占用的存储空间
voidAddNode(Node*);//在链表尾加一个结点
Node*DeleteNode(Node*);//删除链表中的一个指定的结点
Node*LookUp(Object&);//在链表中查找一个指定的结点
voidShowList();//输出整条链表上的数据
voidDeleTelist();//删除整条链表
boolisEmpty(){returnHead==NULL;}//判断链表是否为空
};
staticListlist;//生成一个全局链表对象
/*************************List成员函数定义******************/
voidList:
:
AddNode(Node*node)
{
if(Head==0)
{//条件成立时,为空链表
Head=Tail=node;//使链表首和链表尾指针都指向这结点
node->Next=node->Prev=0;//指该结点的前后向指针置为空
}
else
{//链表不为空,找到插入位置
Node*pn=Head;
while(pn)
{
Object&obj=*(node->Info);
//如果新插入的节点找到了名字顺序比他大的,直接插入在他前面
if(pn->Info->IsGreat(obj)==-1)break;
elsepn=pn->Next;
}
if(pn==0)
{//插入链尾
Tail->Next=node;//使原链表尾结点的后向指针指向这结点
node->Prev=Tail;//使该结点的前向指针指向原链表尾结点
Tail=node;//使Tail指向新的链表尾结点
node->Next=0;
}
else
{//插在pn所指向结点之前
if(pn==Head)
{//插在第一个结点之前
node->Next=Head;Head->Prev=node;
node->Prev=0;Head=node;
}
else
{//使pn指向结点的前一个结点指向node
pn->Prev->Next=node;
node->Next=pn;
node->Prev=pn;//设置后向链
pn->Prev=node;
}
}
}
}
Node*List:
:
DeleteNode(Node*node)//删除指定的结点
{
if(node==Head)//二者相等,表示删除链表首结点
if(node==Tail)//二者相等,表示链表上只有一个结点
Head=Tail=0;
else
{//删除链表首结点
Head=node->Next;
Head->Prev=0;
}
else
{//删除的结点不是链表上的首结点
node->Prev->Next=node->Next;//从后向链指针上取下该结点
if(node!
=Tail)node->Next->Prev=node->Prev;
elseTail=node->Prev;//要删除的结点为链表尾结点
}
node->Prev=node->Next=0;//将已删除结点的前后向指针置为空
return(node);
}
Node*List:
:
LookUp(Object&obj)//从链表上查找一个结点
{
Node*pn=Head;
while(pn)
{
if(pn->Info->IsEqual(obj)==0)returnpn;//找到要找的结点
pn=pn->Next;
}
return0;//链表上没有要找的结点
}
voidList:
:
ShowList()//输出链表上各结点的数据值
{
Node*p=Head;
if(p==NULL)//如果链表为空
{
inttemp;
system("cls");
cout<<"\n\t\t\t联系表中没有任何信息!
"< cout<<"\n\n1、添加信息\n2、返回主界面\n"; cin>>temp; if(temp==1) { add(); } else return; } while(p) { p->Info->Show();p=p->Next; } } voidList: : DeleTelist()//删除整条链表 { Node*p,*q; p=Head; while(p) { deletep->Info;//释放描述结点数据的动态空间 q=p;p=p->Next; deleteq;//释放Node占用的动态空间 } } /*************由抽象类派生MenNode描述结点数据类定义***********/ classMenNode: publicObject {//由抽象类派生出描述结点数据的类 char*Name;//姓名 char*Addr;//地址 char*Tel;//电话 public: MenNode(char*n=0,char*a=0,char*s=0) { if(n==0)Name=0; else { Name=newchar[strlen(n)+1];strcpy(Name,n); } if(a==0)Addr=0; else { Addr=newchar[strlen(a)+1];strcpy(Addr,a); } if(s==0)Tel=0; else { Tel=newchar[strlen(s)+1];strcpy(Tel,s); } } voidsetName(char*s)//设置Name { if(Name)delete[]Name; Name=newchar[strlen(s)+1];strcpy(Name,s); } char*getName()//获取Name { returnName; } voidsetAddr(char*addr)//设置地址 { if(Addr)delete[]Addr; Addr=newchar[strlen(addr)+1]; strcpy(Addr,addr); } char*getAddr()//获取地址 { returnAddr; } voidsetTel(char*t)//设置Tel { if(Tel)delete[]Tel; Tel=newchar[strlen(t)+1]; strcpy(Tel,t); } char*getTel()//获取Tel { returnTel; } voidSetData(char*,char*,char*);//设置新节点 intIsEqual(Object&); intIsGreat(Object&);//比较两个节点name属性的大小函数 ~MenNode() { if(Name)delete[]Name; if(Addr)delete[]Addr; if(Tel)delete[]Tel; } voidShow()//重新定义虚函数 { cout<<"\t姓名: "< "地址: "< "< } }; /*****************MenNode类成员函数定义****************/ voidMenNode: : SetData(char*n,char*a,char*s) { if(Name)delete[]Name; if(Addr)delete[]Addr; if(Tel)delete[]Tel; if(n==0)Name=0; else { Name=newchar[strlen(n)+1];strcpy(Name,n); } if(a==0)Addr=0; else { Addr=newchar[strlen(a)+1];strcpy(Addr,a); } if(s==0)Tel=0; else { Tel=newchar[strlen(s)+1];strcpy(Tel,s); } } intMenNode: : IsEqual(Object&obj)//定义比较结点是否相等的虚函数 { MenNode&temp=(MenNode&)obj; returnstrcmp(Name,temp.Name);//相等返回0,否则返回1或者-1 } //定义比较两个结点大小的虚函数,相当返回0 intMenNode: : IsGreat(Object&obj) { MenNode&temp=(MenNode&)obj; returnstrcmp(temp.Name,Name); } /*********************菜单函数*************************/ voidshowMenu() { system("cls"); cout<<"\n\n\t************************天天通信录系统菜单**********************\n\n"; cout<<"\t**1.从键盘输入联系人信息**\n\n"; cout<<"\t**2.查询系统已保存联系人信息**\n\n"; cout<<"\t**3.指定联系人,修改信息**\n\n"; cout<<"\t**4.指定联系人,删除信息**\n\n"; cout<<"\t**0.退出系统**\n\n"; cout<<"\t****\n\n"; cout<<"\t**提示: 输入完数据按Enter键**\n\n"; cout<<"\t****************************************************************\n\n"; } /********************登录界面函数************************/ voidwelcome() { intflag; while (1)//循环控制保证输入的数字合法 { intm=0; showMenu(); cout<<"\t请输入你要操作的序号(0-4): "; cin>>flag; while(cin.fail()||flag<0||flag>4) { if(cin.fail()) { cin.clear(); cin.ignore(); } cin.sync(); cout<<"输入有误,请重新输入: "; m++; if(m==5)break; cin>>flag; } switch(flag) { case0: system("cls"); cout<<"\n\n\t\t\t\t确定退出系统? "; cout<<"\n\n\n\n\t\t\t\t确定? (Y/N)"< chartemp; fflush(stdin); cin>>temp; if(temp=='Y'||temp=='y') {system("cls"); cout<<"\n\n\n\n\t\t\t提示: 您已经退出系统,感谢使用,ByeBye! \n\n\n"; exit(0); } else break; case1: //选择1为增加联系人 system("cls"); add();//增加节点 system("cls"); break; case2: //选择2是显示已保存的联系人 system("cls"); showInfo();//显示已保存的联系人 break; case3: //查找修改联系人 system("cls"); search();//查找修改联系人函数 break; case4: system("cls"); deleteInfo();//删除联系人函数 system("cls"); } } } /**********************判断链表是否为空************************/ voidshowEmpty() { cout<<"\n\t\t\t通信录未存入任何联系人信息! \n\n\n"< cout<<"\n\n\n\n\t\t\t1、添加信息\n\t\t\t2、返回主界面"< cout<<"输入选项: "; inttemp; fflush(stdin); cin>>temp; if(temp==1) { system("cls"); add(); } else { return; } return; } /*****************增加联系人函数*************************/ voidadd() { intnum=0; //charbuffer[255]; MenNode*p; Node*pn; cout<<"\n\t\t\t\t**添加联系人**\n\n\n\n"< cout<<"需要保存的联系人个数: "; cin.sync(); cin>>num; while(cin.fail()||num<1)//循环控制保证输入的数据合法 { cin.clear(); cin.ignore(); cout<<"\n\n输入数据有误,请重新输入希望建立的联系人信息条数: "< cin.sync(); cin>>num; } system("cls"); for(inti=0;i { p=newMenNode; charname[20],addr[40]; charTel[20]; fflush(stdin); cout<<"\n\n\t\t\t请输入第"< cout<<"\n请输入姓名: "< cin.getline(name,20); fflush(stdin); cout<<"请输入地址: "< cin.getline(addr,40); fflush(stdin); cout<<"请输入电话: "< cin.getline(Tel,20); p->SetData(name,addr,Tel); pn=newNode; pn->FillInfo(p);//填写节点信息 list.AddNode(pn);//增加该节点到链表去 cout<<"信息正在保存......."; Sleep(500); cout<<"\n\n"< ! "; Sleep(1000); system("cls"); } cout<<"\n\n\n\t\t\t\t联系人信息添加完成! "< cout<<"\n\n\n\t\t1、查看已保存联系人信息\n\n\t\t2、返回主界面"< cout<<"输入选项: "; cin>>num; if(num==1) { system("cls"); showInfo(); system("pause"); } else { return; } } /****************显示联系人信息**********************/ voidshowInfo() { intchoose; system("cls"); cout<<"\n\n\n\t\t\t**通信录中已保存的联系人信息**\n\n\n\n"< if(list.isEmpty()) { showEmpty(); return; } list.ShowList(); cout<<"\n\n\n\n"; cout<<"\n\n\n\n\t\t\t1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 通信 系统