雙鏈表操作

2021-06-28 13:46:20 字數 2170 閱讀 5693

處理完了單鏈表,這次處理雙鏈表。

在乙個雙鏈表中,每個節點都包含兩個指標,指向前乙個節點的指標和指向後乙個節點的指標。這可以使我們以任何方式遍歷雙鏈表,甚至可以忽略前後地在雙鏈表中訪問。下面的圖示展示了乙個雙鏈表:

下面是節點型別的宣告檔案:

double_linked_list_node.h

#ifndef _double_linked_list

#define _double_linked_list

typedef struct nodenode;

#endif

現在,存在兩個根指標:乙個指向鍊錶的第乙個節點,另乙個指向最後乙個節點。這兩個指標允許我們從鍊錶的任何一端開始遍歷鍊錶。

我們可能想把兩個指標分開來宣告為兩個變數。但這樣一來,我們必須把兩個指標都傳遞給插入函式。為根指標宣告乙個完整的節點更方便,只是它的值字段絕不會被使用。在我們的例子中,這個技巧只是浪費了乙個整型值的記憶體空間。對於值欄位非常大的鍊錶,分開宣告兩個指標可能更好一些。另外,我們也可以在根節點的值字段中儲存其他一些關於鍊錶的資訊。例如鍊錶當前包含的節點的數量。

根節點的fwd欄位指向鍊錶的第乙個節點,根節點的fwd欄位指向鍊錶的最後乙個節點。如果鍊錶為空,這兩個欄位都為null。鍊錶第乙個節點的bwd和最後乙個節點的fwd欄位都為null。在乙個有序的鍊錶中,各個節點將根據value欄位的值公升序排列。

當把乙個節點後插入到乙個鍊錶中時,可能出現四種情況:

1.新值可能必須插入到鍊錶的中間位置;

2.新值可能必須插入到鍊錶的起始位置;

3.新值可能必須插入到鍊錶的結束位置;

4.新值可能必須插入到鍊錶的起始位置,又插入到鍊錶的結束位置(即鍊錶為空)

下面是實現**:

dll_ins1.c

#include #include #include "double_linked_list_node.h"

int dll_insert(node *rootp,int value)

newnode=(node *)malloc(sizeof(node));

if(newnode==null)

return -1;

newnode->value=value;

/*把新值新增到鍊錶中*/

if(next!=null)else

} elseelse

} return 1;

}int main()

return 0;

}

一開始,函式是this指向根節點。next指標始終指向this之後的哪乙個節點。它的思路是這兩個指標同步前進,直到新節點應該插入到這兩者之間。for迴圈檢查next所指節點的值,判斷是否到達需要插入的位置。

如果在鍊錶中找到新值,函式就簡單返回。否則,當到達鍊錶尾部或找到適當的插入位置時迴圈終止。在任何一種情況下,新節點都應該插入到this所指的節點後面。注意,在我們決定新值是否應該實際插入到鍊錶之前,並不為它分配記憶體。如果事先分配記憶體,如果發現新值原先已經存在於鍊錶中,就有可能發生記憶體洩露。

上面4種情況是分開實現的。當插入12時。下面這張圖顯示了for迴圈終止之後幾個變數的狀態:

然後,函式為節點分配記憶體,下面幾條語句執行之後

newnode->fwd=next;

this->fwd=newnode;

newnode->bwd=this;

next->bwd=newnode;

就可以將新建立的節點插入鍊錶中。

最後分析一下雙鏈表和單鏈表:

傳遞給單鏈表的函式的引數是指向節點的指標的指標型別(node **),但傳遞給雙鏈表的是指向節點指標的型別(node *),但其實傳遞給雙鏈表的指向節點指標型別裡面還包含著乙個指標,所以它們本質上都是使用的指向節點指標的指標型別。觀察圖可以很清晰地看出這一點。

雙鏈表省去了單鏈表中第三種方法的討論,這是由於雙鏈表中的邊界條件我們直接分開處理了,就好像只討論到了單鏈表中的第二種情況為止,而單鏈表中我們想法設法想將插入到起始位置這種情況和插入到中間這種情況統一到一起,於是出現了單鏈表中第3種處理思路。

雙鏈表基本操作

1.在頭接點插入指定的值 template void insertd dnode front,const t value 2.顯示所有接點數值 template void showd dnode front 3.刪除接點 template void deleted dnode lhs 4。刪除指定資...

雙鏈表基本操作

看歐立奇的 程式設計師面試寶典 的雙向鍊錶部分,發現其中建立雙向鍊錶和刪除鍊錶中得某一點的程式存在問題,現將已經除錯通過的程式貼在下面 include using namespace std define len sizeof dnode typedef struct doublenode dnod...

雙鏈表基本操作

include include using namespace std define null 0 define maxsize 50 struct strlnode void create struct strlnode p,int x 建立雙鏈表 表頭節點 void insertnode str...