自己的底层代码库(九)——插入式的双链表

之前发过一个 非插入式的


这里之所以再发一个插入式的,是为了后面实现一个迭代器准备的

将迭代器注册给容器的时候,容器里面单独用了这样一个双链表来管理所有在该容器上注册的迭代器

又因为双链表本身就是容器的一种,出现了容器里面有容器的情况

又不想用指针,指针意味着需要另行分配内存

所以另外再实现了一个双链表,只用来管理容器上所有注册的迭代器


至于链表的插入删除这种操作,跟之前的双链表实际上是完全一样的

只不过之前是链表结点中包含一个放入容器中的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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值