C++双向链表实现简单通讯录分享!

本文实例为大家分享了C++双向链表实现简单通讯录的具体代码,供大家参考,具体内容如下

  #include<iostream>  #include<fstream>  #include <stdlib.h>  #include<string>  using namespace std;      typedef struct Directory     {   string Name;   string Mobile;       string Wechatnumber;     string STREET;       string CITY;       string EIP;        string STATE;         struct Directory* next;     struct Directory* prev;    }Directory;    //头节点初始化  Directory p0 = {"0","0","0","0","0","0","0",NULL,NULL};  Directory pn = {"0","0","0","0","0","0","0",NULL,NULL};    //设置头指针,指向头节点  Directory *head = &p0;    //函数声明  void enter(Directory*);  void display_list();  void printf_a();  void display_menu(Directory*);  int key_ramove(string);  void display_listfiile();  Directory* find_load(string);  Directory* load();    int main()  {   cout<<"========================================"<<endl;   cout<<"=    通 讯 录    ="<<endl;   cout<<"=          ="<<endl;   cout<<"=          ="<<endl;   cout<<"= 1.添加 2.删除 3.查找 4.查看通讯录 ="<<endl;   cout<<"========================================"<<endl;     int i = 0;        //定义按键变量,存放键值   string key;        //定义字符串变量,存放输入的字符串     p0.next = &pn;       //这俩句是初始化头尾节点,头尾节点连起来   pn.prev = &p0;     while(1)   {    cin>>i;        //输入i,用于选择第几个功能    switch(i){       //选择,i等于几,就执行case几    case 1:     load();       //新建节点并插入链表     cout<<endl;     cout<<"添加完成!!!"<<endl;     printf_a();          break;    case 2:     cout<<"请输入免费精选名字大全:";     cin>>key;     key_ramove(key);    //删除节点,就是删除一个人的信息     printf_a();           break;    case 3:     cout<<"请输入免费精选名字大全:";     cin>>key;     display_menu(find_load(key)); //打印找到节点内的信息,find_load(key)为找节点用的遍历函数     printf_a();      /     break;    case 4:     display_list();     //打印所有节点的免费精选名字大全     printf_a();          break;    case 5:     display_listfiile();   //把所有节点的信息输入到"address.txt"文件     break;    default:     break;    }   }   return 0;  }  /**************************************************  * 返回类型:void  * 函数作用:打印菜单    ***************************************************/  void printf_a()  {   cout<<"----------------------------------------"<<endl;   cout<<"- 1.添加 2.删除 3.查找 4.查看通讯录 -"<<endl;   cout<<"- 5.导出txt文档      -"<<endl;   cout<<"----------------------------------------"<<endl;  }  /**************************************************  * 返回类型:Directory*  * 函数作用:新建节点插入,链表   ***************************************************/  Directory* load()  {   Directory *p = new Directory;   //给这个新节点分配空间   enter(p);             p->next = head->next;     //p的下一个指向头指针指向节点的下一个   head->next = p;       //头指针指向节点的下一个指向p   p->prev = head;       //p的上一个指向指针指向节点的下一个   p->next->prev = p;   head = p;        //头指针指向p       return p;          }  /**************************************************  * 返回类型:void  * 函数作用:单个节点查找  * 传入参数:免费精选名字大全     10分  ***************************************************/  Directory* find_load(string key_name)    {   Directory *p;   p = &pn;   for(p; p->prev != NULL ;p = p->prev)   {    if(p->Name == key_name )    {     return p;    }   }   return NULL;  }  /**************************************************  * 返回类型:void  * 函数作用:单个节点删除  * 传入参数:免费精选名字大全    15分  ***************************************************/  int key_ramove(string key_name)  {   Directory *p;       //定义结构体类型的指针   p = &pn;           for(p; p->prev != NULL;p = p->prev)    {    if(p->Name == key_name )       {     head = pn.prev;          p->prev->next = p->next;  //p的上一个的下一个指向p的下一个     p->next->prev = p->prev;  //p的下一个的上一个指向p的上一个     free(p);      //释放p的空间     return 0;      //删除后,退出函数    }   }   cout<<"没有此人!!!!"<<endl;   return 0;  }  /**************************************************  * 返回类型:void  * 函数作用:单个节点输入  * 传入参数:Directtory(自己定义的结构体)型指针, 5分  ***************************************************/  void enter(Directory *P )  {   char jubge;      //用来判断的变量   string name, mobile;     cout<<"输入姓名:";   cin>>name;   P->Name = name;     //把输入的字符串放到,当前指针指向的节点     cout<<"输入电话:";   cin>>mobile;   P->Mobile = mobile;    //把输入的字符串放到,当前指针指向的节点     cout<<"是否完善信息?(Y/N)"<<endl;   cin>>jubge;     if(jubge == 'y' || jubge == 'Y')   {    string wechatnumber;  //微信    string street;    //街道    string city;    //城市    string eip;     //邮编    string state;    //国家    cout<<"微信:";    cin>>wechatnumber;    P->Wechatnumber = wechatnumber;      cout<<"街道:";    cin>>street;    P->STREET = street;      cout<<"城市:";    cin>>city;    P->CITY = city;      cout<<"国家:";    cin>>state;    P->STATE = state;   }else{       //除了输入y以外都会执行这个    P->Wechatnumber = "NULL";      P->STREET = "NULL";      P->CITY = "NULL";      P->STATE = "china";   }  }  /**************************************************  * 返回类型:void  * 函数作用:打印通讯录(所有人免费精选名字大全,逆序)  ***************************************************/  void display_list()  {   Directory *p; //定义结构体类型的指针   p = head;  // 让p 等于当前head指针所指的节点   int i = 1;  //显示序号   cout<<endl;   cout<<"*******************************************"<<endl;   cout<<"    通 讯 录     "<<endl;   cout<<"------------------------------------------"<<endl;   while(p->prev != NULL)            //循环,知道p指向节点的prev指针指向NULL   {    cout<<" "<<i<<":  "<<p->Name<<endl;       //打印p指针对应节点的免费精选名字大全    cout<<"------------------------------------------"<<endl;    p = p->prev;             //指针指向上一个节点    i++;   }   cout<<"*******************************************"<<endl;   cout<<endl;  }  void display_listfiile()  {   Directory *p;         //定义结构体类型的指针   p = &pn;          // 让p 等于当前head指针所指的节点   int i = 1;          //显示序号   ofstream fout("address.txt");     //打开address.txt文件,没有自动创建     while(p->prev != NULL)       //循环,知道p指向节点的prev指针指向NULL   {    fout << i <<":" << p->Name <<endl;   //把当前节点的免费精选名字大全输出到address.txt文件    fout <<" " << p->Mobile <<endl;    fout <<" " << p->Wechatnumber <<endl;    fout <<" " << p->STREET <<endl;    fout <<" " << p->CITY <<endl;    fout <<" " << p->STATE <<endl;    fout <<endl;    p = p->prev;        //指针指向上一个节点    i++;   }   fout.close();         //关闭文件流  }  /**************************************************  * 返回类型 Directory  * 函数作用:打印详细信息  ***************************************************/  void display_menu(Directory *P)  {   if(P == NULL) // 判断 如果P为空,则打印没有这个人   {    cout<<"没有此人!! "<<endl;   }else{   cout<<"* * * * * * * * * * * * * * * * * * * * "<<endl;   cout<<"* 姓名: "<<P->Name<<endl;   cout<<"* 电话: "<<P->Mobile<<endl;   cout<<"* 微信: "<<P->Wechatnumber<<endl;   cout<<"* 街道: "<<P->STREET<<endl;   cout<<"* 城市: "<<P->CITY<<endl;   cout<<"* 国家:"<<P->STATE<<endl;   cout<<"* * * * * * * * * * * * * * * * * * * * "<<endl;   }  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。

—-想了解C++双向链表实现简单通讯录分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/484871.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐