国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

雙向鏈表---C++實現(xiàn)

2019-11-06 08:04:32
字體:
供稿:網(wǎng)友

雙向鏈表在類中的實現(xiàn)

#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);   //創(chuàng)建一個新節(jié)點作為新鏈表的頭節(jié)點		Node* pNewTemp = pNode1;                //創(chuàng)建一個臨時變量指針指向新鏈表的頭節(jié)點		_pHead = pNode1;		size_t ret = l._size;		while(--ret)                            //循環(huán)里創(chuàng)建ret-1個節(jié)點		{			pTemp = pTemp->_pNext;			Node* pNode2 = new Node(pTemp->_data);  //復制l鏈表值為pTemp->_data的節(jié)點			pNewTemp->_pNext = pNode2;             //將新創(chuàng)建的節(jié)點與新鏈表連接起來			pNode2->_pPre = pNewTemp;			if(ret != 1)                          //判斷是否是最后一個節(jié)點,若不是,則臨時指針指向下一個節(jié)點			{				pNewTemp = pNewTemp->_pNext ;			}			else                                  //若是最后一個節(jié)點,則尾指針指向空			{				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)   //與拷貝構造函數(shù)類似	{		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) //只有一個節(jié)點		{			delete _pHead;			_pHead = _pTail = NULL;			_size = 0;		}		else //多個節(jié)點		{			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)//鏈表沒有節(jié)點		{			_pHead = pNode;			_size = _size+1;		}		else//鏈表有一個或多個節(jié)點		{			Node* pTemp = _pHead;			_pHead = pNode;			pNode->_pNext = pTemp;			pTemp->_pPre = _pHead;			_size = _size+1;		}	}	void PopFront()	{		if(NULL == _pHead)  //鏈表沒有節(jié)點		{			return;		}		else if(1 == _size)//鏈表有一個節(jié)點		{			delete _pHead;			_pHead = _pTail = NULL;			_size = 0;		}		else              //鏈表有一個或多個節(jié)點		{			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)  //沒有該節(jié)點		{			return;		}		else if(pos->_pNext == NULL)   //該節(jié)點為尾結點		{			PushBack(data);		}		else                          //其他節(jié)點		{			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)   //沒有該節(jié)點		{			return;		}		else if(pos->_pNext == NULL)    //該節(jié)點為尾結點		{			PopBack();		}		else                            //其他節(jié)點		{			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;}


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 涪陵区| 黄梅县| 丹东市| 荆州市| 衡东县| 萨嘎县| 乌兰浩特市| 海安县| 克拉玛依市| 敦煌市| 达孜县| 繁峙县| 恭城| 河北区| 海盐县| 定边县| 中超| 东方市| 房山区| 班戈县| 会泽县| 万全县| 五台县| 合阳县| 固镇县| 邢台县| 岱山县| 荥阳市| 库伦旗| 三穗县| 溆浦县| 闸北区| 益阳市| 封丘县| 德江县| 汶川县| 赞皇县| 仙桃市| 八宿县| 秦皇岛市| 东台市|