通用雙向鏈表及宏的使用

在看openflow源代碼的時候,發現各種宏定義,以及對鏈表的操作,簡單拿出來一個小例子,供學習使用。

#include <stdio.h>
#include <string.h>
#include <stddef.h>

#define LIST_FOR_EACH_SAFE(ITER, NEXT, STRUCT, MEMBER, LIST)        \
    for (ITER = CONTAINER_OF((LIST)->next, STRUCT, MEMBER);         \
         (NEXT = CONTAINER_OF((ITER)->MEMBER.next, STRUCT, MEMBER), \
          &(ITER)->MEMBER != (LIST));                               \
         ITER = NEXT)

//通過結構體成員變量的指針,得到結構體的指針
#define CONTAINER_OF(POINTER, STRUCT, MEMBER)                           \
        ((STRUCT *) ((char *) (POINTER) - offsetof (STRUCT, MEMBER)))

#define LIST_INITIALIZER(LIST) { LIST, LIST }

struct list
{
	struct list *prev;
	struct list *next;
};

struct Stu
{
	char name[128];
	struct list node;
};

/* List insertion. */
void list_insert(struct list *, struct list *);

int main()
{
	struct list head = LIST_INITIALIZER(&head);
	struct Stu *iter=NULL, *q=NULL;
	phead = &head;
	struct Stu A, B;
	strcpy(A.name, "zhangsan");
	strcpy(B.name, "lisi");

	list_insert(&head, &A.node);
	list_insert(&head, &B.node);

	int i = 0;
//遍歷鏈表
	LIST_FOR_EACH_SAFE(iter, q, struct Stu, node, &head) {
		printf("%d:%s\n", ++i, iter->name);	
	}

	return 0;
}

/* Inserts 'elem' just before 'before'. */
void
list_insert(struct list *before, struct list *elem)
{
  elem->prev = before->prev;
  elem->next = before;
  before->prev->next = elem;
  before->prev = elem;
}

輸出結果: 

zhangsan

lisi

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章