日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内核链表之共享双链表

發布時間:2025/3/21 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内核链表之共享双链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

說明

共享雙鏈表意義在于,可以用一套函數維護不同數據類型的雙鏈表

準備

定義雙鏈表

#include <iostream> #include <string>using namespace std;//此處并不包含數據域,僅有指針域用于連接結點 typedef struct _DbLinkList {struct _DbLinkList *next;struct _DbLinkList *prev; }DbLinkList;

定義結構體

//定義數據類型,并掛載雙鏈表的指針 struct num {int data;DbLinkList node; //此處不用指針,以保證在為該結構體分配內存時同時為雙鏈表分配 };struct str {string data;DbLinkList node; //此處不用指針,以保證在為該結構體分配內存時同時為雙鏈表分配 };

操作

初始化

//因為在保存數據的結構體中未用雙鏈表的指針,所以此處L使用引用而非引用類型的指針 bool initList(DbLinkList &L) {L.next = NULL;L.prev = NULL;return true; }

尾插法

bool insertBack(DbLinkList &L, DbLinkList &node) {DbLinkList *p = &L;while(p->next) p = p->next;node.next = NULL;p->next = &node;node.prev = p;return true; }

實際操作

對于struct num

main函數

int main() {num *N = new num;N->data = -1;initList(N->node);//尾插法num *n = new num;n->data = 2;insertBack(N->node, n->node);//用鏈表訪問結點的數據DbLinkList *p = &(N->node);while(p){//獲取在結構體中node距離結構體頂點的距離int offset = offsetof(num, node);/** data地址 = 結構體底地址 - node距離結構體頂點的距離* 但指針不能直接加減,所以要先轉化為size_t類型,得到結果后再轉為指針類型*/num *tmp = (num *)((size_t)p - offset);cout << "NUM:" << tmp->data << endl;p = p->next;}return 0; }

輸出結果

NUM:-1 NUM:2

對于struct str

同理

main函數

int main() {str *S = new str;S->data = "hello,world";initList(S->node);//尾插法str *s = new str;s->data = "你好,世界";insertBack(S->node, s->node);//用鏈表訪問結點的數據DbLinkList *p = &(S->node);while(p){//獲取在結構體中node距離結構體頂點的距離int offset = offsetof(str, node);/** data地址 = 結構體底地址 - node距離結構體頂點的距離* 但指針不能直接加減,所以要先轉化為size_t類型,得到結果后再轉為指針類型*/str *tmp = (str *)((size_t)p - offset);cout << "STR:" << tmp->data << endl;p = p->next;}return 0; }

輸出結果

STR:hello,world STR:你好,世界

(注意:本文沒有做雙鏈表的銷毀操作,雖然程序可以正常運行但這樣做是不可取的)

思考

能不能將不同類型的結構體都放在一個雙鏈表上?

如果能該怎么讀取數據?

總結

以上是生活随笔為你收集整理的Linux内核链表之共享双链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。