首页 > 编程 > C++ > 正文

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

2019-11-06 08:04:32
字体:
来源:转载
供稿:网友

双向链表在类中的实现

#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;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选