Linux内核中循环链表的简单应用
2012-09-13 23:28
267 查看
// 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; }
相关文章推荐
- Linux内核中循环链表的简单应用
- c语言 双向循环链表的简单应用
- 循环链表的简单应用(约瑟夫环问题场景)
- 循环链表的简单应用
- Excel VBA高效办公应用-第六章-客户资料管理-Part2 (简单查询功能的VBA实现及记录单功能)
- Jwt在Java项目中的简单实际应用
- 关于GridView中自定义分页、单选、多选、排序、自增列的简单应用
- Mysql Memory引擎的简单应用
- C语言数据结构二叉树简单应用
- Swift教程第二部分: 一个简单的iOS应用
- BlackICE简单应用
- Unix/Linux C++应用开发-简单的C++程序
- 简单顺序表应用
- 在ASP.NET Atlas中调用Web Service——介绍及简单应用
- 算法之个人总结:Hash表之简单应用
- 简单的数据绑定和ADO.NET的应用
- 多线程简单应用场景
- 多线程程序集变量(防止冲突)简单应用
- TreeView树型控件的简单应用
- NUnit的简单应用和了解