zoukankan      html  css  js  c++  java
  • 【 数据结构(C语言)】线性表——双向链表和双向循环链表

    双向链表:每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点

    1.双向链表的基本实现(带头尾指针)

    /**
    **  2017.11.1
    **  Ahthor:799
    **  双向链表
    **
    ***/
    #include <bits/stdc++.h>
    using namespace std;
    #define ElemType  int
    #define Status int
    #define ERROR -1
    #define OK 1
    
    typedef struct LNode
    {
       ElemType data;
       struct  LNode *prev;
       struct  LNode *next;
    };
    typedef struct DLinkList
    {
        int len;
        LNode  *head,*tail;
    };
    void InitLinkList (DLinkList &L)
    {
        L.len = 0;
        L.head = (LNode * )malloc(sizeof(LNode));
        L.tail = (LNode * )malloc(sizeof(LNode));
        L.head->next = L.tail;
        L.head->prev = NULL;
        L.tail->prev = L.head;
        L.tail->next = NULL;
        return ;
    }
    int GetLengthLinkList(DLinkList &L)
    {
        LNode *index = L.head->next;
        int ct = 0;
        while (index != L.tail)
        {
            ct++;
            index = index->next;
        }
        return ct;
    }
    LNode* GetLinkListElem(DLinkList &L,int i)
    {
        LNode *index = L.head;
        int ct = 0;
        while (ct < i)
        {
            ct++;
            index = index->next;
        }
        return index;
    }
    Status InsertLinkList(DLinkList &L,int i,ElemType data)///* 前插入
    {
        if (i <0 || i > GetLengthLinkList(L) + 1) return ERROR;
        LNode *pointer =  GetLinkListElem(L,i);
        LNode *newnode  = (LNode *)malloc(sizeof(LNode)) ;
        newnode->data = data;
        newnode->prev = pointer->prev;
        pointer->prev->next = newnode;
        newnode->next = pointer;
        pointer->prev = newnode;
        L.len++;
        return OK;
    }
    Status DeteleLinkListByPos(DLinkList &L,int i,ElemType &e)/// 按位删除
    {
        LNode *pointer = GetLinkListElem(L,i);
        e = pointer->data;
        pointer->prev->next = pointer->next;
        pointer->next->prev = pointer->prev;
        return OK;
    }
    Status DeteleLinkListByVal(DLinkList &L,ElemType e)/// 按位删除
    {
        LNode *pointer = L.head->next;
        for (;pointer != L.tail; pointer = pointer->next)
        {
            if (pointer->data == e)
            {
                pointer->prev->next = pointer->next;
                pointer->next->prev = pointer->prev;
            }
        }
        return OK;
    }
    void TrverseLinkList(DLinkList &L)
    {
        LNode *index = L.head->next;;
        for (; index != L.tail; index = index->next )
        {
            cout<<index->data<<" ";
        }
        cout<<endl;
    }
    int main()
    {
        int n;
        cin>>n;
    
        DLinkList *Dk = (DLinkList *) malloc(sizeof(DLinkList));
        InitLinkList(*Dk);
        for (int i=1; i <= n; i++)
        {
            int tmp;
            cin>>tmp;
            InsertLinkList(*Dk,i,tmp);
        }
        TrverseLinkList(*Dk);
        int pos,val;
        cin>>val;
        DeteleLinkListByVal(*Dk,val);
        TrverseLinkList(*Dk);
    }
    

     2.双向循环链表(带头结点)

    /**
    **  2017.11.1
    **  Ahthor:799
    **  循环双向链表
    **
    ***/
    #include <bits/stdc++.h>
    using namespace std;
    #define ElemType  int
    #define Status int
    #define ERROR -1
    #define OK 1
    
    typedef struct LNode
    {
       ElemType data;
       struct  LNode *prev;
       struct  LNode *next;
    };
    typedef struct DLinkList
    {
        int len;
        LNode  *head;
    };
    void InitLinkList (DLinkList &L)
    {
        L.len = 0;
        L.head = (LNode * )malloc(sizeof(LNode));
        L.head->next = L.head;
        L.head->prev = L.head;
        return ;
    }
    int GetLengthLinkList(DLinkList &L)
    {
        LNode *index = L.head->next;
        int ct = 0;
        while (index != L.head)
        {
            ct++;
            index = index->next;
        }
        return ct;
    }
    LNode* GetLinkListElem(DLinkList &L,int i)
    {
        LNode *index = L.head;
        int ct = 0;
        while (ct < i)
        {
            ct++;
            index = index->next;
        }
        return index;
    }
    Status InsertLinkList(DLinkList &L,int i,ElemType data)///* 前插入
    {
        if (i <0 || i > GetLengthLinkList(L) + 1) return ERROR;
        LNode *pointer =  GetLinkListElem(L,i);
        LNode *newnode  = (LNode *)malloc(sizeof(LNode)) ;
        newnode->data = data;
        newnode->prev = pointer->prev;
        pointer->prev->next = newnode;
        newnode->next = pointer;
        pointer->prev = newnode;
        L.len++;
        return OK;
    }
    Status DeteleLinkListByPos(DLinkList &L,int i,ElemType &e)/// 按位删除
    {
        LNode *pointer = GetLinkListElem(L,i);
        e = pointer->data;
        pointer->prev->next = pointer->next;
        pointer->next->prev = pointer->prev;
        free(pointer);
        return OK;
    }
    Status DeteleLinkListByVal(DLinkList &L,ElemType e)/// 按位删除
    {
        LNode *pointer = L.head->next;
        for (;pointer != L.head; pointer = pointer->next)
        {
            if (pointer->data == e)
            {
                pointer->prev->next = pointer->next;
                pointer->next->prev = pointer->prev;
                free(pointer);
            }
        }
        return OK;
    }
    void TrverseLinkList(DLinkList &L)
    {
        LNode *index = L.head->next;;
        for (; index != L.head; index = index->next )
        {
            cout<<index->data<<" ";
        }
        cout<<endl;
    }
    int main()
    {
        int n;
        cin>>n;
    
        DLinkList *Dk = (DLinkList *) malloc(sizeof(DLinkList));
        InitLinkList(*Dk);
        for (int i=1; i <= n; i++)
        {
            int tmp;
            cin>>tmp;
            InsertLinkList(*Dk,i,tmp);
        }
        TrverseLinkList(*Dk);
        int pos,val;
        cin>>val;
        DeteleLinkListByVal(*Dk,val);
        TrverseLinkList(*Dk);
    }
    

      

  • 相关阅读:
    指针的学习
    (转)c & c++内存分配
    C++实现String
    c& c++笔试题
    appium python api收集
    公司python入职培训流程
    app端性能测试笔记
    h5 测试关注点
    robot framework 牛刀一试
    adb 安装apk 报错:Failure [INSTALL_FAILED_INVALID_URI]
  • 原文地址:https://www.cnblogs.com/sxy-798013203/p/7775081.html
Copyright © 2011-2022 走看看