博客第一天
双向链表类
CCircularNode.h
class CCircularNode
{
public:
CCircularNode(CCircularNode &);
CCircularNode()
{
lastNode = this;
nextNode = this;
}
~CCircularNode();
CCircularNode *getNextNode() { return nextNode; }
CCircularNode *getLastNode() { return lastNode; }
static void initialize(CCircularNode *node)
{
node->nextNode = node;
node->lastNode = node;
}
static bool erase(CCircularNode *node);
static CCircularNode *createObject() { return new CCircularNode(); }
bool insertBefore(CCircularNode *node);
bool insertAfter(CCircularNode *node);
virtual void destroy() { delete this; }
protected:
CCircularNode *lastNode, *nextNode;
};
CCircularNode.cpp
#include "CCircularNode.h"
CCircularNode::CCircularNode(CCircularNode &)
{
}
CCircularNode::~CCircularNode()
{
}
bool CCircularNode::erase(CCircularNode *node)
{
if (node->nextNode == node)
return false;
CCircularNode *last = node->lastNode;
last->nextNode = node->nextNode;
CCircularNode *next = node->nextNode;
next->lastNode = node->lastNode;
return true;
}
// 插入头节点前
bool CCircularNode::insertHeaderBefore(CCircularNode *node)
{
if (lastNode == nextNode && lastNode == NULL)
return false;
node->lastNode = lastNode;
node->nextNode = this;
lastNode->nextNode = node;
lastNode = node;
return true;
}
// 插入头节点后
bool CCircularNode::insertHeaderAfter(CCircularNode *node)
{
if( lastNode==nextNode && lastNode==NULL )
return false;
node->lastNode = this;
node->nextNode = nextNode;
nextNode->lastNode = node;
nextNode = node;
return true;
}
最后 如何使用该类
自定义继承自CCircularNode的MyListNode
该类有两个成员变量
class MyListNode : public CCircularNode
{
public:
static MyListNode *createObject()
{
MyListNode* node = new MyListNode();
node->id = count++;
node->name = new char[30];
strcpy(node->name,"MyListNode");
return node;
}
virtual void destroy()
{
// if (name)
delete[] name;
CCircularNode::destroy();
}
int id;
char *name;
static int count;
protected:
MyListNode():CCircularNode() {}
MyListNode(MyListNode &);
};
如何使用呢:
void useCircularList()
{
MyListNode *myNode = MyListNode::createObject();
//初始化一个双向循环链表
MyListNode::initialize(myNode);
int nodeNum = 0;
MyListNode *tmpNode;
for (nodeNum = 0; nodeNum < 10; nodeNum ++)
{
tmpNode = MyListNode::createObject();
//插入头结点后部
myNode->insertHeaderAfter(tmpNode);
//插入头结点前部
// myNode->insertHeaderBefore(tmpNode);
}
//遍历双向循环链表,输出结果
printf("Print List:%d ",myNode->id);
tmpNode = (MyListNode*)myNode->getNextNode();
while(tmpNode!=myNode)
{
// printf("%d ",tmpNode->id);
tmpNode = (MyListNode*)tmpNode->getNextNode();
}
printf("\n");
//释放内存
tmpNode = (MyListNode*)myNode->getNextNode();
//如果MyListNode::erase返回false,说是myNode结点是该双向循环链表中的最后一个结点。
while(MyListNode::erase(myNode))
{
myNode->destroy();
myNode = tmpNode;
tmpNode = (MyListNode*)myNode->getNextNode();
}
myNode->destroy();
}