雙鏈表就是在單鏈表結點上增添了乙個指標域,指向當前結點的前驅。這樣就可以方便的由其後繼來找到其前驅,而實現輸出終端結點到開始結點的資料序列。
同樣,雙鏈表也分為帶頭結點的雙鏈表和不帶頭結點的雙鏈表,情況類似於單鏈表。帶頭結點的雙鏈表 head->next 為null的時候鍊錶為空。不帶頭結點的雙鏈表head為null的時候鍊錶為空。
void createdlistr (dlnode *&l, int a, int n)
r->next = null;
}
在雙鏈表中查詢第乙個結點值為x的結點。從第乙個結點開始,邊掃瞄邊比較,若找到這樣的結點,則返回結點指標,否則返回null。演算法**如下:
dlnode* finfnode(dlnode *c, int x)
p = p->next;
} return p;
//如果找到則p中內容是結點位址(迴圈因break結束),
//沒找到 p中內容是null(迴圈因p等於null而結束)
//因此這一句可以將題幹中要求的兩種返回值的種情況統一。
}
假設在雙鏈表中p所指的結點之後插入乙個結點s,其操作語句描述為:
s->next = p->next;
s->prior = p;
p->next = s;
s->next->prior = s;
指標變化過程如圖:
如果按照上面的順序來插入,可以看成是乙個萬能的插入方式。先將要插入的結點兩邊鏈結好,可以保證不會發生鏈斷之後找不到結點的情況。設要刪除雙鏈表中p結點的後繼結點,其操作的語句為:
q= p->next;
p->next= q->next;
q->next->prior= p;
free(q);
指標變化過程如圖所示:
只要將單鏈表的最後乙個指標域(空指標)指向鍊錶中第乙個結點即可(這裡之所以說第乙個結點而不說是頭結點是因為,如果迴圈單鏈表是帶頭結點的則最後乙個結點的指標域要指向頭結點;如果迴圈單鏈表不帶頭結點,則最後乙個指標域要指向開始結點)。
帶頭結點的迴圈單鏈表當head等於head->next時煉表為空;
不帶頭結點的迴圈單鏈表當head等於null時煉表為空。
迴圈雙鏈表的構造源自雙鏈表,即將終端結點的nnext指標指向鍊錶中第乙個結點,將鍊錶中第乙個結點的prior指標指向終端結點。
帶頭結點的迴圈雙鏈表當head->next和heaad->prior兩個指標都等於head時煉表為空。
不帶頭結點的迴圈雙鏈表當head等於null的時候為空。
迴圈單鏈表和迴圈雙鏈表由對應的單鏈表和雙鏈表改造而來,只需在終端結點和頭結點間建立聯絡即可。
迴圈單鏈表終端結點的next結點指標指向表頭結點;迴圈雙鏈表終端結點的next指標指向表頭結點,頭結點的prior指標指向表尾結點。
如果p指標沿著迴圈鍊錶行走,判斷p走到表尾結點的條件是p->next == head
。迴圈鍊錶的各種操作均與非迴圈鍊錶類似。
資料結構學習之雙鏈表
原書這部分內容很多,至少相對於迴圈鍊錶是很多。相信當你把單鏈表的指標域搞清楚後,這部分應該難不倒你。現在我的問題是,能不能從單鏈表派生出雙向鍊錶?xml namespace prefix o ns urn schemas microsoft com office office 你可以有幾種做法 一種...
資料結構學習 鍊錶 單鏈表
c語言資料結構之鍊錶 首先呢,開始資料結構中的第乙個部分 線性表 首先我們想到的問題一定是定義乙個結構體變數 定義鍊錶 typedef struct node node 定義好了乙個結構體變數,接下來呢,乙個鍊錶得有個頭,對吧 建立頭節點 node creatheadnode 接下來呢,定義乙個函式...
資料結構 迴圈雙鏈表
include include include 此演算法是構建乙個雙迴圈鍊錶,採用頭插入法,輸入的資料與列印出來的順序相反 typedef struct node linklist node creat list new data x new next l next if l next null 這...