這一篇講講雙向鍊錶的其他操作
一.查詢乙個資料
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 ...