zoukankan      html  css  js  c++  java
  • 循环链表的基本操作

    循环链表与普通链表最大的区别在于尾结点的指针域指向什么:普通链表的尾结点的指针域指向空(NULL),而循环链表的尾结点的指针域指向头结点,形成一个环!

    #include<iostream>
    #include<cstdlib>
    using namespace std;
    
    struct Node{
        int data;
        Node* next;
    };
    typedef Node* LinkList;
    
    //函数声明
    void show();
    void InitList(LinkList &L);
    void DestroyList(LinkList &L);
    void CreateList(LinkList &L,int length);
    void ClearList(LinkList &L);
    bool EmptyList(LinkList L);
    int LengthList(LinkList L);
    int GetElem(LinkList L,int index);
    int LocateElem(LinkList L,int e);
    bool PriorElem(LinkList L,int cur_e,int &pri_e);
    bool NextElem(LinkList L,int cur_e,int &next_e);
    bool InsertList(LinkList &L,int index,int value);
    bool DeleteList(LinkList &L,int index,int &e);
    void Print(LinkList L);
    
    int main(){
        LinkList L;
        int e,index,cur_e,next_e,pri_e,action,length;
        show();
        while(cin>>action){
            switch(action){
                case 1:
                    system("cls");
                    InitList(L);
                    break;
                case 2:
                    system("cls");
                    cout<<"请输入循环链表中的结点个数:"<<endl;
                    cin>>length;
                    CreateList(L,length);
                    cout<<"创建循环链表成功!"<<endl;
                    break;
                case 3:
                    system("cls");
                    if(EmptyList(L)){
                        cout<<"循环链表为空"<<endl;
                    } else {
                        cout<<"循环链表不为空"<<endl;
                    }
                    break;
                case 4:
                    system("cls");
                    cout<<"循环链表的长度为:"<<LengthList(L)<<endl;
                    break;
                case 5:
                    system("cls");
                    cout<<"请输入结点的索引"<<endl;
                    cin>>index;
                    cout<<"第"<<index<<"个结点的值为:"<<GetElem(L,index);
                    break;
                case 6:
                    system("cls");
                    cout<<"请输入结点的值"<<endl;
                    cin>>e;
                    cout<<e<<"的索引为:"<<LocateElem(L,e);
                    break;
                case 7:
                    system("cls");
                    cout<<"请输入结点的值:"<<endl;
                    cin>>e;
                    if(PriorElem(L,e,pri_e)){
                        cout<<e<<"的前驱结点的值为:"<<pri_e<<endl<<endl;
                    } else {
                        cout<<"循环链表中不包含"<<e<<endl;
                    }
                    break;
                case 8:
                    system("cls");
                    cout<<"请输入结点的值:"<<endl;
                    cin>>e;
                    if(NextElem(L,e,next_e)){
                        cout<<e<<"的后继结点的值为:"<<next_e<<endl<<endl;
                    } else {
                        cout<<"循环链表中不包含"<<e<<endl;
                    }
                    break;
                case 9:
                    system("cls");
                    cout<<"请输入插入的位置和所插结点的值:"<<endl;
                    cin>>index>>e;
                    if(InsertList(L,index,e)){
                        cout<<"插入成功"<<endl;
                    } else {
                        cout<<"插入失败"<<endl;
                    }
                    break;
                case 10:
                    system("cls");
                    ClearList(L);
                    cout<<"已清空循环链表"<<endl;
                    break;
                case 11:
                    system("cls");
                    DestroyList(L);
                    cout<<"已销毁循环链表"<<endl;
                    break;
                case 12:
                    system("cls");
                    cout<<"请输入将删除的结点的索引"<<endl;
                    cin>>index;
                    if(DeleteList(L,index,e)){
                        cout<<"第"<<index<<"个元素已经被删除,值为"<<e<<endl<<endl;
                    } else{
                        cout<<"删除失败"<<endl;
                    }
                    break;
                case 13:
                    system("cls");
                    cout<<"循环链表的各结点为:"<<endl;
                    if(!EmptyList(L)){
                        Print(L);
                    } else {
                        cout<<"链表为空"<<endl;
                    }
                    cout<<endl<<endl;
            }
            system("pause");
            system("cls");
            show();
        }
    }
    
    void show(){
        cout<<"+------------------------------------------------+"<<endl;
        cout<<"|                                                |"<<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;
        cout<<"|            9->插入结点                         |"<<endl;
        cout<<"|            10->清空循环链表                    |"<<endl;
        cout<<"|            11->销毁循环链表                    |"<<endl;
        cout<<"|            12->删除结点                        |"<<endl;
        cout<<"|            13->打印循环链表                    |"<<endl;
        cout<<"|                                                |"<<endl;
        cout<<"+------------------------------------------------+"<<endl;
    }
    
    //初始化循环链表
    void InitList(LinkList &L){
        L=new Node;
        if(!L){
            cout<<"初始化失败!"<<endl;
            return;
        }
        L->next=L;
        cout<<"初始化成功!"<<endl;
    }
    
    //创建循环链表
    void CreateList(LinkList &L,int length){
        LinkList p=L,q;
        for(int i=0;i<length;i++){
            q=new Node;
            cin>>q->data;
            p->next=q;
            p=p->next;
        }
        p->next=L;//注意此时与创建单链表有差异,创建单链表,最后一个结点的指针域为null
        //循环链表的末尾指针域指向头结点
    }
    //销毁循环链表
    void DestroyList(LinkList &L){
        LinkList p,q;
        q=L->next;
        while(q!=L){//没到表尾
            p=q->next;
            delete q;
            q=p;
        }
        delete L;
    }
    
    //清空循环链表
    void ClearList(LinkList &L){
        LinkList p,q;
        q=L->next;
        while(q!=L){
            p=q->next;
            delete q;
            q=p;
        }
        //前面一部分与销毁表相同,区别在于销毁表会删除头节点,清空表保留头节点,并使头结点的next指向自己
        L->next=L;
        cout<<"已清空循环链表"<<endl;
    }
    
    //判断是否为空
    bool EmptyList(LinkList L){
        if(L->next==L){
            return true;
        } else {
            return false;
        }
    }
    
    //获取长度
    int LengthList(LinkList L){
        int i=0;
        LinkList p=L->next;
        while(p!=L){
            i++;
            p=p->next;
        }
    
        return i;
    }
    
    //获取第index个结点的值
    int GetElem(LinkList L,int index){
        if(index<0 || index>LengthList(L)){
            cout<<"输入的数值错误"<<endl;
            return 0;
        }
        LinkList p=L->next;
        int j=0;
        while(j<index){
            p=p->next;
            j++;
        }
        return p->data;
    }
    
    //获取结点e的位置
    int LocateElem(LinkList L,int e){
        LinkList p=L->next;
        int index=1;
        while(p!=L){
            if(e==p->data){
                return index;
            }
            index++;
            p=p->next;
        }
        return 0;
    }
    
    //获取当前结点的前一个结点的值
    bool PriorElem(LinkList L,int cur_e,int &pri_e){
        //cur_e不为第一个元素
        LinkList p=L->next,q;//p指向第二个元素
        q=p->next;//q指向p的下一个元素
        while(q!=L){
            if(q->data==cur_e){
                pri_e=p->data;
                return true;
            }
            p=q;
            q=q->next;
        }
        return false;
    }
    
    //获取当前结点的下一个结点的值
    bool NextElem(LinkList L,int cur_e,int &next_e){
        //cur_e不为最后一个元素
        LinkList p=L->next;
        while(p!=L){
            if(p->data==cur_e){
                next_e=p->next->data;
                return true;
            }
            p=p->next;
        }
        return false;
    }
    
    //在第index个位置插入结点
    bool InsertList(LinkList &L,int index,int value){
        if(index<0 || index>LengthList(L)){
            return false;
        }
        LinkList p=L,q;
        int j=1;
        while(p->next!=L && j<index){
            p=p->next;
            j++;
        }
        q=new Node;
        q->data=value;
        q->next=p->next;
        p->next=q;
        return true;
    }
    
    //删除第index个结点
    bool DeleteList(LinkList &L,int index,int &e){
        if(index<0 || index>LengthList(L)){
            return false;
        }
        LinkList p=L,q;
        int j=1;
        while(j<index && p->next!=L){
            p=p->next;
            j++;
        }
        q=p->next;
        e=q->data;
        p->next=q->next;
        delete q;
        return true;
    }
    
    void Print(LinkList L){
        LinkList p=L->next;
        while(p!=L){
            cout<<p->data<<' ';
            p=p->next;
        }
    }
    

      

  • 相关阅读:
    如何解决App无法收到android开机广播
    如何实现开机启动、清缓存、杀进程、悬浮窗口单双击区分,附源码
    WaitForSingleObject 介绍【转】
    C++ Unicode SBCS 函数对照表【转】
    数字IP字符串IP转换
    打印内存【CSDN】
    巧妙的无重复随机数方法
    <unnamedtag>”后面接“int”是非法的
    友元函数与重载运算符【转】
    QT QTableWidget 用法总结【转】
  • 原文地址:https://www.cnblogs.com/-beyond/p/6067544.html
Copyright © 2011-2022 走看看