c++双向链表源代码
#pragma //保证该头文件只被添加一次
/******************************************************************************************
* 日期:2016-08-07
* 作者:忠义乾坤
* 描述:
* 1. 双向链表
* 2. 可在链表【头】和【尾】删除结点
* 3. 可在链表【头】和【尾】添加新结点
* 4. 采用类模板,可自定义数据类型
* 说明:将该文件放在DLinkList.h文件中,在源文件中包含#include"dlinklist.h"即可
********************************************************************************************/
//********************************************************************
// 类名:DListNode
// 描述:创建一个双向链表结点类
//********************************************************************
template<typename DataType>
class DListNode
{
public:
DataType m_data; //结点数据
DListNode<DataType> *m_nextPtr;//结点后继指针
DListNode<DataType> *m_priorPtr;//结点前驱指针
//************************【使结点的前驱与后继清零,并赋予结点数据】*************
DListNode(const DataType &newData)
{
m_data = newData;
m_nextPtr = NULL;
m_priorPtr = NULL;
}
//************************【使结点的前驱与后继清零】***************************
~DListNode()
{
m_nextPtr = NULL;
m_priorPtr = NULL;
}
//************************【获取结点数据】***********************************
DataType getData() const
{
return m_data;
}
};
//********************************************************************
// 类名:DLinkList
// 描述:创建一个双向链表类
//********************************************************************
template<typename DataType>
class DLinkList
{
private:
int length; //链表的长度
DListNode<DataType> *m_head; //头结点
DListNode<DataType> *m_tail; //尾结点
public:
//************************【初始化头尾结点】********************************
DLinkList()
{
length = 0; //起始链表为空,长度为0
m_head = NULL;
m_tail = NULL;
}
//*************************【清空数据,释放内存】***************************
~DLinkList()
{
cleanAll();
}
//*************************【在链表尾插入结点】*****************************
void insertFromBack(const DataType &newData)
{
DListNode<DataType> *newPtr = new DListNode<DataType>(newData);
if (isEmpty() == true)
{
m_head = newPtr;
m_tail = newPtr;
}
else
{
m_tail->m_nextPtr =newPtr;
newPtr->m_priorPtr = m_tail;
m_tail = newPtr;
}
length ++; ///链表长度增加1
}
//***************************【在链表头插入结点】***************************
void insertFromFront(const DataType &newData)
{
DListNode<DataType> *newPtr = new DListNode<DataType> (newData);
if(isEmpty() == true)
{
m_tail = newPtr;
m_head = newPtr;
}
else
{
m_head->m_priorPtr = newPtr;
newPtr->m_nextPtr = m_head;
m_head = newPtr;
}
length ++; //链表长度增加1
}
//***************************【从头打印链表数据,仅支持内置数据类型】*************
void printFromFront (void)
{
DListNode <DataType> *tempPtr;
tempPtr = m_head;
while(tempPtr !=NULL)
{
cout<<tempPtr->getData()<<"\t"<< tempPtr<<endl; //输出结点数据与地址方便调试
tempPtr = tempPtr->m_nextPtr;
}
}
//***************************【从尾打印链表数据,仅支持内置数据类型】*************
void printFromBack(void)
{
DListNode<DataType> *tempPtr;
tempPtr = m_tail;
while(tempPtr !=NULL)
{
cout<<tempPtr->getData()<<"\t"<< tempPtr<<endl; //输出结点数据与地址方便调试
tempPtr = tempPtr->m_priorPtr;
}
}
//****************************【从头移除链表数据】*******************************
bool removeFromFront(void)
{
if(isEmpty() == true)
return false;
else
{
if(m_head == m_tail) //头结点和尾结点为同一结点的情况
{
delete m_head;
m_head = NULL;
m_tail =NULL;
length -- ; //链表长度减1
return true;
}
else //头结点和尾结点为不同结点的情况
{
m_head = m_head->m_nextPtr;
delete m_head->m_priorPtr;
m_head->m_priorPtr = NULL;
length --; //链表长度减1
return true;
}
}
}
//************************【从尾移除链表数据】***********************************
bool removeFromBack(void)
{
if(isEmpty() == true)
{
return false;
}
else
{
if(m_head == m_tail)
{
delete m_head;
m_head = NULL;
m_tail = NULL;
length --; //链表长度减1
return true;
}
else
{
m_tail = m_tail->m_priorPtr;
delete m_tail->m_nextPtr;
m_tail->m_nextPtr = NULL;
length --; //链表长度减1
return true;
}
}
}
//*****************************【判断链表是否为空】***********************************
bool isEmpty(void)
{
if(m_head == NULL && m_tail ==NULL)
return true;
else
return false;
}
//*****************************【清空链表,释放内存】*********************************
void cleanAll(void)
{
if(isEmpty() == true)
return ;
else
{
while(m_head !=m_tail)
{
m_head = m_head->m_nextPtr;
delete m_head->m_priorPtr;
m_head->m_priorPtr = NULL;
}
delete m_head;
length = 0; //清空链表长度
m_head = NULL;
m_tail = NULL;
}
}
//***************************【获取链表头结点】**********************************
DListNode<DataType> *getHeadPoint()
{
if(isEmpty() == true)
return NULL;
else
return m_head;
}
//****************************【获取链表长度】***********************************
int getLength(void)
{
return length;;
}
//***************************【获取链表的尾结点指针】*****************************
DListNode<DataType>* getTailPoint(void)
{
return m_tail;
}
};