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

来源:互联网 发布:cloudstack基本网络 编辑:程序博客网 时间:2024/05/01 04:32
#include<iostream>#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 *head = &p0;//函数声明void enter(Directory*);void display_list();void display_menu(Directory*);void key_ramove(string);Directory* find_load(string);Directory* load();int main(){    cout<<"==1.添加==2.删除==3.查找==4.查看通讯录=="<<endl;    int i = 0;    string key;    while(1)    {        cin>>i;        switch(i){        case 1:            load();            cout<<"添加完成!!!"<<endl;            cout<<"==1.添加==2.删除==3.查找==4.查看通讯录=="<<endl;            break;        case 2:            cout<<"请输入名字:";            cin>>key;            key_ramove(key);            cout<<"==1.添加==2.删除==3.查找==4.查看通讯录=="<<endl;            break;        case 3:            cout<<"请输入名字:";            cin>>key;            display_menu(find_load(key));            cout<<"==1.添加==2.删除==3.查找==4.查看通讯录=="<<endl;            break;        case 4:            display_list();            cout<<"==1.添加==2.删除==3.查找==4.查看通讯录=="<<endl;            break;        default:            break;        }    }    return 0;}/*************************************************** 返回类型:Directory** 函数作用:新建节点插入,链表***************************************************/Directory* load(){    Directory *p = new Directory;            //给这个新节点分配空间    enter(p);                                //后面有这个函数的解释    p->next = head->next;                 //p的下一个指向头指针指向节点的下一个    head->next = p;                          //头指针指向节点的下一个指向p    p->prev = head;                       //p的上一个指向头指针指向节点的下一个    head = p;                                //头指针指向p    return p;                                //把这新节点输出}/*************************************************** 返回类型:void* 函数作用:单个节点查找* 传入参数:名字***************************************************/Directory* find_load(string key_name)       //思路和删除一样,找到后打印这个节点就行了{    Directory *p;    p = head;    for(p; p->prev != NULL ;p = p->prev)    {        if(p->Name == key_name )        {            return p;        }    }    return NULL;}/*************************************************** 返回类型:void* 函数作用:单个节点删除* 传入参数:名字***************************************************/void key_ramove(string key_name){    Directory *p;                           //定义结构体类型的指针    p = head;                               //指向当前头指针所指向的节点    for(p; p->prev != NULL ;p = p->prev)    //循环找名字和key_name一样的节点,直到p的的上一个节点为空    {        if(p->Name == key_name )        {            p->prev->next = p->next;        //p的上一个的下一个指向p的下一个            p->next->prev = p->prev;        //p的下一个的上一个指向p的上一个            free(p);                        //释放p的空间        }    }}/*************************************************** 返回类型:void* 函数作用:单个节点输入* 传入参数:Directtory(自己定义的结构体)型指针,***************************************************/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')    {        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 = "中国";        P->STATE = "NULL";    }}/*************************************************** 返回类型:void* 函数作用:打印通讯录(所有人名字,逆序)***************************************************/void display_list(){    Directory *p;   //定义结构体类型的指针    p = head;       // 让p 等于当前head指针所指的节点    int i = 1;      //显示序号    cout<<"=================通讯录================="<<endl;    while(p->prev != NULL)    {        cout<<i<<":     "<<p->Name<<endl;           //打印p指针对应节点的名字        cout<<"   ---------------------------------  "<<endl;        p = p->prev;                                //指针指向上一个节点        i++;    }    cout<<"========================================"<<endl;}/*************************************************** 返回类型 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;    }}
原创粉丝点击