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
- redis原始碼分析(四)、redis命令學習總結—連結串列ListRedis原始碼
- 深入分析LInux核心連結串列Linux
- C++ STL list連結串列C++
- 鴻蒙核心原始碼分析(雙向連結串列篇) | 誰是核心最重要結構體 ?鴻蒙原始碼結構體
- Linux 核心資料結構:雙向連結串列Linux資料結構
- [CareerCup] 2.4 Partition List 劃分連結串列
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 【小白學演算法】5.連結串列(linked list)、連結串列的新增演算法
- 【LeetCode】 Rotate List 迴圈連結串列LeetCode
- 核心中的連結串列資料結構資料結構
- Redis系列(五):資料結構List雙向連結串列中基本操作操作命令和原始碼解析Redis資料結構原始碼
- 【Python】python連結串列應用原始碼示例Python原始碼
- 演算法與資料結構-連結串列((linked-list)-Java實現單向連結串列演算法資料結構Java
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- 深入分析 Linux作業系統的核心連結串列(轉)Linux作業系統
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- 【資料結構與演算法】——連結串列(Linked List)資料結構演算法
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 【資料結構】連結串列(單連結串列實現+詳解+原碼)資料結構
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- Redis 原始碼解析之通用雙向連結串列(adlist)Redis原始碼
- Linux核心之資料雙連結串列Linux
- 連結串列入門與插入連結串列
- (連結串列)連結串列的排序問題排序
- ConcurrentHashMap1.8原始碼學習之擴容(連結串列結構)HashMap原始碼
- 既然已經有陣列了,為什麼還要連結串列?JS連結串列(Linked-list)詳解陣列JS
- 連結串列
- 演算法與資料結構基礎 - 連結串列(Linked List)演算法資料結構
- 【LeetCode 234_連結串列】Palindrome Linked ListLeetCode
- Linked List Cycle leetcode java (連結串列檢測環)LeetCodeJava
- javascript中的連結串列結構—雙向連結串列JavaScript
- 程式碼隨想錄第3天 | 連結串列 203.移除連結串列元素,707.設計連結串列,206.反轉連結串列
- redis原始碼分析(9)redis原始碼連結串列學習總結 adlist.h adlist.cRedis原始碼