您的位置:首页 > 编程语言 > C语言/C++

C语言模拟C++list

2016-05-18 18:38 330 查看
#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
4000
= 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;
}

随便写写




                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: