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;
}
随便写写
相关文章推荐
- C语言中结构体偏移及结构体成员变量访问方式的问题讨论
- C语言与ELF机器语言之间的关系
- C++走向远洋——51(数组类运算的实现)
- C++ 每周一些题(4)
- 【干货】国外程序员整理的 C++ 资源大全
- C++序列化方案
- 《C++精英内参之程序员高效指南》-12-1影响效率的不良习惯之打断
- 单链表的逆置
- 《C++精英内参之程序员高效指南》-12影响效率的不良习惯
- 《C++精英内参之程序员高效指南》-11常用的读代码方法除了写注释的,还有其他方法
- 《C++精英内参之程序员高效指南》-10如何快速读透代码
- 《C++精英内参之程序员高效指南》-9如何快速读透一本书1
- C++协程(1):协程原理及实现方式概述
- C++程序编译运行后窗口一闪而过问题
- C++回调
- c++易忘简单知识点
- 详解C++程序中定义struct结构体的方法
- 深入剖析C++中的struct结构体字节对齐
- 一个C++bug引入的许多知识
- C语言实现ping功能(查看设备联网状态)