通用雙向鍊錶的設計(參考Linux系統中的實現)

2021-09-20 01:10:00 字數 2369 閱讀 5904

通常我們設計設計鍊錶都是將資料域放在裡面,這樣每次需要使用鍊錶的時候都需要實現乙個鍊錶,然後重新實現它的相關操作,這裡參考linux系統中的設計實現了乙個通用的雙向鍊錶,只需要在你的結構裡面有乙個這個鍊錶的域,就可以使用鍊錶的相關操作了。

// list.h

#ifndef _list_h
#define _list_h
typedef struct _list_head  list_head;
#define offsetof(type,member) ( (size_t) &((type*)0)->member )
#define container_of(ptr,type,member) ()
#define list_empty(head) ( head->next==0&&head->prev==0 )
/* get the member of list object
* @ptr        pointer to list_head
* @type    the type of container which contains list_head field
* @memeber field name in the container
* @return    return pointer to the container
*/
#define list_entry(ptr,type,member) container_of(ptr,type,member)
/* add a new node after `head`
*/
void list_add(list_head *head,list_head *node);
/* delete a node
*/
void list_del(list_head *node);
#endif
// list.c

#include "list.h"
/* add a new node after `head`
*/
void list_add(list_head *head,list_head *node)
node->next = head->next;
node->prev = head;
head->next->prev = node;
head->next = node;
}
/* delete a node
*/
void list_del(list_head *node)
// test.c

#include
#include
#include "list.h"
typedef struct _task  task;
#define task_next(t) ( container_of(t->next.next,task,next) )
void task_print(task *t)
void task_foreach(task *head,void (*callback)(task *))
while (p!=head);
}
// use task like a list
void test_list() },
t2=},
t3=},
t4=},
t5=};
list_add(&t1.next,&t2.next);
list_add(&t2.next,&t3.next);
list_add(&t3.next,&t4.next);
list_add(&t4.next,&t5.next);
task_foreach(&t1,task_print);
}
int main(int argc, char *ar**)
編譯執行

gcc test.c list.h list.c -o test
.\test.exe

資料結構 鍊錶 雙向通用鍊錶

目錄參考 節點 非通用鍊錶自理解概念 節點攜帶資訊 襪子 掛在到鉤子的東西 通用鍊錶自理解概念 資訊攜帶節點 襪子 擺到晾衣架圓形框的一截上,使得節點成為襪子的乙個成員指標變數 通用鍊錶與非通用鍊錶的區別 通用鍊錶節點被放到資訊結構體中,通過偏移找到所在的結構體 即是通過偏移找到襪子頭 而非通用鍊錶...

mysql的引雙向鍊錶 雙向鍊錶

public classdoublelinkedlist else 新增至鍊錶尾 paramnode public voidaddlast doublenode node else 按照某屬性的順序新增 paramnode public voidaddbyorder doublenode node ...

通用鍊錶 通用鍊錶的基本使用

1.1雙向鍊錶指標域 從圖中可以看出雙向鍊錶的前向指標指向前乙個結點的首位址,後向指標指向下乙個節點的首位址,並且指標型別相同,且只能指向與自己型別相同的結構體。1.2通用鍊錶指標域 從圖中可以看出通用鍊錶的前向指標指向前乙個結點的指標域的首位址,後向指標指向下乙個節點的指標域的首位址,所以在不同的...