linux核心原始碼 -- list連結串列
女主宣言
linux kernel裡的很多資料結構都很經典, list連結串列就是其中之一,本文將從以下幾方面介紹list連結串列:list的定義、list提供的操作方法、注意事項、使用例項
PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!
前言
linux kernel裡的很多資料結構都很經典, list連結串列就是其中之一
本篇要介紹的內容:
list的定義
list提供的操作方法
注意事項
使用例項
list連結串列
1 List 所在檔案
List的所有操作可以在 include/linux/list.h找到;
List head的定義可以在 include/linux/types.h找到;
2 定義
實際上這就是一個雙向迴圈連結串列, 且有一個頭指標
list head的定義:
這個定義中只有前向和後向指標,沒任何的資料部分, 那我們基本上就知道了, 它不是被單獨使用的,而是把它嵌入到使用者定義的struct中, 將使用者定義的資料結構串起來,作成list;
思想很巧妙, 對使用者定義的資料結構侵入性很小, 實現了c++中std::List模板的功能;
雖然這個定義是叫head, 但其實嵌入到使用者定義的資料結構中的也是這個.
3 list提供的操作方法
初始化
插入操作
將一個元素插入到兩個元素之間, 即將 new插入到prev和next中, 這個函式是下面在頭部和尾部插入的實現基礎
在頭部插入, 在頭指標和第一個元素間插入
在尾部插入,在最後一個元素間和頭指標間插入, 因為是迴圈連結串列嘛~
刪除操作
刪除兩個元素之間的元素
刪除一個已知元素entry
替換操作
都是指標的變換
移動操作
將一個元素移動到另一個list的頭部
將一個元素移動到另一個list的隊尾
拆分操作
將一個佇列由指定的位置拆成兩個佇列
list是新佇列的head指標, 包括的元素從原head佇列的第一個元素到entry, head佇列僅包括餘下的元素
合併操作
將list列表中除了list本身插入到prev和next之間
將一個列表插入到另一個列表的頭部
將一個列表插入到另一個列表的尾部
list_entry巨集
按之前說的, 這個list_head都有要嵌入到使用者定義的struct中,這個巨集就是由這個list_head ptr來獲取當前所處的struct物件的指標, 用了linux的經典巨集定義 container_of
一堆巨集定義, 用來各種遍歷, 獲取entry
4 注意事項
只說一個,就是多執行緒操作同一個list, 還是需要加鎖
5 使用例項
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2216449/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心連結串列Linux
- Linux核心之資料雙連結串列Linux
- C++ STL list連結串列C++
- 鴻蒙核心原始碼分析(雙向連結串列篇) | 誰是核心最重要結構體 ?鴻蒙原始碼結構體
- 【小白學演算法】5.連結串列(linked list)、連結串列的新增演算法
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 【Python】python連結串列應用原始碼示例Python原始碼
- Redis系列(五):資料結構List雙向連結串列中基本操作操作命令和原始碼解析Redis資料結構原始碼
- 連結串列還會用嗎?用連結串列實現棧(附演算法原始碼)演算法原始碼
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- LeetCode707:設計連結串列 Design Linked ListLeetCode
- 連結串列還會用嗎?用連結串列實現佇列(附演算法原始碼)佇列演算法原始碼
- 【資料結構與演算法】——連結串列(Linked List)資料結構演算法
- Redis 原始碼解析之通用雙向連結串列(adlist)Redis原始碼
- 連結串列 - 單向連結串列
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- ConcurrentHashMap1.8原始碼學習之擴容(連結串列結構)HashMap原始碼
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 既然已經有陣列了,為什麼還要連結串列?JS連結串列(Linked-list)詳解陣列JS
- 連結串列4: 迴圈連結串列
- 連結串列-雙向通用連結串列
- 連結串列-單連結串列實現
- 演算法與資料結構基礎 - 連結串列(Linked List)演算法資料結構
- 程式碼隨想錄第3天 | 連結串列 203.移除連結串列元素,707.設計連結串列,206.反轉連結串列
- Linux核心原始碼目錄Linux原始碼
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode
- [LeetCode Python 3] 876. Middle of the Linked List(連結串列的中間結點)LeetCodePython
- 資料結構-單連結串列、雙連結串列資料結構
- 連結串列
- 《Linux核心完全註釋》學習筆記:2.7 Linux核心原始碼的目錄結構Linux筆記原始碼
- LeetCode-Python-86. 分隔連結串列(連結串列)LeetCodePython
- Linux無系統核心原始碼Linux原始碼