C++实现的双向循环链表类

来源:互联网 发布:海通交易软件 编辑:程序博客网 时间:2024/05/21 20:21

博客第一天
双向链表类

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();}
1 0
原创粉丝点击