#include<iostream.h>#include<process.h>#include<fstream.h>#include<stdlib.h>#include<string.h>#include<iomanip.h>class AddrList;class Node{char ID[20];char Name[20];char OfficePhone[20];char HomePhone[20];char MobilePhone[20];char Email[20];Node *Next;public:Node(char* id=0,char *name=0,char* op=0,char* hp=0,char *mp=0,char *email=0,Node *next=NULL){strcpy(ID,id);strcpy(Name,name);strcpy(OfficePhone,op);strcpy(HomePhone,hp);strcpy(MobilePhone,mp);strcpy(Email,email);Next=next;}void Show(){cout<<setw(12)<<ID<<setw(6) <<Name<< setw(12) <<OfficePhone<< setw(12) <<HomePhone<<setw(12)<<MobilePhone<<setw(20)<<Email<<endl;}friend class AddrList;friend void add(AddrList &addrlist);friend void query(AddrList &addrlist);friend void modify(AddrList &addrlist);};class AddrList{Node *HeadPtr;int Tag;public:AddrList(Node *headptr=NULL,Node *tailptr=NULL,int tag=0){ //构造函数,创建空链表,将Tag的值置为1HeadPtr=headptr;Tag=tag;} //将p指向的结点加入到链表尾部void AddSort(char* id,char *name,char* op,char* hp,char *mp,char *email);//将p指向的结点按Tag指定的顺序插入到链表中Node *LookUp(char *name); //按姓名查找结点,返回该结点指针void Delete(char *name);//删除指定姓名的结点int Sort(int); //按tag指定的关键字重新排序int ShowAll() ;//显示全部结点,每10个显示一//取Tag的值//统计链表中结点个数//取首指针~AddrList();//释放链表空间void CreateList(char *filename);//从二进制文件中读入数据,构造链表void WriteToFile(char *filename); //将链表中数据写入指定的二制文件void WriteToTxtFile(char *filename); //将链表写到文本文件中void CreateFromTxt(char *filename);friend void sort(AddrList &addrlist); // 按姓名或办公室电话排序};void AddrList::AddSort(char* id,char *name,char* op,char* hp,char *mp,char *email) //将p指向的结点按Tag指定的顺序插入到链表中{Node *p;p=new Node(id,name,op,hp,mp,email);Node* x1=HeadPtr;Node* x2=x1;if( id){if(HeadPtr){while(x1=x1->Next) {x2=x1;}x2->Next=p;p->Next=NULL;}else HeadPtr=p,p->Next=NULL;}}Node * AddrList::LookUp(char *name) //按姓名查找结点,返回该结点指针{Node* x=HeadPtr;while(x!=NULL && strcmp(x->Name,name)!=0) {x=x->Next;}if(x) {return x;}else return 0;}void AddrList::Delete(char *name) //删除指定姓名的结点{Node* x1=HeadPtr;Node *x2=x1;while(strcmp(x2->Name,name)!=0 && x2!=NULL) {x1=x2;x2=x2->Next;} if(x1!=x2){if(x2){x1->Next=x2->Next;delete x2;cout<<"已删除"<<endl;}else {cout<<"未找到,请确认后再输入"<<endl;}}else {HeadPtr=x1->Next;delete x2;}}int AddrList::Sort(int T_T) //按tag指定的关键字重新排序{switch(T_T){case 1:{Node* x=HeadPtr,*t;if(!HeadPtr) return 0;int m=0,n=0;Node *p[100]={0};while(x) {p[m]=x;m++;x=x->Next;}n=m;int i, j, k;for (i=0; i<n-1; i++){k=i;for (j=i+1; j<n; j++){if(strcmp(p[j]->Name,p[k]->Name)<=0){k=j;}}{t=p[k]; p[k]=p[i]; p[i]=t;}}HeadPtr=p[0];i=0;while(i<m-1){p[i]->Next=p[i+1];i++;}p[i]->Next=NULL;Tag=1;break;}case 2:{Node* x=HeadPtr,*t;if(!HeadPtr) return 0;int m=0,n=0;Node *p[100]={0};while(x) {p[m]=x;m++;x=x->Next;}n=m;int i, j, k;for (i=0; i<n-1; i++){k=i;for (j=i+1; j<n; j++){if(strcmp(p[j]->ID,p[k]->ID)<=0){k=j;}}{t=p[k]; p[k]=p[i]; p[i]=t;}}HeadPtr=p[0];i=0;while(i<m-1){p[i]->Next=p[i+1];i++;}p[i]->Next=NULL;Tag=2;break;} }}int AddrList::ShowAll() //显示全部结点,每10个显示一屏{Node* x=HeadPtr;if(x);else return 0;int i=1;while(1){cout << setw(12)<<"学号"<<setw(6) <<"姓名"<< setw(12) <<"办公电话"<< setw(12) <<"家庭电话"<<setw(12)<< "移动电话"<<setw(20)<<"电子邮件"<<endl;while(i<=10){x->Show();i++;if(x=x->Next);else break;}system("pause");i=1;if(x);else break;}}AddrList::~AddrList() //释放链表空间{Node *x1=HeadPtr;Node *x2=x1;while(x2=x2->Next){delete x1;x1=x2;}delete x2;}void AddrList::CreateList(char *filename) //从二进制文件中读入数据,构造链表{char a[30]={0},b[30]={0},c[30]={0},d[30]={0},e[30]={0},f[30]={0};ifstream in(filename,ios::binary);while(in>>a){in>>b>>c>>d>>e>>f;AddSort(a,b,c,d,e,f);}in.close();}void AddrList::CreateFromTxt(char *filename) //从文本文件中读入数据,构造链表{char a[30],b[30],c[30],d[30],e[30],f[30];ifstream in(filename);while(in>>a){in>>b>>c>>d>>e>>f;AddSort(a,b,c,d,e,f);}}void AddrList::WriteToFile(char *filename) //将链表中数据写入指定的二进制文件{Node *p=HeadPtr;ofstream out(filename,ios::binary);out<<p->ID<<" ";out<<p->Name<<" ";out<<p->OfficePhone<<" ";out<<p->HomePhone<<" ";out<<p->MobilePhone<<" ";out<<p->Email<<" ";while(p=p->Next){out<<p->ID<<" ";out<<p->Name<<" ";out<<p->OfficePhone<<" ";out<<p->HomePhone<<" ";out<<p->MobilePhone<<" ";out<<p->Email<<" ";}out.close();}void AddrList::WriteToTxtFile(char *filename) //将链表写到文本文件中{Node *x=HeadPtr;ofstream out(filename);out << setw(12)<<"学号"<<setw(6) <<"姓名"<< setw(12) <<"办公电话"<< setw(12) <<"家庭电话"<<setw(12)<< "移动电话"<<setw(20)<<"E-mail"<<endl;out<<setw(12)<<x->ID<<setw(6) <<x->Name<< setw(12) <<x->OfficePhone<< setw(12) <<x->HomePhone<<setw(12)<<x->MobilePhone<<setw(20)<<x->Email<<endl;while(x=x->Next){out<<setw(12)<<x->ID<<setw(12) <<x->Name<< setw(12) <<x->OfficePhone<< setw(12) <<x->HomePhone<<setw(12)<<x->MobilePhone<<setw(12)<<x->Email<<endl;}out.close();}void DisplayMenu() //显示菜单{int i;char *menu[]={ " "," "," "," "," ***********小巧通讯录管理系统************* "," "," 1. 新增一个联系人"," 2. 删除一个联系人"," 3. 显示所有联系人"," 4. 查找联系人"," 5. 更改联系人记录"," 6. 从TXT文档中增加记录"," 7. 导出联系人到Txt文档"," 8. 排序"," 9. 退出"," ","****************************************** "," "" ^_^ 欢迎使用^_^" ,NULL } ;system("cls");for(i=0;menu[i];i++)cout << menu[i]<<endl;cout<< "请选择(1--9) :";}void add(AddrList &addrlist) //按当前Tag标志插入结点,插入结点后,链表仍然保持升序{system("cls");char a[30],b[30],c[30],d[30],e[30],f[30];cout<<" 添加记录"<<endl<<" **************************************"<<endl<<" 请输入一个联系人数据"<<endl;cout << "学号"<<setw(6) <<"姓名"<< setw(12) <<"办公电话"<< setw(12) <<"家庭电话"<<setw(12)<< "移动电话"<<setw(20)<<"电子邮件"<<endl;cin>>a>>b>>c>>d>>e>>f;addrlist.AddSort(a,b,c,d,e,f);cout<<"添加完成"<<endl;system("pause");}void del(AddrList &addrlist) //删除一个结点{system("cls");char p[30];cout<<" 删除记录"<<endl<<" **************************************"<<endl<<" 请输入一个联系人的姓名"<<endl;cin>>p;addrlist.Delete(p);cout<<"删除完成"<<endl;system("pause");}void showall(AddrList &addrlist) //显示所有结点{system("cls");cout<<" 显示所有联系人"<<endl<<" **************************************"<<endl;if(addrlist.ShowAll()) ;else cout<<"空记录!"<<endl;system("pause");}void query(AddrList &addrlist) //按姓名查找一个结点{system("cls");char name[30];Node *p;cout<<" 查找联系人"<<endl<<" **************************************"<<endl<<" 请输入一个联系人的姓名"<<endl;cin>>name;if(p=addrlist.LookUp(name)){cout<< setw(12)<<"学号"<<setw(6) <<"姓名"<< setw(12) <<"办公电话"<< setw(12) <<"家庭电话"<<setw(12)<< "移动电话"<<setw(20)<<"电子邮件"<<endl<<setw(12)<<p->ID<<setw(6) <<p->Name<< setw(12) <<p->OfficePhone<< setw(12) <<p->HomePhone<<setw(12)<<p->MobilePhone<<setw(12)<<p->Email<<endl;}else cout<<"未找到"<<endl;system("pause");}void modify(AddrList &addrlist) //修改一个结点{system("cls");char name[30];Node *p;cout<<" 修改联系人"<<endl<<" **************************************"<<endl<<" 请输入一个联系人的姓名"<<endl;cin>>name;if(p=addrlist.LookUp(name)){cout<<"请输入修改后的联系人"<<endl;cout << "学号"<<setw(6) <<"姓名"<< setw(12) <<"办公电话"<< setw(12) <<"家庭电话"<<setw(12)<< "移动电话"<<setw(20)<<"电子邮件"<<endl;cin>>p->ID>>p->Name>>p->OfficePhone>>p->HomePhone>>p->MobilePhone>>p->Email;cout<<"修改完成"<<endl;}else cout<<"未找到"<<endl;system("pause");}void addfromtxtfile(AddrList &addrlist) //从正文文件增加记录{system("cls");char filename[30];cout<<" 从TXT文档中增加记录"<<endl<<" **************************************"<<endl<<" 请输入要加入的文件名"<<endl;cin>>filename;addrlist.CreateFromTxt(filename);cout<<"载入完成"<<endl;system("pause");}void writetotxtfile(AddrList &addrlist) //将链表写到正文文件中{system("cls");char filename[30];cout<<" 导出联系人到Txt文档"<<endl<<" **************************************"<<endl<<" 请输入要导出的文件名"<<endl;cin>>filename;addrlist.WriteToTxtFile(filename);cout<<"导出完成"<<endl;system("pause");}void sort(AddrList &addrlist) // 按姓名或办公室电话排序{system("cls");int T_T;int choice=0;switch(addrlist.Tag){case 0: {cout<<"此文档未排序"<<endl;break;}case 1: {cout<<"此文档已按"<<"姓名"<<"排序,将按另一种方式排序"<<endl;break;}case 2: {cout<<"此文档已按"<<"学号"<<"排序,将按另一种方式排序"<<endl;break;}}cout<<"请输入排序方式:1.姓名2.学号"<<endl;cin>>T_T;if(addrlist.Sort(T_T))cout<<"已排序"<<endl;else cout<<"空记录!";system("pause");}void quit(AddrList &addrlist) //退出前将链表写入二进制文件中{addrlist.WriteToFile("通讯录数据文件.bin");}void main(){system("color 0A");int choice=0,state;char ch;AddrList addrlist;addrlist.CreateList("通讯录数据文件.bin"); //从二进制文件中读入数据,构建链表while (choice!=9){DisplayMenu(); //显示主菜单cin>>ch;if (ch < '1' || ch > '9') continue;choice=ch-'0';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: quit(addrlist); break;}system("cls");}}。