#ifndef LISTPOINTER_H #define LISTPOINTER_H //正序 #define LISTBEGIN(Iter, List) \ for (Iter = (List)->Next; Iter != (List); Iter = Iter->Next) //反序 #define LISTRBEGIN(Iter, List) \ for (Iter = (list)->Previous; Iter != (List); Iter = Iter->Previous) //正序 delete and add #define LISTBEGINEACH(Iter, Buff, List) \ for (Iter = (List)->Next, Buff = Iter->Next; Iter != (List); Iter = Buff, Buff = Iter->Next) //获取节点地址 #define LISTSTRUCT(Ptr, Type, Member) \ ((Type *)((char *)(Ptr)-(unsigned long)(&((Type *)0)->Member))) typedef struct _ListPointer { int(*isEmpty)(struct _ListPointer *List); void(*merge)(struct _ListPointer *NewList, struct _ListPointer *AddList); int(*size)(struct _ListPointer *List); void(*insert)(struct _ListPointer *Elem, struct _ListPointer *Previous, struct _ListPointer *Next); void(*push_front)(struct _ListPointer *List, struct _ListPointer *Elem); void(*push_back)(struct _ListPointer *List, struct _ListPointer *Elem); void(*listdelete)(struct _ListPointer *Previous, struct _ListPointer *Next); void(*remove)(struct _ListPointer *Elem); void(*pop_front)(struct _ListPointer *Elem); void(*pop_back)(struct _ListPointer *Elem); void(*resize)(struct _ListPointer *List, int Num); void(*clear)(struct _ListPointer *List); struct _ListPointer *Next, *Previous; }ListPointer,*pListPointer; static int listIsEmpty(pListPointer List) { return List->Next == List; } static void listMerge( pListPointer NewList, pListPointer AddList) { ListPointer *Ptr = NewList->Previous; Ptr->Next = AddList->Next; AddList->Next->Previous = Ptr; NewList->Previous = AddList->Previous; AddList->Previous->Next = NewList; } static int listSize( pListPointer List) { int Count = 0; ListPointer *Ptr = List->Next; while ((Ptr = Ptr->Next) != List) Count++; return Count; } static void listInsert( pListPointer Elem, pListPointer Previous, pListPointer Next) { Previous->Next = Next->Previous = Elem; Elem->Next = Next; Elem->Previous = Previous; } static void listPush_front( pListPointer List, pListPointer Elem) { listInsert(Elem, List, List->Next); } static void listPush_back( pListPointer List, pListPointer Elem) { listInsert(Elem, List->Previous, List); } static void listdelete( pListPointer Previous, pListPointer Next) { Previous->Next = Next; Next->Previous = Previous; } static void listRemove( pListPointer Elem) { listdelete(Elem->Previous, Elem->Next); } static void listPop_front( pListPointer Elem) { if (listIsEmpty(Elem)) return; listdelete(Elem->Previous, Elem->Next); } static void listPop_back( pListPointer Elem) { if (listIsEmpty(Elem)) return; listdelete(Elem->Previous->Previous, Elem); } static void listResize( pListPointer List, int Num) { if (Num >= listSize(List)) return; pListPointer Ptr = List->Next; while (Num--)Ptr = Ptr->Next; listdelete(Ptr, List); } static void listClear( pListPointer List) { List->Previous = List->Next = List; } static void listInit( pListPointer List) { List->isEmpty = listIsEmpty; List->merge = listMerge; List->size = listSize; List->insert = listInsert; List->push_front = listPush_front; List->push_back = listPush_back; List->listdelete = listdelete; List->remove = listRemove; List->pop_front = listPop_front; List->pop_back = listPop_back; List->resize = listResize; List->clear = listClear; listClear(List); } #endif // LISTPOINTER_H
#include <stdio.h> #include <stdlib.h> #include <time.h> #include "listpointer.h" struct List { int SerialNumber; int num; ListPointer Pointr; }; int main() { List list,*tmp; srand(unsigned(time(NULL))); listInit(&list.Pointr); for (int i = 0; i < 10; i++) { tmp = (List*)malloc(sizeof(List)); tmp->SerialNumber = i; tmp->num = rand(); list.Pointr.push_back(&list.Pointr, &tmp->Pointr); tmp = NULL; free(tmp); } List *p; ListPointer *iter; LISTBEGIN(iter, &list.Pointr) { p = LISTSTRUCT(iter, struct List, Pointr); printf("%d:%d\n", p->SerialNumber,p->num); } printf("size:%d", list.Pointr.size(&list.Pointr)); system("pause"); return 0; } 随便写写
C语言模拟C++list
最新推荐文章于 2022-07-14 14:42:48 发布