通用双向链表

GeneralList.h

#pragma once

#include <stdio.h>

struct GeneralListNode
{
	GeneralListNode* next;
	GeneralListNode* pre;
	void* data;

	GeneralListNode()
	{
		next = NULL;
		pre = NULL;
		data = NULL;
	}

	~GeneralListNode()
	{
		if (NULL != data)
		{
			delete data;
			data = NULL;
		}
	}
};


class GeneralList
{	
public:
	GeneralList();
	~GeneralList();

	GeneralListNode* getHead(); //获取头节点
	GeneralListNode* getTail(); //获取尾节点

	bool push_front(void *data);
	bool push_back(void *data);
	void pop_front();
	void pop_back();
	void clear();

	int count();

private:
	GeneralListNode* m_pHead; //链表头节点
	GeneralListNode* m_pTail; //链表尾节点

	int m_iSize; //节点数
};

GeneralList.cpp

#include "GeneralList.h"

GeneralList::GeneralList()
{
	m_pHead = NULL;
	m_pTail = NULL;
	m_iSize = 0;
}

GeneralList::~GeneralList()
{
	clear();
}

GeneralListNode* GeneralList::getHead()
{
	return m_pHead;
}

GeneralListNode* GeneralList::getTail()
{
	return m_pTail;
}


bool GeneralList::push_front(void *data)
{
	GeneralListNode* pNode = new GeneralListNode;
	if (NULL == pNode)
	{
		return false; //空间申请失败
	}

	pNode->next = m_pHead;
	pNode->pre = NULL;
	pNode->data = data;

	if (0 == m_iSize)
	{
		m_pTail = pNode;
	}
	else
	{
		m_pHead->pre = pNode;
	}
	m_pHead = pNode;
	m_iSize++; //节点数加1

	return true;
}

bool GeneralList::push_back(void* data)
{
	GeneralListNode* pNode = new GeneralListNode;
	if (NULL == pNode)
	{
		return false; //空间申请失败
	}

	pNode->next = NULL;
	pNode->pre = m_pTail;
	pNode->data = data;

	if (0 == m_pTail)
	{
		m_pHead = pNode;
	}
	else
	{
		m_pTail->next = pNode;
	}
	m_pTail = pNode;
	m_iSize++; //节点数加1

	return true;
}

void GeneralList::pop_front()
{
	if ( 0 >= m_iSize)
	{
		return;
	}

	GeneralListNode* pNode = m_pHead;
	if (1 < m_iSize) //剩下多个节点
	{
		m_pHead = m_pHead->next;
		m_pHead->pre = NULL;
	}
	else //只剩下一个节点
	{
		m_pHead = NULL;
		m_pTail = NULL;
	}
	
	delete pNode;
	m_iSize--;
}

void GeneralList::pop_back()
{
	if (0 >= m_iSize)
	{
		return;
	}

	GeneralListNode* pNode = m_pTail;
	if (1 < m_iSize) //剩下多个节点
	{
		m_pTail = m_pTail->pre;
		m_pTail->next = NULL;
	}
	else //只剩下一个节点
	{
		m_pHead = NULL;
		m_pTail = NULL;
	}

	delete pNode;
	m_iSize--;
}

void GeneralList::clear()
{
	while (m_iSize > 0)
	{
		pop_front();
	}
}

int GeneralList::count()
{
	return m_iSize;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值