之前发过一个 非插入式的
这里之所以再发一个插入式的,是为了后面实现一个迭代器准备的
将迭代器注册给容器的时候,容器里面单独用了这样一个双链表来管理所有在该容器上注册的迭代器
又因为双链表本身就是容器的一种,出现了容器里面有容器的情况
又不想用指针,指针意味着需要另行分配内存
所以另外再实现了一个双链表,只用来管理容器上所有注册的迭代器
至于链表的插入删除这种操作,跟之前的双链表实际上是完全一样的
只不过之前是链表结点中包含一个放入容器中的OBJ对象
现在改为对于想放入容器中的OBJ对象,需要包含一个链表结点
链表结点中
//插入式的双链表结点
struct Node
{
Node *m_pLast;//上一个结点
Node *m_pNext;//下一个结点
CList *m_pList;//该结点当前从属的链表
};
只包含前后结点和从属链表,不再包含值域
想要放入链表的OBJ对象
class OBJ
{
//other members
Node m_LinkNode
};
这样定义就可以了,所有包含有Node结点的对象,都可以被放入链表,哪怕他们不是同种对象
由于具体实现跟之前的TBDLinkList是一样的,这里就不再放实现的代码了,只放一个头文件
PushTail跟Remove参考之前的代码
#ifndef _CList_h_
#define _CList_h_
#include <windows.h>
class CList;
//插入式的双链表结点
struct Node
{
Node *m_pLast;//上一个结点
Node *m_pNext;//下一个结点
CList *m_pList;//该结点当前从属的链表
void Init()
{
m_pLast = NULL;
m_pNext = NULL;
m_pList = NULL;
}
};
//插入式结点ListNode的双向链表
//该类自己不申请ListNode,只是负责管理ListNode结点
//将其链表化,提供插入、删除功能
//(由于ListNode的插入式特性,ListNode由实际需要被放入容器的对象负责申请)
class CList
{
public:
CList();
~CList();
//初始化\清空链表
void Init();
//将node加入到链表尾
//放入结点时将对node的m_pList赋值this
//成功返回true
//node本身已经有从属链表(m_pList不为NULL)返回false
bool PushTail(Node& node);
//在链表中断开node
//断开结点时node的m_pList将被置空
//成功返回true
//结点不属于当前链表返回false
bool Remove(Node& node);
//获取链表头结点
Node *GetHead();
private:
Node *m_pHead;//头指针
Node *m_pTail;//尾指针
};
#endif