基于类型的链表
2015-07-13 17:40
225 查看
开发中 往往需要 遍历一种类型的所有对象,对此有人用了 工厂类的方式来管理 但是有时候这些类型纯粹只需要遍历而存在 而不需要做查找 因此可以在其创建和销毁调用时 使用静态变量存储成双向链表
以下是C++版本
#define SELF_LINKLIST_DECLARE(TClass)\
static TClass* ms_pHead;\
static TClass* ms_pTail;\
public:\
static TClass* Head()\
{\
return ms_pHead;\
}\
static TClass* Tail()\
{\
return ms_pTail;\
}\
TClass* pPrev;\
TClass* pNext;\
void Insert()\
{\
if (!ms_pTail)\
{\
ms_pTail = this;\
ms_pHead = this;\
pPrev = pNext = NULL;\
return;\
}\
ms_pTail->pNext = this;\
pPrev = ms_pTail;\
ms_pTail = this;\
pNext = NULL;\
}\
void Remove()\
{\
if (ms_pHead == this)\
{\
ms_pHead = pNext;\
return;\
}\
if (ms_pTail == this)\
{\
ms_pTail = pPrev;\
return;\
}\
if (pPrev)\
{\
pPrev->pNext = pNext;\
}\
if (pNext)\
{\
pNext->pPrev = pPrev;\
}\
}
#define SELF_LINKLIST_IMPLEMENT(TClass)\
TClass* TClass::ms_pHead = NULL; \
TClass* TClass::ms_pTail = NULL;
class C1
{
public:
SELF_LINKLIST_DECLARE(C1)
C1()
{
Insert();
}
~C1()
{
Remove();
}
void Func()
{
printf("C1::Func");
}
};
SELF_LINKLIST_IMPLEMENT(C1);
这样就可以使用头指针找到对象的头进行遍历
Unity3D C#版本
public class SelfLinkListObj : MonoBehaviour
{
static SelfLinkListObj ms_HeadRef = null;
static SelfLinkListObj ms_TailRef = null;
static SelfLinkListObj Head
{
get
{
return ms_HeadRef;
}
}
static SelfLinkListObj Tail
{
get
{
return ms_TailRef;
}
}
public SelfLinkListObj PrevRef = null;
public SelfLinkListObj NextRef = null;
void Insert()
{
if (ms_TailRef == null)
{
ms_TailRef = this;
ms_HeadRef = this;
return;
}
ms_TailRef.NextRef = this;
PrevRef = ms_TailRef;
ms_TailRef = this;
}
void Remove()
{
if (ms_HeadRef == this)
{
ms_HeadRef = NextRef;
return;
}
if (ms_TailRef == this)
{
ms_TailRef = PrevRef;
return;
}
if (PrevRef)
{
PrevRef.NextRef = NextRef;
}
if (NextRef)
{
NextRef.PrevRef = PrevRef;
}
}
protected virtual void Awake()
{
Insert();
}
protected virtual void OnDestroy()
{
Remove();
}
}
但是问题来了 C#似乎没法支持宏 只能每次要用拷贝一下 改下名 着实蛋疼...
以下是C++版本
#define SELF_LINKLIST_DECLARE(TClass)\
static TClass* ms_pHead;\
static TClass* ms_pTail;\
public:\
static TClass* Head()\
{\
return ms_pHead;\
}\
static TClass* Tail()\
{\
return ms_pTail;\
}\
TClass* pPrev;\
TClass* pNext;\
void Insert()\
{\
if (!ms_pTail)\
{\
ms_pTail = this;\
ms_pHead = this;\
pPrev = pNext = NULL;\
return;\
}\
ms_pTail->pNext = this;\
pPrev = ms_pTail;\
ms_pTail = this;\
pNext = NULL;\
}\
void Remove()\
{\
if (ms_pHead == this)\
{\
ms_pHead = pNext;\
return;\
}\
if (ms_pTail == this)\
{\
ms_pTail = pPrev;\
return;\
}\
if (pPrev)\
{\
pPrev->pNext = pNext;\
}\
if (pNext)\
{\
pNext->pPrev = pPrev;\
}\
}
#define SELF_LINKLIST_IMPLEMENT(TClass)\
TClass* TClass::ms_pHead = NULL; \
TClass* TClass::ms_pTail = NULL;
class C1
{
public:
SELF_LINKLIST_DECLARE(C1)
C1()
{
Insert();
}
~C1()
{
Remove();
}
void Func()
{
printf("C1::Func");
}
};
SELF_LINKLIST_IMPLEMENT(C1);
这样就可以使用头指针找到对象的头进行遍历
Unity3D C#版本
public class SelfLinkListObj : MonoBehaviour
{
static SelfLinkListObj ms_HeadRef = null;
static SelfLinkListObj ms_TailRef = null;
static SelfLinkListObj Head
{
get
{
return ms_HeadRef;
}
}
static SelfLinkListObj Tail
{
get
{
return ms_TailRef;
}
}
public SelfLinkListObj PrevRef = null;
public SelfLinkListObj NextRef = null;
void Insert()
{
if (ms_TailRef == null)
{
ms_TailRef = this;
ms_HeadRef = this;
return;
}
ms_TailRef.NextRef = this;
PrevRef = ms_TailRef;
ms_TailRef = this;
}
void Remove()
{
if (ms_HeadRef == this)
{
ms_HeadRef = NextRef;
return;
}
if (ms_TailRef == this)
{
ms_TailRef = PrevRef;
return;
}
if (PrevRef)
{
PrevRef.NextRef = NextRef;
}
if (NextRef)
{
NextRef.PrevRef = PrevRef;
}
}
protected virtual void Awake()
{
Insert();
}
protected virtual void OnDestroy()
{
Remove();
}
}
但是问题来了 C#似乎没法支持宏 只能每次要用拷贝一下 改下名 着实蛋疼...
相关文章推荐
- UrlRewriter配置IIS支持伪静态
- android代码实现tint,代码View,Model层设计的思考
- 探秘Java中的String、StringBuilder以及StringBuffer
- ExecutorService与Executors例子的简单剖析
- 解决https无法缓存的问题
- jQuery Ajax 实例 全解析
- 【LeetCode】235 Lowest Common Ancestor of a Binary Search Tree
- 常见.NET功能代码汇总
- css中的关于margin-top,position和z-index的一些bug解决方案
- 【数据结构】深度优先搜索BFS和广度优先搜索DFS
- Ubuntu14.04使用virt-manager创建RHEL6.5镜像
- 定时器Chronometer笔记
- Caffe调参类问题整理
- 欢迎使用CSDN-markdown编辑器
- UIButton上字体的对齐方式
- JAVA实现DAO基本层CRUD操作
- 计算机网络之网络体系结构
- IOS 代码管理工具
- 翻页动画
- DayDayUP_Linux运维学习_SSH 免密码登陆设置