版权声明:本文为博主原创文章,未经博主允许不得转载。 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_