Linux内核中循环链表的简单应用

来源:互联网 发布:java的jvm 编辑:程序博客网 时间:2024/05/21 10:20

// list_node.h#ifndef _LIST_NODE_H_#define _LIST_NODE_H_#define LIST_NODE_PREV ((void *)0x00100010)#define LIST_NODE_NEXT ((void *)0x00200010)typedef struct _list_node{struct _list_node *prev, *next;}list_node;const void *fake = 0;#define MY_OFFSETOF(type, member) ((size_t) &((type *)fake)->member)#define list_node_entry(ptr, type, member) \(type *)((char *)ptr - MY_OFFSETOF(type, member))#define list_node_for_each_entry(pos, head, type, member) \for (pos = list_node_entry((head)->next, type, member); \&(pos->member) != (head); \pos = list_node_entry((pos->member).next, type, member))#define list_node_for_each_del(pos, head, type, member) \for (pos = list_node_entry((head)->next, type, member); \&(pos->member) != (head); \pos = list_node_entry((head)->next, type, member))#define INIT_LIST_NODE(node) {&(node), &(node)}void _list_node_add(list_node *node, list_node *prev, list_node *next){prev->next = node;node->prev = prev;node->next = next;next->prev = node;}void list_node_add(list_node *node, list_node *head){_list_node_add(node, head, head->next);}void _list_node_del(list_node *prev, list_node *next){prev->next = next;next->prev = prev;}void list_node_del(list_node *node){_list_node_del(node->prev, node->next);node->prev = (list_node *)LIST_NODE_PREV;node->next = (list_node *)LIST_NODE_NEXT;}#endif // TestListNode.h#include <stdlib.h>#include <string.h>#include <stdio.h>#include "list_node.h"typedef struct _string_list{list_node list;char *str;}string_list;int main(int argc, char *argv[]){char *testchar[4] ={"abcdefg","hijklmn","opqrst","uvwxyz"};list_node head = INIT_LIST_NODE(head);int len = 0;for (int i = 0; i < 4; ++i){string_list *pNewStr = (string_list *)malloc(sizeof(string_list));len = strlen(testchar[i]);pNewStr->str = (char *)malloc(len + 1);strcpy(pNewStr->str, testchar[i]);*(pNewStr->str + len) = '\0';list_node_add(&pNewStr->list, &head);}string_list *strnode = NULL;list_node_for_each_entry(strnode, &head, string_list, list){printf("%s\n", strnode->str);}list_node_for_each_del(strnode, &head, string_list, list){list_node_del(&strnode->list);free(strnode->str);free(strnode);}return 1;}


原创粉丝点击