📄 222.cpp
字号:
//main.cpp
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdlib.h>
#include<ctype.h>
#include"Node.h"
#include"AddrList.h"
#include"main.h"
#include"DisplayMenu.h"
void main()
{
int choice=0,state;
AddrList addrlist;
addrlist.createlist("addrlist.dat");// 从二进制文件中读入数据,构建链表
while(choice!=10)
{
system("cls");
DisplayMenu();
cin>>choice;
state=cin.rdstate();
if(state)//处理非法输入,如输入一个字符是非法的
{ char str[80]; cin.clear();cin.getline(str,80); choice=10;}
switch(choice)
{
case 1: add(addrlist);//增加对象
break;
case 2:
del(addrlist);//删除对象
break;
case 3: showall(addrlist);//显示所有对象
break;
case 4: query(addrlist);//查找对象
break;
case 5: modify(addrlist);//修改对象
break;
case 6: addfromtxtfile(addrlist);
break;
case 7: writetotxtfile(addrlist);
break;
case 8: sort(addrlist);
break;
case 9: rev(addrlist);
break;
case 0: quit(addrlist);
break;
}
}
}
//AddrList.h
void ShowModiMenu()//显示菜单
{ char *submenu[]={"(1) Name","(2) Relation","(3) OfficePhone",
"(4) HomePhone","(5) MobilePhone","(6) EMail", NULL};
cout<<'\n';
for(int i=0; submenu[i]!=NULL; i++) cout<<submenu[i]<<endl;
cout<<"Choice: ";
}
class AddrList//AddrList类
{
Node* headptr;
Node* tailptr;
int tag;
public:
AddrList();
void addtail(Node*p);
void addsort(Node*p);
Node *lookup(char*name);
void modify(char*na);
void Delete(char*name);
void sort(int m);
void showall();
void settag(int t){ tag=t;}
int gettag(){ return tag;}
Node*getheadptri(){return headptr;}
~AddrList();
void char *filename);
void writetofile(char *filename);
};
AddrList::AddrList()//AddrList构造
{ headptr=NULL;
tailptr=NULL;
tag=1;
}
void AddrList::addtail(Node*p)//添加尾链表
{ if(headptr==0)
{ headptr=tailptr=p;
tailptr->next=0;
}
else
{ tailptr->next=p;
tailptr=p;
tailptr->next=0;
}
}
void AddrList::addsort(Node*p)//按指定顺序添加链表
{ if(tag==1)
{ if(headptr==0)
{ headptr=tailptr=p;
tailptr->next=NULL;
return;
}
if(strcmp(headptr->name,p->name)>0)
{ p->next=headptr;
headptr=p;
return;
}
else
{ Node*q,*s;
q=s=headptr;
while(s->next&&(strcmp(s->name,p->name)<0))
{ q=s;s=s->next;}
if(strcmp(s->name,p->name)>=0)
{ p->next=s;
q->next=p;
return;
}
else
{ s->next=p;
tailptr=p;
tailptr->next=NULL;
return;
}
}
}
if(tag==2)
{ if(headptr==0)
{ headptr=tailptr=p;
tailptr->next=NULL;
return;
}
if((headptr->officephone)>(p->officephone))
{ p->next=headptr;
headptr=p;
return;
}
else
{ Node*q,*s;
q=s=headptr;
while(s->next&&((s->officephone)<(p->officephone)))
{ q=s;s=s->next;}
if((s->officephone)>=(p->officephone))
{ p->next=s;
q->next=p;
return;
}
else
{ s->next=p;
tailptr=p;
tailptr->next=NULL;
return;
}
}
}
}
void AddrList::modify(char*na)//修改类对象
{ Node *p;
p=lookup(na);
if(p==0) cout<<"no such record!"<<endl;
else
{
p->show();
ShowModiMenu();
int x;
cin>>x;
switch(x)
{ case 1:
cerr<<"input new name:\t";
char na[20];
cin>>na;
p->setname(na);
break;
case 2:
cerr<<"input new relation:\t";
char re[20];
cin>>re;
p->setrelation(re);
break;
case 3:
cerr<<"input new officephone:\t";
int op;
cin>>op;
p->setofficephone(op);
break;
case 4:
cerr<<"input new homephone:\t";
int hp;
cin>>hp;
p->sethomephone(hp);
break;
case 5:
cerr<<"input new mobilephone:\t";
char mp[20];
cin>>mp;
p->setmobilephone(mp);
break;
case 6:
cerr<<" input new email:\t";
char em[40];
cin>>em;
p->setemail(em);
}
cerr<<"modified successfully!\n";
}
}
Node *AddrList::lookup(char*name)//查找类对象
{ Node*p=headptr;
while(p!=NULL)
{ if(strcmp(p->name,name)==0) return p;
p=p->next;
}
return NULL;
}
void AddrList::Delete(char*name)//删除类对象
{ Node *p1,*p2;
if(headptr==0)
{ cerr<<"No such record!"<<endl;
return;
}
if(strcmp(headptr->name,name)==0)
{ headptr=headptr->next;
cerr<<"deleted!\n";
}
else
{ p1=p2=headptr;
while(p2->next!=NULL&&strcmp(p2->name,name)!=0)
{ p1=p2;p2=p2->next;}
if(strcmp(p2->name,name)==0)
{ p1->next=p2->next;
cerr<<"deleted!"<<endl;
delete p2;
}
else
{
cerr<<"no such record!\n";
p1=NULL;
}
}
}
void AddrList::sort(int m)//按指定顺序排序
{ settag(m);
AddrList newptr; // 本例中新链表对象是局部对象
newptr.tag = tag; //tag为排序依据
Node *p = headptr,*p1,*p2;
while(p!=NULL)
{ p1=new Node;
*p1=*p;
newptr.addsort(p1);
p2=p;
p=p->next;
delete p2;
}
tag=newptr.tag;
headptr=newptr.headptr;
tailptr=newptr.tailptr;
newptr.headptr=NULL; //将新链表置空,如没有置空,
newptr.tailptr=NULL; //则newptr和addrlist是一个表,
//撤消newptr时,将把addrlist表空间释放掉
}
void AddrList::showall()//显示对象
{ Node*p=headptr;
int n=0;
while(p)
{ cout<<(p->name)<<'\t'<<(p->relation)<<'\t'<<(p->officephone)<<'\t'<<(p->homephone)<<'\t'
<<(p->mobilephone)<<'\t'<<(p->email)<<endl;
p=p->next;
n++;
if(n%10==0)
{ system("pause");
system("cls");
}
}
}
AddrList::~AddrList()//AddrList析构函数
{ Node*p1,*p2;
p1=p2=headptr;
while(p2)
{ p1=p2;
p2=p2->next;
delete []p1;
}
}
void AddrList::createlist(char*filename)
{ Node *p;
fstream infile(filename,ios::in|ios::binary);
if(infile.fail())
{ cout<<"can not open this file"<<endl;
cout<<"vacant list has been created!"<<endl;
//exit(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -