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

博客第一天
双向链表类

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();
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值