C++开发双向链表类CList

1.头文件

//头文件 List.h
#pragma once
typedef int DATA;
struct SNode
{
	DATA data;
	SNode *pPrev, *pNext;
};
typedef void* POSITION;
class CList
{
	SNode *m_pHead, *m_pTail;
	int m_count;
public:
	CList();
	~CList();
	//获取链表头指针
	POSITION GetHeadPosition() const
	{
		return m_pHead;
	}
	//获取链表尾指针
	POSITION GetTailPosition() const
	{
		return m_pTail;
	}
	//获取元素个数
	int GetCount() const
	{ 
		return m_count; 
	}
	//获取指定指针位置的数据
	DATA GetAt(POSITION pos) const
	{
		return ((SNode*)pos)->data;
	}
	//判断链表是否为空
	bool IsEmpty() const
	{
		return m_pHead?false:true;
	}
	DATA GetNext(POSITION &pos) const;
	DATA GetPrev(POSITION &pos) const;
	void AddHead(DATA data);
	void AddTail(DATA data);
	void SetAt(POSITION pos, DATA data) const;
	void RemoveAt(POSITION position);
	void RemoveAll();
	DATA RemoveHead();
	DATA RemoveTail();
	POSITION InsertBefore(POSITION position, DATA data);
	POSITION InsertAfter(POSITION position, DATA data);
};

2.源文件

//源文件 List.cpp
#include "List.h"
#include <stdlib.h>

CList::CList()
{
	m_pHead = m_pTail = nullptr;
	m_count = 0;
}
CList::~CList()
{
	RemoveAll();
}
void CList::RemoveAll()
{
	SNode* pos = m_pHead, *p;
	while (pos)
	{
		p = pos;
		pos = pos->pNext;
		delete p;
	}
	m_pHead = NULL;
	m_pTail = NULL;
	m_count = 0;
}
DATA CList::GetNext(POSITION &pos) const
{
	DATA data = ((SNode*)pos)->data;
	pos = ((SNode*)pos)->pNext;
	return data;
}
DATA CList::GetPrev(POSITION &pos) const
{
	DATA data = ((SNode*)pos)->data;
	pos = ((SNode*)pos)->pPrev;
	return data;
}
void CList::AddHead(DATA data)
{
	SNode* pNew = new SNode;
	pNew->data = data;
	pNew->pPrev = NULL;
	pNew->pNext = m_pHead;
	if(m_pHead)
		m_pHead->pPrev = pNew;
	else
		m_pTail = pNew;
	m_pHead = pNew;
	++m_count;
}
void CList::AddTail(DATA data)
{
	if (!m_pHead)
	{
		AddHead(data);
		return;
	}		
	SNode* pNew = new SNode;
	pNew->data = data;
	pNew->pNext = NULL;
	m_pTail->pNext = pNew;
	pNew->pPrev = m_pTail;
	m_pTail = pNew;
	++m_count;
}
void CList::SetAt(POSITION pos, DATA data) const
{
	((SNode*)pos)->data = data;
}
void CList::RemoveAt(POSITION position)
{
	SNode* p = (SNode*)position;
	if (p == m_pHead)
		m_pHead = p->pNext;
	else
		p->pPrev->pNext = p->pNext;
	if (p == m_pTail)
		m_pTail = p->pPrev;
	else
		p->pNext->pPrev = p->pPrev;
	delete p;
	--m_count;
}
DATA CList::RemoveHead()
{
	if (!m_pHead)
		return DATA();
	DATA data = m_pHead->data;
	SNode* p = m_pHead;
	m_pHead = m_pHead->pNext;
	if(m_pHead)
		m_pHead->pPrev = NULL;
	delete p;
	--m_count;
	return data;
}
DATA CList::RemoveTail()
{
	if (!m_pTail)
		return DATA();
	DATA data = m_pTail->data;
	SNode* p = m_pTail;
	m_pTail = m_pTail->pPrev;
	if(m_pTail)
		m_pTail->pNext = NULL;
	delete p;
	--m_count;
	return data;
}
POSITION CList::InsertBefore(POSITION position, DATA data)
{
	if (!m_pHead)
		return NULL;
	if (m_pHead == position)
	{
		AddHead(data);
		return m_pHead;
	}	
	SNode* p = m_pHead;
	while (p)
	{
		if (p == position)
		{
			SNode* pNew = new SNode;
			pNew->data = data;
			pNew->pNext = p;
			p->pPrev->pNext = pNew;
			pNew->pPrev = p->pPrev;
			p->pPrev = pNew;
			++m_count;
			return pNew;
		}
		p = p->pNext;
	}
	return NULL;
}
POSITION CList::InsertAfter(POSITION position, DATA data)
{
	if (!m_pHead)
		return NULL;
	if (m_pTail == position)
	{
		AddTail(data);
		return m_pTail;
	}
	return InsertBefore(((SNode*)position)->pNext, data);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值