雙向鏈表

雙向鏈表是指鏈表中的每個節點都有兩個指針域,一個指向直接前驅節點,一個指向直接後繼節點,定義如下:

typedef struct DoubleNode  
{
    int data;
    struct DoubleNode* pre;
    struct DoubleNode* next;
}DbleList;

下面分別講解對雙向鏈表的創建,插入和刪除操作
1.創建
創建鏈表就是創建一個空的鏈表,首先明確任務爲創建一個鏈表,我們需要做的是,創建一個頭結點head,並將頭結點的next和pre設置爲NULL
如下:
//創建雙向鏈表

DbleList* CreateListNode()
{
    DbleList* pHeader = new DbleList();
    pHeader->data = -1;
    pHeader->pre = NULL;
    pHeader->next = NULL;

    return pHeader;
}

2.插入
鏈表的插入操作是在鏈表中插入一個節點,這裏有兩個方式,第一種方式,直接在鏈表末尾插入節點,第二種方式在指定位置插入節點
第一種方式:需要做的是,找到鏈表的末尾節點,將末尾的節點的next指向我們需要插入的節點pInsert,然後將pInsert的next設置爲NULL,將pInsert的pre指向末尾節點
//在鏈表末尾插入一個節點

int InsertListNode(DbleList* pHeader, DbleList* pInsert)
{
    if(!pHeader || !pInsert)
        return -1;

    //找到尾部節點
    DbleList* pTmp = pHeader;
    while (pTmp->next)
    {
        pTmp = pTmp->next;
    }

    pTmp->next = pInsert;//末尾的節點的next指向我們需要插入的節點pInsert
    pInsert->pre = pTmp;//pInsert的pre指向末尾節點
    pInsert->next = NULL;//pInsert的next設置爲NULL

    return 0;
}

第二種方式:需要做的工作是,找到插入點i的位置節點ptmp,然後將ptmp的next賦值給pInsert的next,ptmp的next的pre賦值爲pInsert,pInsert的pre賦值爲ptmp,ptmp的next賦值爲pInsert
如下:
//在指定位置插入一個節點

int InsertListNode(DbleList* pHeader, DbleList* pInsert, int iPos)
{
    if (!pHeader || !pInsert)
    {
        return -1;
    }
    DbleList* pTmp = pHeader;
    int i = 0;
    while (i++ < iPos && pTmp->next) //找到插入點i的位置節點ptmp
    {
        pTmp = pTmp->next;
    }
    pInsert->next = pTmp->next; //將ptmp的next賦值給pInsert的next
    pInsert->pre = pTmp; //pInsert的pre賦值爲ptmp
    pTmp->next->pre = pInsert; //ptmpnext的pre賦值爲pInsert
    pTmp->next = pInsert; //ptmpnext賦值爲pInsert
    return 0;
}

3.刪除
鏈表的刪除操作爲刪除指定的元素,我們需要知道被刪除節點的位置或者被刪除節點的內容,可以通過節點內容找到對應的節點位置,故只給出刪除對應位置節點的操作
如下:
//刪除指定位置的節點

int DelListNode(DbleList* pHeader, int iPos)
{
    if (!pHeader)
    {
        return -1;
    }
    int i = 0;
    DbleList* pTmp = pHeader;
    while (i++ < iPos && pTmp->next)//找到對應ipos的節點
    {
        pTmp = pTmp->next;
    }

    pTmp->pre->next = pTmp->next; //將pTmp的pre的next指針域賦值爲ptmp->next
    pTmp->next->pre = pTmp->pre;  //將pTmp的next的pre指針域賦值爲pTmp->pre
    delete pTmp; //釋放內存
    pTmp = NULL;

    return 0;
}

ps:水平有限,供參考使用。請大家批評指正,互相學習進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章