C/C++中链表的三种设计方案
1. 一般做法,用具体数据结构封装链表:
- struct Data
- {
- int data;
- struct Data *next;
- };
2. STL的做法:用链表封装具体数据结构:
- struct Data
- {
- int data;
- float f;
- };
- ...
- list<Data*> lData;
- struct List
- {
- void *data;
- struct List *next;
- };
- void addElem(struct List list, void *data);
- ...
-
- struct Data
- {
- int data;
- float f;
- };
- ...
-
- struct Data d;
- d.data = 5;
- d.f = 6.0f;
- List lData;
- addElem(struct List list, (void *)&d );
- ...
3. 用具体数据结构封装通用链表(linux内核的通用做法):
- struct list_head
- {
- struct list_head *next, *prev;
- };
- #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
- #define LIST_HEAD_INIT(ptr) /
- do{(ptr)->next = (ptr); (ptr)->prev = ptr;} while(0)
-
- /* 还为这个链表定义一些通用操作和宏 */
-
- /* 在链表头部head后面插入新元素 */
- list_add(struct list_head *new, struct list_head *head);
-
- /* 从给定的入口将链表entry删除 */
- list_del(struct list_head *entry);
- ...
-
- struct Data
- {
- int data;
- float f;
- struct list_head list;
- };