C语言模拟C++list

#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;
}

随便写写





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值