//移植linux核心(3.0.13)的鏈表實現進windows下,VS編譯通過。//待全面測試//待增加hlist部分
#include <stdio.h>#include <string.h>#include <stdlib.h>/* transplant linux implement */#define container_of(ptr, type, member) ((type *)( \(PCHAR)(address) - \(ULONG_PTR)(&((type *)0)->field)))/* linux kernel list implementation */typedef int le;typedef struct list_head lh;typedef struct hlist_node hn;struct list_head{lh *next, *prev;};struct hlist_head{hn *first;};struct hlist_node{hn *prev, **pprev;};#define LIST_HEAD_INIT(name) {&(name), &(name)}#define LIST_HEAD(name) lh name = LIST_HEAD_INIT(name)static inline void INIT_LIST_HEAD(lh *list){list->next = list;list->prev = list;}static inline void __list_add(lh *n, lh *prev, lh *next){next->prev = n;prev->next = n;n->next = next;n->prev = prev;}static inline void list_add(lh *n, lh *head){__list_add(n, head, head->next);}static inline void list_add_tail(lh *n, lh *head){__list_add(n, head->prev, head);}static inline void __list_del(lh *prev, lh *next){next->prev = prev;prev->next = next;}static inline void __list_del_entry(lh *entry){__list_del(entry->prev, entry->next);}static inline void list_del(lh *entry){__list_del_entry(entry);}static inline void list_replace(lh *n, lh *old){n->next = old->next;n->prev = old->prev;n->next->prev = n;n->prev->next = n;}static inline void list_replace_init(lh *n, lh *old){list_replace(n, old);INIT_LIST_HEAD(old);}static inline void list_del_init(lh *entry){__list_del_entry(entry);INIT_LIST_HEAD(entry);}static inline void list_move(lh *list, lh *head){__list_del_entry(list);list_add(list, head);}static inline void list_move_tail(lh *list, lh *head){__list_del_entry(list);list_add_tail(list, head);}static inline int list_is_last(lh *list, lh *head){return list->next == head;}static inline int list_empty(const lh *head){return head->next == head;}static inline int list_empty_careful(lh *head){lh *next = head->next;return (next == head) && (next == head->prev);}/* head, head->next互換位置 */static inline void list_rotate_left(lh *head) // {lh *first;if (!list_empty(head)){first = head->next;list_move_tail(first, head);}}/* 判斷list只有頭 */static inline int list_is_singular(lh *head){return !list_empty(head) && (head->next == head->prev);}static inline void __list_cut_position(lh *list, lh *head, lh *entry){lh *new_first = entry->next;list->next = head->next;list->next->prev = list;list->prev = entry;entry->next = list;head->next = new_first;new_first->prev = head;}/* 將head->next到entry間的節點剪下到list中 */static inline void list_cut_position(lh *list,lh *head, lh *entry){if (list_empty(head))return;if (list_is_singular(head) &&(head->next != entry && head != entry))return;if (entry == head)INIT_LIST_HEAD(list);else__list_cut_position(list, head, entry);}static inline void __list_splice(const lh *list,lh *prev,lh *next){lh *first = list->next;lh *last = list->prev;first->prev = prev;prev->next = first;last->next = next;next->prev = last;}/* 將list串連到head後(designed for stacks) 合并list */static inline void list_splice(const lh *list,lh *head){if (!list_empty(list))__list_splice(list, head, head->next);}static inline void list_splice_tail(lh *list,lh *head){if (!list_empty(list))__list_splice(list, head->prev, head);}static inline void list_splice_init(lh *list,lh *head){if (!list_empty(list)) {__list_splice(list, head, head->next);INIT_LIST_HEAD(list);}}static inline void list_splice_tail_init(lh *list,lh *head){if (!list_empty(list)) {__list_splice(list, head->prev, head);INIT_LIST_HEAD(list);}}#define list_entry(ptr, type, member) \container_of(ptr, type, member)#define list_first_entry(ptr, type, member)\list_entry((ptr)->next, type, member)#define list_for_each(pos, head)\for (pos = (head)->next; pos != (head); pos = pos->next)#define __list_for_each(pos, head)\for (pos = (head)->next; pos != (head); pos = pos->next)#define list_for_each_prev(pos, head) \for (pos = (head)->prev; pos != (head); pos = pos->prev)#define list_for_each_safe(pos, n, head) \for (pos = (head)->next, n = pos->next; pos != (head); \pos = n, n = pos->next)#define list_for_each_prev_safe(pos, n, head) \for (pos = (head)->prev, n = pos->prev; \pos != (head); \pos = n, n = pos->prev)#define list_for_each_entry(pos, head, member)\for (pos = list_entry((head)->next, typeof(*pos), member);\&pos->member != (head); \pos = list_entry(pos->member.next, typeof(*pos), member))#define list_for_each_entry_reverse(pos, head, member)\for (pos = list_entry((head)->prev, typeof(*pos), member);\&pos->member != (head); \pos = list_entry(pos->member.prev, typeof(*pos), member))#define list_prepare_entry(pos, head, member) \((pos) ? : list_entry(head, typeof(*pos), member))/* 從pos->next而非head->next開始遍曆list */#define list_for_each_entry_continue(pos, head, member) \for (pos = list_entry(pos->member.next, typeof(*pos), member);\&pos->member != (head);\pos = list_entry(pos->member.next, typeof(*pos), member))#define list_for_each_entry_continue_reverse(pos, head, member)\for (pos = list_entry(pos->member.prev, typeof(*pos), member);\&pos->member != (head);\pos = list_entry(pos->member.prev, typeof(*pos), member))/* 從pos開始遍曆list */#define list_for_each_entry_from(pos, head, member) \for (; &pos->member != (head);\pos = list_entry(pos->member.next, typeof(*pos), member))#define list_for_each_entry_safe(pos, n, head, member)\for (pos = list_entry((head)->next, typeof(*pos), member),\n = list_entry(pos->member.next, typeof(*pos), member);\&pos->member != (head); \pos = n, n = list_entry(n->member.next, typeof(*n), member))#define list_for_each_entry_safe_continue(pos, n, head, member) \for (pos = list_entry(pos->member.next, typeof(*pos), member), \n = list_entry(pos->member.next, typeof(*pos), member);\&pos->member != (head);\pos = n, n = list_entry(n->member.next, typeof(*n), member))#define list_for_each_entry_safe_from(pos, n, head, member) \for (n = list_entry(pos->member.next, typeof(*pos), member);\&pos->member != (head);\pos = n, n = list_entry(n->member.next, typeof(*n), member))#define list_for_each_entry_safe_reverse(pos, n, head, member)\for (pos = list_entry((head)->prev, typeof(*pos), member),\n = list_entry(pos->member.prev, typeof(*pos), member);\&pos->member != (head); \pos = n, n = list_entry(n->member.prev, typeof(*n), member))#define list_safe_reset_next(pos, n, member)\n = list_entry(pos->member.next, typeof(*pos), member)/* end linux kernel list implementation *//* user defination */typedef struct {lh list;le data;}Lnode;int main(){Lnode h;INIT_LIST_HEAD(&h.list);return 0;}