1. 程式人生 > >C語言資料結構_Linux核心連結串列

C語言資料結構_Linux核心連結串列

C語言資料結構中,可以分為線性資料結構和非線性資料結構,其中線性資料結構非常重要的內容是連結串列,本文章從基本的連結串列過渡到Linux核心連結串列

資料與邏輯結合的連結串列

  什麼是資料與邏輯結合?先回想曾經學過的各種連結串列:
  這裡寫圖片描述
  這裡寫圖片描述
  這裡寫圖片描述 
  這裡寫圖片描述

  可以看出,從最簡單的單向連結串列根據需求不斷改造成雙向迴圈連結串列,目的都是為了使得增刪改查更加快捷,這樣的改動是非常有意義的,但是存在一個非常嚴重的缺陷,程式碼重用率低。觀察到,上述連結串列的”邏輯”和”資料”是繫結在一起的,“邏輯”指向整個資料結構,與整個資料結構有關,換言之,邏輯和資料無法相對獨立,如下圖:
  這裡寫圖片描述


  邏輯和資料無法相對獨立就會出現程式碼重用率低的缺陷,也就是如果你按照上述結構設計一種連結串列,那麼這種連結串列是無法相容不同型別的資料的,也就是不可重新被利用,假如data的型別是int,那麼連結串列的所有增刪改查操作都會圍繞int型別來進行,當需要把型別改為double的時候,所有的增刪改查程式碼都要重新去修改,全部重新修改是非常低效的,換言之,這樣的設計不能相容其他資料型別,只能應用於一種場景。
  

資料與邏輯相對獨立的連結串列

  為了提高程式碼重用率,也就是提高連結串列的通用性,需要把邏輯和資料相對獨立,如下圖:
  這裡寫圖片描述
  相對獨立出資料和邏輯後,可以發現邏輯本身就是連結串列,要讓資料有線性關係,需要把邏輯內嵌在資料中,所以最後的連結串列效果如下圖:
  這裡寫圖片描述


  上述是圖解,比較直觀,下面直接上程式碼,程式碼來自Linux的核心連結串列。
  邏輯(連結串列)

struct list_head {
    struct list_head *next, *prev;
};

  由於邏輯只包含前後驅,所以邏輯中只需要2個指標即可,接下來就是要把邏輯內嵌於資料中。
  內嵌邏輯的資料

typedef struct s_DASTUC
{
  int ds_stus;
  int ds_type;
  struct list_head ds_list;
  int ds_count;          
}

  接下來便是設計的一系列的增刪改查操作,由於邏輯和資料分開,所以增刪改查操作函式只是面對邏輯,與資料無關,於是這些增刪改查函式就會變得通用,至於具體的做法,網上的文章已經描述得非常詳細,這裡只是記下自己的筆記。
  再貼上一張比較重要的筆記圖,就是如何通過連結串列地址計算出大結構的地址:
  這裡寫圖片描述