通讯录管理系统C++源程序.docx

上传人:b****8 文档编号:10098689 上传时间:2023-05-23 格式:DOCX 页数:20 大小:18.48KB
下载 相关 举报
通讯录管理系统C++源程序.docx_第1页
第1页 / 共20页
通讯录管理系统C++源程序.docx_第2页
第2页 / 共20页
通讯录管理系统C++源程序.docx_第3页
第3页 / 共20页
通讯录管理系统C++源程序.docx_第4页
第4页 / 共20页
通讯录管理系统C++源程序.docx_第5页
第5页 / 共20页
通讯录管理系统C++源程序.docx_第6页
第6页 / 共20页
通讯录管理系统C++源程序.docx_第7页
第7页 / 共20页
通讯录管理系统C++源程序.docx_第8页
第8页 / 共20页
通讯录管理系统C++源程序.docx_第9页
第9页 / 共20页
通讯录管理系统C++源程序.docx_第10页
第10页 / 共20页
通讯录管理系统C++源程序.docx_第11页
第11页 / 共20页
通讯录管理系统C++源程序.docx_第12页
第12页 / 共20页
通讯录管理系统C++源程序.docx_第13页
第13页 / 共20页
通讯录管理系统C++源程序.docx_第14页
第14页 / 共20页
通讯录管理系统C++源程序.docx_第15页
第15页 / 共20页
通讯录管理系统C++源程序.docx_第16页
第16页 / 共20页
通讯录管理系统C++源程序.docx_第17页
第17页 / 共20页
通讯录管理系统C++源程序.docx_第18页
第18页 / 共20页
通讯录管理系统C++源程序.docx_第19页
第19页 / 共20页
通讯录管理系统C++源程序.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

通讯录管理系统C++源程序.docx

《通讯录管理系统C++源程序.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统C++源程序.docx(20页珍藏版)》请在冰点文库上搜索。

通讯录管理系统C++源程序.docx

通讯录管理系统C++源程序

#include

#include

#include

#include

classNode

{

charName[10];//姓名

intOfficePhone;//办公室电话

intHomePhone;//住宅电话

charMobilePhone[15];//手机号码

charEMail[20];//email地址

Node*next;//下一结点指针

public:

Node(constchar*n="0",constinto=0,constinth=0,constchar*m="0",constchar*e="0",Node*nx=0)//构造函数,各参数均有缺省值

{

strcpy(Name,n);

OfficePhone=o;

HomePhone=h;

strcpy(MobilePhone,m);

strcpy(EMail,e);

next=nx;

}

voidShow()//显示结点数据

{

cout<

}

voidSetName(char*name)//修改姓名

{

if(name)

strcpy(Name,name);

else

strcpy(Name,"");

}

voidSetOfficePhone(intop)//修改办公室电话

{OfficePhone=op;}

voidSetHomePhone(inthp)//修改住宅电话

{HomePhone=hp;}

voidSetMobilePhone(char*mp)//修改手机号码

{

if(mp)

strcpy(MobilePhone,mp);

else

strcpy(MobilePhone,"");

}

voidSetEMail(char*email)//修改email地址

{

if(email)strcpy(EMail,email);

elsestrcpy(EMail,"");

}

friendclassAddrList;//将AddrList类说明为友元类

friendvoidwritetotxtfile(AddrList&);

friendvoidaddfromtxtfile(AddrList&);

};

classAddrList

{

Node*HeadPtr;//链表首指针

Node*TailPtr;//链表尾指针

intTag;//排序状态标志,当Tag=1,表示按姓名排序;默认按姓名排序。

当Tag=2,表示按办公室电话排序。

public:

AddrList(inttag=1)//构造函数,创建空链表,将Tag的值置为1

{

Node*p=newNode;

p=NULL;

HeadPtr=p;

TailPtr=p;

}

voidAddTail(Node*p)//将p指向的结点加入到链表尾部

{

if(HeadPtr==0)

{HeadPtr=p;

TailPtr=p;

p->next=NULL;

}

else

{

TailPtr->next=p;

TailPtr=p;

p->next=NULL;

}

}

voidSetTag(intt)//置tag值

{Tag=t;}

intGetTag()//取tag值

{returnTag;}

voidAddSort(Node*p)//将p指向的结点按Tag指定的顺序插入到链表中

{

Node*p1,*p2;//p指向的结点插在p1与p2指向的结点之间

if(Tag==1)//按姓名排序

{

if(HeadPtr==NULL)//插入前原始链表为空

{HeadPtr=p;

TailPtr=p;

p->next=NULL;

}

if(strcmp(HeadPtr->Name,p->Name)>0)//插在链表首部

{p->next=HeadPtr;

HeadPtr=p;

}

p1=HeadPtr;//插在链表中间或尾部

p2=HeadPtr;

while(p2->next&&strcmp(p2->Name,p->Name)<0)

{p1=p2;

p2=p2->next;

}

if(strcmp(p2->Name,p->Name)<0)

{

p2->next=p;

p->next=NULL;

}

elseif(strcmp(p2->Name,p->Name)>0)

{

p->next=p2;

p1->next=p;

}

}

if(Tag==2)//按办公室电话排序

{

if(HeadPtr==0)

{HeadPtr=p;

TailPtr=p;

p->next=NULL;

}

if((HeadPtr->OfficePhone)>(p->OfficePhone))

{p->next=HeadPtr;

HeadPtr=p;

}

p1=p2=HeadPtr;

while(p2->next&&(p2->OfficePhone)<(p->OfficePhone))

{p1=p2;

p2=p2->next;

}

if((p2->OfficePhone)<(p->OfficePhone))

{

p2->next=p;

p->next=NULL;

}

elseif((p2->OfficePhone)>(p->OfficePhone))

{

p->next=p2;

p1->next=p;

}

}

}

Node*LookUp(char*name)//按姓名查找结点,返回该结点指针

{

Node*p;

p=HeadPtr;

while(p!

=NULL)

{

if(strcmp(p->Name,name)==0)

returnp;

p=p->next;

}

returnNULL;

}

voidDelete(char*name)

{

Node*p,*head;

p=LookUp(name);

head=HeadPtr;

if(head==p)

{

HeadPtr=p->next;

deletep;

}

else

{

while(head->next!

=p)

head=head->next;

head->next=p->next;

deletep;

}

}

voidSort(inttag)//按Tag指定的关键字重新排序

{

Tag=tag;

Node*p1,*p2;

p2=HeadPtr;

HeadPtr=NULL;

TailPtr=NULL;

while(p2)

{

p1=p2->next;

AddSort(p2);

p2=p1;

}

TailPtr->next=NULL;

}

voidShowAll()//显示全部结点,每10个显示一屏

{

Node*p=HeadPtr;

if(p==NULL)

cout<<"链表为空!

\n";

else

while(p)

{

for(inti=0;i<10;i++)

{

p->Show();

p=p->next;

if(p==NULL)break;

}

system("pause");

}

}

Node*GetHeadPtr()//取首指针

{returnHeadPtr;}

~AddrList()//析构函数,释放链表空间

{

Node*p;

while(HeadPtr)

{

p=HeadPtr;

HeadPtr=HeadPtr->next;

deletep;

}

}

voidCreateList(char*filename)//从二进制文件中读入数据,构造链表

{

ifstreaminfile(filename,ios:

:

in|ios:

:

binary);

infile.read((char*)&Tag,4);//读出二进制文件的第1个数据Tag

intn;

infile.read((char*)&n,4);//读出记录数

cout<<"正在从数据中加载...";

Node*p;

for(inti=0;i

{

p=newNode;

infile.read((char*)p,sizeof(Node));

AddTail(p);

}

infile.close();

cout<<"数据从二进制文件加载成功!

";

}

voidWriteToFile(char*filename)//将链表中数据写入指定的二进制文件

{

ofstreamoutfile;

outfile.open(filename,ios:

:

out|ios:

:

binary);

outfile.write((char*)&Tag,4);

Node*p,*p1;

intn=0;

for(p1=HeadPtr;p1!

=NULL;p1=p1->next)n++;

outfile.write((char*)&n,4);

p=HeadPtr;

while(p)

{

outfile.write((char*)p,sizeof(Node));

p=p->next;

}

cout<<"成功导出二进制文件";

outfile.close();

}

};

voidDisplayMenu()

{

char*menu[]={

"1.AddRecord","2.DeleteRecord","3.DisplayAllRecord","4.Query",

"5.ModifyRecord","6.AddfromaTextFile","7.WritetoaTextFile"

"8.Sort","9.Quit"};

cout<

cout<<"*********************欢迎进入通讯录管理系统************************"

<

for(inti=0;i<9;i++)

cout<<'\t'<<'\t'<<'\t'<<*(menu+i)<

cout<

}

voidadd(AddrList&addrlist)//增加记录,内部要按照当前排序标志Tag插入结点,插入结点后,链表仍然保持有序

{

cout<<"请选择形成链表的排序标志:

\n";

cout<<"1-按姓名;2-按办公室电话:

\n";

inttag;

cin>>tag;

if(tag==1||tag==2)

{

addrlist.SetTag(tag);

Node*p=newNode;

charname[10],mobilephone[15],email[20];

intofficephone,homephone;

chars;

cout<<"请输入姓名:

";

cin>>name;

p->SetName(name);

cout<

cout<<"请输入办公室电话:

";

cin>>officephone;

p->SetOfficePhone(officephone);

cout<

cout<<"请输入住宅电话:

";

cin>>homephone;

p->SetHomePhone(homephone);

cout<

cout<<"请输入手机号码:

";

cin>>mobilephone;

p->SetMobilePhone(mobilephone);

cout<

cout<<"请输入email地址:

";

cin>>email;

p->SetEMail(email);

cout<

cout<<"确认添加?

(yorn)\n";

cin>>s;

if(s=='y')

{

addrlist.AddSort(p);

p->Show();

cout<

cout<<"增加记录成功!

\n";

}

elseif(s=='n')

{

p->Show();

cout<

cout<<"该记录未添加!

\n";

}

else

cout<<"您的输入有误!

\n";

}

else

{

cout<<"您的输入有误!

\n";

}

}

voiddel(AddrList&addrlist)//删除记录

{

charname[10];

Node*p;

cout<<"请输入要删除记录的姓名:

\n";

cin>>name;

p=addrlist.LookUp(name);

if(p!

=NULL)

{

addrlist.Delete(name);

cout<

\n";

}

else

{

cout<<"未找到"<

\n";

}

}

voidshowall(AddrList&addrlist)//显示所有记录

{

addrlist.ShowAll();

}

voidquery(AddrList&addrlist)//按姓名查找并显示一条记录

{

charname[10];

Node*p;

cout<<"请输入要查找的姓名:

\n";

cin>>name;

p=addrlist.LookUp(name);

if(p)

{

cout<<"记录已找到!

";

cout<

p->Show();

}

else

{

cout<<"未找到您要查找的记录!

\n";

}

system("pause");

}

voidmodify(AddrList&addrlist)//按姓名修改一条记录

{

charname[10],mobilephone[15],email[20];

intofficephone,homephone;

Node*p;

cout<<"请输入您要修改的记录的姓名:

\n";

cin>>name;

p=addrlist.LookUp(name);

if(p)

{cout<<"您要修改的记录是:

\n";

p->Show();

cout<<"请输入修改后的姓名、办公室电话、住宅电话、手机号码、email地址:

\n";

cin>>name;

cin>>officephone;

cin>>homephone;

cin>>mobilephone;

cin>>email;

p->SetName(name);

p->SetOfficePhone(officephone);

p->SetHomePhone(homephone);

p->SetMobilePhone(mobilephone);

p->SetEMail(email);

cout<<"修改成功!

修改后的记录为:

\n";

p->Show();

system("pause");

}

else

{

cout<<"未找到您要修改的记录!

\n";

}

}

voidaddfromtxtfile(AddrList&addrlist)//从正文文件中添加数据到库表中

{

cout<<"请输入源文件的文件名(扩展名为txt):

";

charfilename[80];

cin.get();

cin.getline(filename,80);

ifstreamin(filename,ios:

:

in|ios:

:

nocreate);

if(!

in)

{

cout<<"无法打开源文件";return;

}

charna[10],m[15],e[20];

into,h;

Node*p;

while(!

in.eof())

{

in>>na>>o>>h>>m>>e;

p=newNode(na,o,h,m,e);

addrlist.AddTail(p);

}

in.close();

cout<<"记录从正文文件添加成功!

";

system("pause");

}

voidwritetotxtfile(AddrList&addrlist)//将链表中的数据写入指定的正文文件

{

cout<<"请输入目标文件的文件名(扩展名为txt):

";

charfilename[80];

cin.get();

cin.getline(filename,80);

ofstreamout;

out.open(filename,ios:

:

out|ios:

:

noreplace);

if(!

out)

{

cout<<"创建文件失败!

";

}

else

{

Node*p;

p=addrlist.GetHeadPtr();

while(p)

{

out<Name<<""<OfficePhone<<""<HomePhone<<""<MobilePhone<<""<EMail<<""<

p=p->next;

}

out.close();

cout<<"成功导出正文文件!

";

}

}

voidsort(AddrList&addrlist)//排序库表

{

inttag;

cout<<"请输入您要重新排序的关键字。

选1按姓名排序,选2按办公室电话排序:

\n";

cin>>tag;

if(tag==1||tag==2)

addrlist.Sort(tag);

else

cout<<"您的输入有误!

\n";

}

voidquit(AddrList&addrlist)

{

cout<

****************\n";

cout<

exit(0);

}

voidmain()

{

intchoice=0,state;

AddrListaddrlist;

while(choice!

=9)

{

DisplayMenu();//显示主菜单

cout<<"请输入选择:

1~9\n";

cin>>choice;

state=cin.rdstate();

if(state)//处理非法输入,如输入一个字符是非法的

{

charstr[80];

cin.clear();

cin.getline(str,80);

choice=10;

}

system("cls");

switch(choice)

{

case1:

add(addrlist);break;

case2:

del(addrlist);break;

case3:

showall(addrlist);break;

case4:

query(addrlist);break;

case5:

modify(addrlist);break;

case6:

addfromtxtfile(addrlist);break;

case7:

writetotxtfile(addrlist);break;

case8:

sort(addrlist);break;

case9:

quit(addrlist);break;

default:

;

}

system("cls");

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2