当前位置:文档之家› 通讯录 双向链表

通讯录 双向链表

//node.h#include<iostream.h>#include<fstream.h>#include<string.h>#include<stdlib.h>#include<iomanip.h>struct data //数据{char name[20]; //姓名char tel[20]; //电话int age; //年龄};class node //节点{friend class link; //友远类private:data person; //数据node * next;node * pre;public:void show() //显示数据信息{cout<<"姓名:"<<setw(20)<<<<endl;cout<<"电话:"<<setw(20)<<person.tel<<endl;cout<<"年龄:"<<setw(3)<<person.age<<endl<<endl;}node(char*name0="",char*tel0="",int age0=0) //构造函数{strcpy(,name0);strcpy(person.tel,tel0);person.age=age0;next=NULL;pre=NULL;}node(node&n) ////拷贝构造{strcpy(,);strcpy(person.tel,n.person.tel);person.age=n.person.age;}};class link{ //双向链表node * head; //头指针node * rear; //尾指针node * findbyname(char*name0,node *temp ) //查找姓名返回地址{temp=head;if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return NULL;}node * p=head;while(p){if(strcmp(p->,name0)==0) //已找到return p;p=p->next;}while(temp){if(Cmpstr(temp->,name0)){cout<<endl<<"符合条件的记录,如下:"<<endl;temp->show();}temp=temp->next;}//if(temp)// cout<<"查无此人"<<endl<<endl;//未找到}return temp;}node * findbyname(char*name0) //查找姓名返回地址{if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return NULL;}node * p=head;while(p){if(strcmp(p->,name0)==0) //已找到return p;p=p->next;}if(!p)cout<<"查无此人"<<endl<<endl;return NULL;//未找到}int length() //返回链表长度{if(!head)return 0;node*p;int n=1;p=head;if(p->next){p=p->next;n++;}return n;}node * findbynum(int num) //根据序号查找{int l=length(); //l为总长if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return NULL;}if(num>l) //数据越界{cout<<"通讯录里没有"<<num<<"条信息"<<endl<<endl;return NULL;}node * p=head;while(--num)p=p->next;return p; //返回指针}void change(node*p)//修改对应指针信息{char tel0[20];int age0,cho;cout<<"请输入新的电话号码"<<endl;cin>>tel0;cout<<"请输入新的年龄"<<endl;cin>>age0;cout<<"姓名:"<<p-><<endl;cout<<"原电话号码:"<<setw(20)<<p->person.tel<<endl;cout<<"原年龄:"<<setw(3)<<p->person.age<<endl<<endl;cout<<"新电话号码:"<<setw(20)<<tel0<<endl;cout<<"新年龄:"<<setw(3)<<age0<<endl<<endl;cout<<"1.确认 2.取消"<<endl;cin>>cho;if(cho==1){strcpy(p->person.tel,tel0);p->person.age=age0;cout<<"已修改成功"<<endl;}}void del(node *p) //删除一个节点{if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}if(p==head) //删除头结点{p->next->pre=NULL;head=p->next;delete p;return;}if(p==rear) //删除尾节点{p->pre->next=NULL;rear=p->pre;delete p;return;}p->next->pre=p->pre; //删除中间节点p->pre->next=p->next;delete p;}void delall() //删除整个链表{node*p;while(head){p=head;head=head->next;delete p;}head=rear=NULL;}public:link() //构造函数{head=rear=NULL;}~link(){ //析构函数,同时释放链表空间delall();}node * cinnode() //从键盘输入生成一个节点{char name[20],tel[20];int age;node*p;p=new node;cout<<"请输入姓名"<<endl;cin>>name;cout<<"请输入电话号码"<<endl;cin>>tel;cout<<"请输入年龄"<<endl;cin>>age;*p=node(name,tel,age);return p;}void insert(node *p) //将节点插入链表{node *p1,*p2;if(head==0) //空链表{p->next=0;p->pre=0;head=rear=p;return;}if(strcmp(head->,p->)>0){p->next=head;head->pre=p;p->pre=0;head=p;return;}if(strcmp(rear->,p->)<0){p->pre=rear;rear->next=p;p->next=0;rear=p;return ;}p1=p2=head;while(strcmp(p2->,p->)<0){p1=p2;p2=p2->next;}p->next=p2; //插入链表中间p2->pre=p;p1->next=p;p->pre=p1;}void showfromhead() //从前向后输出链表{if(!head) //空链表cout<<"通讯录无信息"<<endl;else{int c=0;node *p;p=head;while(p){p->show(); //调用函数显示信息p=p->next;c++;//if(c%5==0) //控制每输出 5 个暂停一次//system("pause");}cout<<"所有信息输出完成"<<endl;}}void showfromrear() //从后向前输出链表{if(!rear)cout<<"通讯录无信息"<<endl;else{int c=0;node*p;p=rear;while(p){p->show();p=p->pre;c++;if(c%6==0)system("pause");}cout<<"所有信息输出完成"<<endl;}}void showbyname(node *temp) //根据姓名显示信息{char name[20];cout<<"请输入欲查找的姓名"<<endl;cin>>name;node *p;p=findbyname(name,temp); //查找姓名所对应的指针if(p)p->show();}void changebyname() //根据姓名修改信息{char name[20];cout<<"请输入欲修改的姓名"<<endl;cin>>name;node*p;p=findbyname(name);if(p)change(p);}void delbyname() //根据姓名删除信息{char name[20];if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;cout<<"请输入欲删除的姓名"<<endl;cin>>name;node*p;p=findbyname(name);if(p)del(p);cout<<"已删除选定信息"<<endl;}void showbynum() //根据序号显示信息{int num;if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}cout<<"请输入欲查找编号"<<endl;cin>>num;node*p;p=findbynum(num); //根据序号查找指针if(p)p->show();}void delbynum() //根据序号删除信息{int num;if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}cout<<"请输入欲删除编号"<<endl;cin>>num;node*p;p=findbynum(num);if(p)del(p);cout<<"已删除选定信息"<<endl;}void changebynum() //根据序号修改信息{int num;if(!head) //空链表cout<<"通讯录中没有信息"<<endl<<endl;return;}cout<<"请输入欲修改编号"<<endl;cin>>num;node*p;p=findbynum(num);if(p)change(p);}void inputnode()//从文件读入{char filename[30];cout<<"输入数据源文件名"<<endl;cin>>filename;ifstream fin(filename,ios::in|ios::nocreate);if(!fin){cout<<"无法打开指定文件"<<endl;exit(1);}char name[20],tel[20];int age;node *p;while(fin>>name){fin>>tel>>age;p=new node(name,tel,age);insert(p);}fin.close();}void outfromhead() //顺序输出至文件{char filename[30];cout<<"输入数据目标文件名"<<endl;cin>>filename;ofstream fout(filename);if(!fout){cout<<"无法打开指定文件"<<endl;exit(1);}if(!head)fout<<"通讯录无信息"<<endl;else{node*p;p=head;while(p){fout<<"姓名:"<<setw(20)<<p-><<endl;fout<<"电话:"<<setw(20)<<p->person.tel<<endl;fout<<"年龄:"<<setw(3)<<p->person.age<<endl<<endl;;p=p->next;}cout<<"所有信息输出完成"<<endl;}}void outfromrear() //逆序输出至文件{char filename[30];cout<<"输入数据目标文件名"<<endl;cin>>filename;ofstream fout(filename);if(!fout){cout<<"无法打开指定文件"<<endl;exit(1);}if(!rear)fout<<"通讯录无信息"<<endl;else{node*p;p=rear;while(p){fout<<"姓名:"<<setw(20)<<p-><<endl;fout<<"电话:"<<setw(20)<<p->person.tel<<endl;fout<<"年龄:"<<setw(3)<<p->person.age<<endl<<endl;;p=p->pre;}cout<<"所有信息输出完成"<<endl;}}bool Cmpstr(char*name_node,char*name_search)//传统型字符串比较函数,支持通配符*,?及大小写转换,name_node等于name_search时,返回true{if(name_search[0]=='*') //通配符*,通配任意字符串,返回truereturn true;char name1[20],name2[20];//避免改变原结点中的信息strncpy(name1,name_node,20);strncpy(name2,name_search,20);int size1=strlen(name1),size2=strlen(name_search);for(int i=0;i<size2;i++){if(name2[i]>='A'&&name2[i]<='Z')//大写全部转换为小写,以便于比较,人性化处理name2[i]+=32;}for(int i1=0;i1<size1;i1++){if(name1[i1]>='A'&&name1[i1]<='Z')//大写全部转换为小写,以便于比较,人性化处理name1[i1]+=32;}for(int i2=0;i2<size1;i2++){if(name_search[i2]=='*')//通配符*,通配任意字符串,{for(int j=0;j<i2;j++){if(name1[j]!=name2[j])return false;}return true;}}if(size1!=size2)//不等长时,即两字符串不相等,返回false{return false;}for(int i3=0;i3<size1;i3++){if(name2[i3]=='?')//通配符‘?’,通配任一字符continue;if(name1[i3]!=name2[i3])return false;}return true;}};//main.cpp#include "node.h"void main();char buffer[100];void show_data(link &a){char c;cout<<"查看全部数据"<<endl;cout<<"1.顺序 2.逆序"<<endl;cin>>c;if(c=='1'){a.showfromhead();system("pause");cout<<endl<<endl;system("cls");return;}if(c=='2'){a.showfromrear();system("pause");cout<<endl<<endl;system("cls");return;}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void show_data(link &a);return;}};void delet_data(link &a){char c;cout<<"删除数据"<<endl;cout<<"1.根据序号删除数据 2.根据姓名删除数据"<<endl;cin>>c;if(c=='1'){a.delbynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.delbyname();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void delet_data(link &a);}};void insert_data(link &a){cout<<"添加数据"<<endl;a.insert(a.cinnode());system("pause");cout<<endl<<endl;system("cls");};void updata(link &a){char c;cout<<"修改数据"<<endl;cout<<"1.根据序号修改数据 2.根据姓名修改数据"<<endl;cin>>c;if(c=='1'){a.changebynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.changebyname();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void updata(link &a);}};void search_data(link &a){char c;node *temp;cout<<"查找数据"<<endl;cout<<"1.根据序号查找数据 2.根据姓名查找数据(支持*与?的通配)"<<endl;cin>>c;if(c=='1'){a.showbynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.showbyname(temp);system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void search_data(link &a);}};void output_data(link &a){char c;cout<<"将数据输出至文件"<<endl;cout<<"1.升序 2.降序"<<endl;cin>>c;if(c=='1'){a.outfromhead();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.outfromrear();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void output_data(link &a);}};link a;void menu(){char c;cout<<"\t\t 通讯录管理系统"<<endl;cout<<"1.查看全部数据"<<endl;cout<<"2.删除数据"<<endl;cout<<"3.添加数据"<<endl;cout<<"4.修改数据"<<endl;cout<<"5.查找数据"<<endl;cout<<"6.从文件输入数据"<<endl;cout<<"7.将数据输出至文件"<<endl;cout<<"8.退出"<<endl<<endl;cout<<"请输入您需要的功能"<<endl;cin>>c;switch(c){case '1':show_data(a);menu();break;case '2':delet_data(a);menu();break;case '3':insert_data(a);menu();break;case '4':updata(a);menu();break;case '5':search_data(a);menu();break;case '6':cout<<"从文件输入数据"<<endl;a.inputnode();system("pause");cout<<endl<<endl;system("cls");menu();break;case '7':output_data(a);menu();break;case '8':cout<<"谢谢使用"<<endl;return ;default:{cin.clear();cin.getline(buffer,100);cout<<"input error "<<endl;system("pause");system("cls");menu();}}return;}void main() //显示菜单,并调用对应函数{menu();}。

相关主题