双向链表---C++实现

双向链表在类中的实现

#include<stdio.h>
#include<assert.h>
#include<iostream>
using namespace std;

typedef int DataType;

struct Node
{
	Node(const DataType& data)
		: _pNext(NULL)
		, _pPre(NULL)
		, _data(data)
	{}

	Node* _pNext;
	Node* _pPre;
	int _data;
};

class List
{
public:
	explicit List()
		:_pHead(NULL)
		,_pTail(NULL)
		,_size(0)
	{}

	List(const List& l)
	{
		Node* pTemp = l._pHead;
		Node* pNode1 = new Node(pTemp->_data);   //创建一个新节点作为新链表的头节点
		Node* pNewTemp = pNode1;                //创建一个临时变量指针指向新链表的头节点

		_pHead = pNode1;
		size_t ret = l._size;

		while(--ret)                            //循环里创建ret-1个节点
		{
			pTemp = pTemp->_pNext;
			Node* pNode2 = new Node(pTemp->_data);  //复制l链表值为pTemp->_data的节点
			pNewTemp->_pNext = pNode2;             //将新创建的节点与新链表连接起来
			pNode2->_pPre = pNewTemp;
			if(ret != 1)                          //判断是否是最后一个节点,若不是,则临时指针指向下一个节点
			{
				pNewTemp = pNewTemp->_pNext ;
			}
			else                                  //若是最后一个节点,则尾指针指向空
			{
				pNode2->_pNext = NULL;
			}
		}
		_size = l._size;

	}
	List(size_t n, const DataType& data = DataType())
	{
		Node* pNode1 = new Node(data);
		Node* pNewTemp = pNode1;

		_pHead = pNode1;
		size_t ret = n;

		while(--ret)
		{
			Node* pNode2 = new Node(data);
			pNewTemp->_pNext = pNode2;
			pNode2->_pPre = pNewTemp;
			if(ret != 1)
			{
				pNewTemp = pNewTemp->_pNext ;
			}
			else
			{
				pNode2->_pNext = NULL;
			}
		}
		_size = n;
	}


	List& operator=(const List& l)   //与拷贝构造函数类似
	{
		if(this != &l)
		{
			Node* pTemp = l._pHead;
			Node* pNode1 = new Node(pTemp->_data);
			Node* pNewTemp = pNode1;

			_pHead = pNode1;
			size_t ret = l._size;

			while(--ret)
			{
				pTemp = pTemp->_pNext;
				Node* pNode2 = new Node(pTemp->_data);
				pNewTemp->_pNext = pNode2;
				pNode2->_pPre = pNewTemp;
				if(ret != 1)
				{
					pNewTemp = pNewTemp->_pNext ;
				}
				else
				{
					pNode2->_pNext = NULL;
				}
			}
			_size = l._size;
		}
		return *this;
	}


	//Capacity///
	size_t Size()const
	{
		return _size;
	}
	size_t Empty()const
	{
		return (0==_size);
	}

	Acess///
	Node& Front()
	{
		assert(_pHead);
		return *_pHead;
	}
	const Node& Front()const
	{
		assert(_pHead);
		return *_pHead;
	}
	Node& Back()
	{
		assert(_pHead);
		Node* pTemp = _pHead;
		while(--_size)
		{
			pTemp = pTemp->_pNext;
		}
		return *pTemp;
	}
	const Node& Back()const
	{
		assert(_pHead);
		Node* pTemp = _pHead;
		size_t ret = _size;
		while(--ret)
		{
			pTemp = pTemp->_pNext;
		}
		return *pTemp;
	}


	Modify/
	void Assign(size_t n, const DataType& data)
	{
		Node* pTemp = _pHead;
		Node* pNode1 = new Node(data);
		Node* pNewTemp = pNode1;

		_pHead = pNode1;
		size_t ret = n;

		while(--ret)
		{
			pTemp = pTemp->_pNext;
			Node* pNode2 = new Node(data);
			pNewTemp->_pNext = pNode2;
			pNode2->_pPre = pNewTemp;
			if(ret != 1)
			{
				pNewTemp = pNewTemp->_pNext ;
			}
			else
			{
				pNode2->_pNext = NULL;
			}
		}
		_size = n;
	}
	void PushBack(const DataType& data)
	{
		Node* pNewNode = new Node(data);
		if(NULL == _pHead)
		{
			_pHead = pNewNode;
			pNewNode->_pNext = NULL;
			pNewNode->_pPre = _pHead;
			_size = _size+1;
		}
		else
		{
			Node* pTemp = _pHead;
			size_t ret = _size;
			while(--ret)
			{
				pTemp = pTemp->_pNext;
			}
			pTemp->_pNext = pNewNode;
			pNewNode->_pPre = pTemp;
			pNewNode->_pNext = NULL;
			_size = _size+1;
		}
	}
	void PopBack()
	{
		if(NULL == _pHead)//链表不存在
		{
			return;
		}

		if(1 == _size) //只有一个节点
		{
			delete _pHead;
			_pHead = _pTail = NULL;
			_size = 0;
		}
		else //多个节点
		{
			Node* pTemp = _pHead;
			while(pTemp->_pNext)
			{
				pTemp = pTemp->_pNext;
			}
			_pTail = pTemp;
			Node* pTemp1 = _pTail;
			_pTail = _pTail->_pPre;
			_pTail->_pNext = NULL;
			delete pTemp1;
			_size = _size-1;
		}
	}
	void PushFront(const DataType& data)
	{
		Node* pNode = new Node(data);
		if(NULL == _pHead)//链表没有节点
		{
			_pHead = pNode;
			_size = _size+1;
		}
		else//链表有一个或多个节点
		{
			Node* pTemp = _pHead;
			_pHead = pNode;
			pNode->_pNext = pTemp;
			pTemp->_pPre = _pHead;
			_size = _size+1;
		}
	}
	void PopFront()
	{
		if(NULL == _pHead)  //链表没有节点
		{
			return;
		}
		else if(1 == _size)//链表有一个节点
		{
			delete _pHead;
			_pHead = _pTail = NULL;
			_size = 0;
		}
		else              //链表有一个或多个节点
		{
			Node* pTemp = _pHead;     
			_pHead = _pHead->_pNext;
			_pHead->_pPre  = NULL;
			delete pTemp;
			_size = _size-1;
		}
	}
	Node* Find(const DataType& data)
	{
		Node* pTemp = _pHead;
		if(NULL == _pHead)
		{
			return NULL;
		}
		else
		{
			while(pTemp)
			{
				if(pTemp->_data == data)
				{
					return pTemp;
				}
				pTemp =pTemp->_pNext;
			}
			return NULL;
		}
		
	}
	void Insert(Node* pos, const DataType& data)
	{
		if(NULL == pos)  //没有该节点
		{
			return;
		}
		else if(pos->_pNext == NULL)   //该节点为尾结点
		{
			PushBack(data);
		}
		else                          //其他节点
		{
			Node* pNewNode = new Node(data);
			pNewNode->_pNext = pos->_pNext ;
			pos->_pNext->_pPre = pNewNode;
			pos->_pNext = pNewNode;
			pNewNode->_pPre = pos;
			_size++;
		}
	}
	void Erase(Node* pos)
	{
		if(NULL == pos)   //没有该节点
		{
			return;
		}
		else if(pos->_pNext == NULL)    //该节点为尾结点
		{
			PopBack();
		}
		else                            //其他节点
		{
			Node* pTemp = pos;
			pos->_pPre->_pNext = pos->_pNext;
			pos->_pNext->_pPre = pos->_pPre;
			delete pTemp;
			_size = _size-1;
		}
	}



	~List()
	{
		if(_pHead != NULL)
		{
			Node* pTemp = _pHead;
	
			while(pTemp->_pNext)
			{
				pTemp = pTemp->_pNext;
			}
			_pTail = pTemp;
			while((_pTail != _pHead)&&(_pTail!=NULL))
			{
				Node *pTemp = _pTail;
				_pTail = _pTail->_pPre;
				delete pTemp;
			}
			delete _pHead;
			_pHead =_pTail = NULL;
			_size = 0;
		}
	}

private:
	Node* _pHead;
	Node* _pTail;
	size_t _size;
};

void funtest()
{
	 List l1(5,10);
	 List l2(l1);
	 List l3;
	 l3 = l1;
	 l1.PushBack(5);
	 l1.PopBack();
	 l1.PushFront(1);
	 l1.PopFront();
	 l1.PushBack(3);
	 Node *temp = l1.Find(3);
	 l1.Insert(temp,1);
	 l1.Erase(temp);
	 l1.~List();
}
int main()
{
	funtest();
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值