C++泛型编程之双向链表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40411915/article/details/80121285
#ifndef _LISTEX_H_
#define _LISTEX_H_


/*********************************** 
@function: 链表模板 
@param: 
***********************************/ 
#include <iostream>


using namespace std;


template <typename T>
class CList
{
private:
	struct SNode 
	{
		T data;
		SNode *pPre;
		SNode *pNext;
	};
	SNode *m_pHead, *m_pTail; 
public:
	 
	    /*
		@function: 构造函数 
		@param: 
		*/ 
	CList()
	{
		m_pHead = new SNode();
		m_pTail = new SNode();
		m_pHead->pNext = m_pTail;
		m_pTail->pPre = m_pHead;
	}

	  /*
	  @function: 析构函数 
	  @param: 
	  */ 
	~CList()
	{
		SNode *p = m_pHead, *q;
		while (p != m_pTail)
		{
			q = p;
			p = p->pNext;
			delete q;
			q = NULL;
		}
		delete p;
		p = NULL;
	}


	/********************************** 
	@function:遍历链表
	@param: 
	**********************************/  
	void  Print() const
	{
		SNode *p = m_pHead->pNext;
		while (p != m_pTail)
		{
			cout << p->data << endl;
			p = p->pNext;
		}
	}

	/*********************************** 
	@function: 向尾部添加数据 
	@param: data--要添加的数据 
	***********************************/ 
	void  AddTail(T data)
	{
		SNode *q = m_pTail->pPre, *p = new SNode();
		p->data = data;
		p->pPre = q;
		p->pNext = m_pTail;
		m_pTail->pPre = p;
		q->pNext = p;
	}

	  /*********************************** 
	  @function: 向头部添加数据 
	  @param: data--要添加的数据 
	  ***********************************/ 
	void  AddHead(T data)
	{
		SNode *q = m_pHead->pNext, *p = new SNode();
		p->data = data;
		p->pNext = q;
		p->pPre = m_pHead;
		q->pPre = p;
		m_pHead->pNext = p;
	}

	  /*********************************** 
	  @function: 检测空链表的情况(没有元素)
	  @param: 
	  ***********************************/ 
	bool  IsEmpty() const 
	{
		if (m_pHead->pNext == m_pTail || m_pTail->pPre == m_pHead)
			return true;
		return false;
	}

	  /*********************************** 
	  @function:返回链表的头部元素(不能为空)
	  @param: 
	  ***********************************/ 
	T  GetHead() const 
	{
		if (IsEmpty())
			return 0;
		return m_pHead->pNext->data;
	}

	  /*********************************** 
	  @function:返回链表的末尾元素(不能为空)
	  @param: 
	  ***********************************/ 
	T  GetTail() const 
	{
		if (IsEmpty())
			return 0;
		return m_pTail->pPre->data;
	}

	  /*********************************** 
	  @function:从链表头部中移走元素
	  @param: 
	  ***********************************/ 
	T  RemoveHead()   
	{
		if (IsEmpty())
			return 0;
		T data;
		SNode *p = m_pHead->pNext;
		m_pHead->pNext = p->pNext;
		data = p->data;
		delete p;
		p = NULL;
		return data;
	}

	  /*********************************** 
	  @function:从链表中移除末尾元素 
	  @param: 
	  ***********************************/ 
	T  RemoveTail() 
	{
		T data;
		if (IsEmpty())
			return 0;
		SNode *p = m_pTail->pPre;
		m_pTail->pPre = p->pPre;
		data = p->data;
		delete p;
		p = NULL;
		return data;
	}

	  /*********************************** 
	  @function:从链表中移走所有元素
	  @param: 
	  ***********************************/ 
	bool  RemoveAll() 
	{
		SNode *p = m_pHead->pNext, *q;
		while (p != m_pTail)
		{
			q = p;
			p = p->pNext;
			delete q;
			q = NULL;
		}
		m_pHead->pNext = m_pTail;
		m_pTail->pPre = m_pHead;
		return true;
	}

	  /*********************************** 
	  @function:获取指定位置的元素
	  @param: nIndex--指定的位置 
	  ***********************************/ 
	T  GetAt(int nIndex)  const
	{
		if (GetCount() < nIndex)
			return 0;
		SNode *p = m_pHead;
		for (int i = 0; i<nIndex; i++)
		{
			p = p->pNext;
		}
		return p->data;
	}

	  /*********************************** 
	  @function:设置指定位置的元素
	  @param: nIndex--设置的位置
	  data----设定的数据 
	  ***********************************/ 
	bool  SetAt(int nIndex, T data)   
	{
		if (GetCount() < nIndex)
			return false;
		SNode *p = m_pHead;
		for (int i = 0; i<nIndex; i++)
		{
			p = p->pNext;
		}
		p->data = data;
		return true;
	}

	  /*********************************** 
	  @function:从链表中删除一个由位置确定的元素
	  @param: nIndex--要删除的位置 
	  ***********************************/ 
	T  RemoveAt(int nIndex)
	{
		if (GetCount() < nIndex)
			return false;
		SNode *p = m_pHead, *q;
		T data;
		for (int i = 0; i<nIndex; i++)
		{
			p = p->pNext;
		}
		data = p->data;
		q = p->pPre;
		q->pNext = p->pNext;
		return data;
	}

	  /*********************************** 
	  @function:返回此链表中的元素数
	  @param: 
	  ***********************************/ 
	int  GetCount() const
	{
		int nCount = 0;
		SNode *p = m_pHead;
		while (p->pNext != m_pTail)
		{
			nCount++;
			p = p->pNext;
		}
		return nCount;
	}

	  /*********************************** 
	  @function:在指定位置前插入一个新的元素
	  @param: nIndex--指定的位置
	  data----新元素数据 
	  ***********************************/ 
	bool  InsertBefore(int nIndex, T data) 
	{
		if (GetCount() < nIndex)
			return false;
		SNode *p = m_pHead, *q;
		for (int i = 0; i<nIndex; i++)
		{
			p = p->pNext;
		}
		q = p->pPre;
		SNode *pNewNode = new SNode();
		pNewNode->data = data;
		pNewNode->pPre = q;
		pNewNode->pNext = p;
		q->pNext = pNewNode;
		p->pPre = pNewNode;

		return true;
	}

	  /*********************************** 
	  @function:在指定位置后插入一个新的元素
	  @param: nIndex--指定的位置
	  data----新元素数据 
	  ***********************************/ 
	bool  InsertAfter(int nIndex, T data) 
	{
		if (GetCount() < nIndex)
			return false;
		SNode *p = m_pHead, *q;
		for (int i = 0; i<nIndex; i++)
		{
			p = p->pNext;
		}
		q = p->pNext;
		SNode *pNewNode = new SNode();
		pNewNode->data = data;
		pNewNode->pPre = p;
		pNewNode->pNext = q;
		p->pNext = pNewNode;
		q->pPre = pNewNode;

		return true;
	}

	  /*********************************** 
	  @function:获得由某个值确定的元素位置
	  @param: data--需要查找的值 
	  ***********************************/ 
	int  Find(T data) 
	{
		if (IsEmpty())
			return 0;
		int nCount = 0;
		SNode *p = m_pHead;
		while (p->data != data)
		{
			nCount++;
			p = p->pNext;
		}
		return nCount;
	}

	  /*********************************** 
	  @function: 升序排序 
	  @param: 
	  ***********************************/ 
	void  Sort()
	{
		if (IsEmpty())
			return;
		if (GetCount() <= 1)
			return;
		for(int i = 0; i<GetCount(); i++)
		{
			SNode *p = m_pHead->pNext, *temp;
			T data;
			while(p->pNext != m_pTail )
			{
				temp = p->pNext;
				if(temp->data < p->data )
				{
					data = temp->data;
					temp->data = p->data;
					p->data = data;
				}
				p = p->pNext;
			} 
		}
	}
};


#endif // !_LISTEX_H_

猜你喜欢

转载自blog.csdn.net/weixin_40411915/article/details/80121285