}
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");
}
}