📄 222.cpp
字号:
}
infile.read((char*)&tag,sizeof(tag));
while(!infile.eof())
{ p=new Node;
infile.read((char*)p,sizeof(Node));
if(infile.eof())break;
else
addsort(p);
}
infile.close();
}
void AddrList::writetofile(char*filename)
{ Node *p=headptr;
fstream outfile(filename,ios::out|ios::binary);
if(outfile.fail())
{ cout<<"can not open this file"<<endl;
exit(1);
}
outfile.write((char*)&tag,sizeof(tag));
while(p)
{ outfile.write((char*)p,sizeof(Node));
p=p->next;
}
outfile.close();
}
void AddrList::reverse()
{ Node *p1,*p2,*p3;
p1=p3=headptr;
p2=p1->next; //指定前后指针
while(p2->next) //循环逆序到尾指针
{ p1=p2;
p2=p2->next;
p1->next=p3;
p3=p1;
}
p2->next=p1;
headptr->next=0; //原头指针变尾指针,next赋空
headptr=p2; //把头指针指向原尾指针
}
}
其中上述函数均是对链表进行操作。
类AddrList具体为:
class AddrList //AddrList类
{
Node* headptr;
Node* tailptr;
int tag;
public:
//成员函数
AddrList(); //构造函数
void addtail(Node*p); //增加尾结点
void addsort(Node*p); //按tag顺序增加结点
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*getheadptr(){return headptr;} //获得头结点
~AddrList(); //析构函数
void createlist(char *filename); //用二进制读入信息
void writetofile(char *filename); //用二进制写入信息
};
//main.h
void add(AddrList&addrlist)//add被调函数
{ char str[]="y";Node *p;
while(strcmp(str,"y")==0)
{ p=new Node;
cout<<"please input
name,relation,officephone,homephone,mobilephone,email"<<endl;
cin>>p->name>>p->relation>>p->officephone>>p->homephone>>p->mobilephone>>p->email;
addrlist.addsort(p);
cout<<"continue to add:y/n\t";
cin>>str;
}
cout<<"add successfully!"<<endl;
system("pause");
}
void del(AddrList&addrlist)//del被调函数
{ char na[20];
cout<<"input the name you want to delete:\t";
cin>>na;
addrlist.Delete(na);
system("pause");
}
void query(AddrList&addrlist)//query被调函数
{ char nam[20];
Node *k;
cout<<"input the name you want to lookup:\t";
cin>>nam;
k=addrlist.lookup(nam);
if(k==0) cerr<<"No record included!\n";
else k->show();
system("pause");
}
void showall(AddrList &addrlist)//showall被调函数
{ addrlist.showall();
system("pause");
}
void modify(AddrList&addrlist)//modify被调函数
{ char t[20];
cout<<"input the name you want to modify:\t";
cin>>t;
addrlist.modify(t);
addrlist.sort(1);
system("pause");
}
void sort(AddrList&addrlist)//sort被调函数
{ int m;
char s[3];
cout<<"tag present value is: "<<addrlist.gettag()<<endl;
cerr<<"modify or not:y/n:\t";
cin>>s;
if(strcmp(s,"y")==0)
{ cout<<"input modified tag value\t";
cin>>m;
addrlist.sort(m);
}
system("pause");
}
void addfromtxtfile(AddrList&addrlist)
{ Node *p;
int Tag;
fstream infile("030530219刘超.txt",ios::in|ios::nocreate);
if(!infile)
{ cout<<"can not open file:030530219刘超.txt"<<endl;
exit(1);
}
infile>>Tag;
addrlist.settag(Tag);
while(!infile.eof())
{ p=new Node;
infile>>p->name>>p->relation>>p->officephone>>p->homephone>>p->mobilephone>>p->email;
if(infile.eof()) break;
else
addrlist.addsort(p);
}
infile.close();
cout<<"read successfully!"<<endl;
system("pause");
}
void writetotxtfile(AddrList&addrlist)
{ ofstream outfile;
outfile.open("030530219刘超.txt");
Node*p=addrlist.getheadptr();
outfile<<addrlist.gettag()<<endl;
while(p)
{ outfile<<p->name<<'\t'<<p->relation<<'\t'<<p->officephone<<'\t'<<p->homephone<<'\t'<<p->mobilephone<<'\t'<<p->email<<endl;
p=p->next;
}
outfile.close();
cout<<"write successfully!"<<endl;
system("pause");
}
void rev(AddrList&addrlist)
{ addrlist.reverse();
cout<<"reverse successfully!"<<endl;
system("pause");
}
void quit(AddrList&addrlist)
{ //Node*p=addrlist.getheadptr();
cout<<"thank you for using this program!"<<endl;
cout<<"exit successfully!"<<endl;
addrlist.writetofile("addrlist.dat");
exit(0);
}
//Node.h
class Node//Node类
{
char name[10];
char relation[10];
int officephone;
int homephone;
char mobilephone[15];
char email[20];
Node *next;//类成员
public:
Node(char*na="刘超",char*r="自己",int o=52117556,
int h=57560662,char*m="13814196034",char*e="lch@163.com.cn");
void show();
void setname(char*);
void setrelation(char*);
void setofficephone(int);
void sethomephone(int);
void setmobilephone(char*);
void setemail(char*);
friend class AddrList;
friend void add(AddrList &addrlist);
friend void writetotxtfile(AddrList&addrlist);
friend void addfromtxtfile(AddrList&addrlist);
friend void quit(AddrList&addrlist);
};
Node::Node(char*na,char*r,int o,int h,char*m,char*e)//Node构造函数
{ strcpy(name,na);
strcpy(relation,r);
officephone=o;
homephone=h;
strcpy(mobilephone,m);
strcpy(email,e);
next=NULL;
}
void Node::show()//Node显示
{ cerr<<name<<'\t'<<relation<<'\t'<<officephone<<"(O)"<<'\t'
<<homephone<<"(H)"<<'\t'<<mobilephone<<"(M)"<<'\t'<<email<<'\n';
}
void Node::setname(char*na)//重置姓名
{ strcpy(name,na);}
void Node::setrelation(char*r)//重置关系
{ strcpy(relation,r);}
void Node::setofficephone(int o)//重置办公室号码
{ officephone=o;}
void Node::sethomephone(int h)//重置家里号码
{ homephone=h;}
void Node::setmobilephone(char*m)//重置手机号码
{ strcpy(mobilephone,m);}
void Node::setemail(char*e)//重置电子邮箱
{ strcpy(email,e);}
}
//DisplayMenu.h
void DisplayMenu()//菜单内容
{ char *menu[]={ " 1. Add Record",
" 2. Delete Record",
" 3. Display All Record",
" 4. Query by Name",
" 5. Modify Record",
" 6. Add from a Text File",
" 7. Write to a Text File",
" 8. Sort",
" 9. Quit",
NULL
};
cout<<"\n\n =====Address Book Managing Syetem===== \n\n";
for(int i=0; menu[i]!=NULL; i++) cout<<menu[i]<<endl;
cout<<"\n======================================= \n";
cout<<"Choice: ";
}
举两个函数分析说明:
分别为sort函数和createlist函数
其一,
Sort 流程图
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); //调用addsort函数排序
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::createlist(char*filename)
{ Node *p; 定义指针Node p;
fstream infile(filename,ios::in|ios::binary);
//建立fstraem对象,并调用构造函数,以二进制方式打开文件
if(infile.fail())
//判断文件是否存在
{ cout<<"can not open this file"<<endl;
cout<<"vacant list has been created!"<<endl;
// 判断为空,建立新链表
}
infile.read((char*)&tag,sizeof(tag));
//读入排序值tag
while(!infile.eof())
//做循环至文件尾部
{ p=new Node; //给p开辟空间
infile.read((char*)p,sizeof(Node));
//读入每个结点信息
if(infile.eof())break;
//如果是文件尾则跳出循环
else addsort(p); //否则调用addsort函数排序
}
infile.close(); //关闭文件
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -