数据结构四双向链表
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數據結點中都有兩個指針,分別指向直接后繼和直接前驅。所以,從雙向鏈表中的任意一個結點開始,都可以很方便地訪問它的前驅結點和后繼結點。而之前的單鏈表為單向鏈表,雙向鏈表也就是在單鏈表的結點中增加一個指向其前驅的pre指針。
????????如圖
????????
????????
??????? 這里介紹雙向鏈表的常用操作:
?????????????? l?創建雙向鏈表
?????????????? l?銷毀雙向鏈表
?????????????? l?清空雙向鏈表
?????????????? l?獲取表長度
?????????????? l?把node插入pos位置
?????????????? l?獲取pos位置的元素
?????????????? l?刪除pos位置的元素
?????????????? l?刪除表中與node相同的元素(刪除第一個匹配成功的)
?????????????? l?重置游標
?????????????? l?返回游標所指向的結點
?????????????? l?游標后移
?????????????? l?游標前移
?
?????????代碼總分為三個文件:
???????????????????? DLinkList.h?:?放置功能函數的聲明,以及表的聲明,表結點的定義?
?????????????????????DLinkList.c?:?放置功能函數的定義,以及表的定義
???????????????????? Main.c????:?主函數,使用功能函數完成各種需求,一般用作測試
??????? 整體結構圖為:
?
????????
????????
????????????? 這里詳細說下插入操作和刪除操作:
?
??????????????插入操作:
??????????????????????? 如圖
?
????????????????????????????????????????
?????????????
????????????? 插入元素方法:
?????????????????????? 判斷表和插入位置是否合法
?????????????????????? 由表頭開始通過next域移動pos次后,當前元素的next域為要插入的位置
????????????????????? ?Current的next域指向node
????????????????????? ?Node的next域指向next
?????????????????????? 判斷是否為尾插,如果不是的話next的pre域指向node
?????????????????????? 判斷是否為頭插,如果是的話node的pre域指向NULL?
????????????????????? 如果之前表為空表,則游標指向插入的結點
??????????????????????表長度加1
??
??????????????刪除操作:
??????????????????????? 如圖
?
?????????????????
????????????? 刪除元素方法:
???????????????????? 判斷表和插入位置是否合法
???????????????????? 由表頭開始通過next域移動pos次后,當前元素的next指向的元素為要刪除的元素
?????????????????????把current的next域指向next
???????????????????? 判斷是否為尾插,如果不是的話,next的pre指針指向current
???????????????????? 如果不是尾插且是頭插的話,next的pre指針指向NULL
???????????????????? 如果刪除的結點正好游標也指向它,則游標后移
???????????????????? 表長度減1
總結
- 上一篇: C语言之函数指针
- 下一篇: Node之HTTPS客户端