Linux資料結構 雙向鍊錶2(帶頭節點)

2021-08-19 14:08:07 字數 1835 閱讀 1761

這一篇講講雙向鍊錶的其他操作

一.查詢乙個資料

dlinknode* dlinklistfind(dlinknode* head, dlinktype to_find) 

return null;

}

1.指標的合法性判斷

2.空鍊錶判斷

3.遍歷

二.指定位置之前插入乙個節點

void dlinklistinsert(dlinknode* pos, dlinktype value)

思路:修改兩組指標的指向

1.指標合法性判斷

2.建立乙個節點

3.前插

三.指定位置之後插入乙個節點

void dlinklistinsertafter(dlinknode* pos, dlinktype value)

思路:

1.指標合法性判斷

2.建立乙個節點

3.後插

四.刪除指定位置的元素

void dlinklisterase(dlinknode* head,dlinknode* pos)//刪除指定位置的元素  

}return;

}

思路:遍歷

1.兩個指標的合法性判斷

2.空鍊錶判斷

3.遍歷找該位置,找到則刪除(修改一組指標)

五.刪除指定值元素(鍊錶中若有多個相同元素,刪除第乙個)

void dlinklistremove(dlinknode* head,dlinktype value) //刪除指定值的元素  

}return;

}

思路:遍歷

1.指標合法性判斷

2.空鍊錶判斷

3.遍歷查詢值,找到則刪除節點(修改一組指標)

六.刪除指定值元素(鍊錶中若有多個相同元素,刪除所有)

void dlinklistremoveall(dlinknode* head,dlinktype value)//刪除所有相同值得元素 

}return;

}

思路同上乙個一樣,只不過找到乙個相同元素,在迴圈內不要break跳出迴圈就行了。

七.求鍊錶長度

int dlinklistsize(dlinknode* head) //鍊錶長度  

return count;

}

思路:遍歷+計數器

1.指標的合法性判斷

2.空鍊錶判斷

3.定義乙個計數器,遍歷鍊錶,返回計數器的值

所有關於雙向鍊錶的測試**如下:

void testdlinklistpushback()

void testdlinklistpopback()

void testdlinklistpushfront()

void testdlinklistpopfront()

void testdlinklisterase()

void testdlinklistremove()

void testdlinklistremoveall()

void testdlinklistdestory()

void testdlinklistsize()

int main()

測試結果:

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...