Linux内核链表之共享双链表
生活随笔
收集整理的這篇文章主要介紹了
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内核链表之共享双链表的全部內容,希望文章能夠幫你解決所遇到的問題。