//头文件 List.h#pragma oncetypedefint DATA;struct SNode
{
DATA data;
SNode *pPrev,*pNext;};typedefvoid* POSITION;classCList{
SNode *m_pHead,*m_pTail;int m_count;public:CList();~CList();//获取链表头指针
POSITION GetHeadPosition()const{return m_pHead;}//获取链表尾指针
POSITION GetTailPosition()const{return m_pTail;}//获取元素个数intGetCount()const{return m_count;}//获取指定指针位置的数据
DATA GetAt(POSITION pos)const{return((SNode*)pos)->data;}//判断链表是否为空boolIsEmpty()const{return m_pHead?false:true;}
DATA GetNext(POSITION &pos)const;
DATA GetPrev(POSITION &pos)const;voidAddHead(DATA data);voidAddTail(DATA data);voidSetAt(POSITION pos, DATA data)const;voidRemoveAt(POSITION position);voidRemoveAll();
DATA RemoveHead();
DATA RemoveTail();
POSITION InsertBefore(POSITION position, DATA data);
POSITION InsertAfter(POSITION position, DATA data);};
2.源文件
//源文件 List.cpp#include"List.h"#include<stdlib.h>
CList::CList(){
m_pHead = m_pTail =nullptr;
m_count =0;}
CList::~CList(){RemoveAll();}void CList::RemoveAll(){
SNode* pos = m_pHead,*p;while(pos){
p = pos;
pos = pos->pNext;delete p;}
m_pHead =NULL;
m_pTail =NULL;
m_count =0;}
DATA CList::GetNext(POSITION &pos)const{
DATA data =((SNode*)pos)->data;
pos =((SNode*)pos)->pNext;return data;}
DATA CList::GetPrev(POSITION &pos)const{
DATA data =((SNode*)pos)->data;
pos =((SNode*)pos)->pPrev;return data;}void CList::AddHead(DATA data){
SNode* pNew =new SNode;
pNew->data = data;
pNew->pPrev =NULL;
pNew->pNext = m_pHead;if(m_pHead)
m_pHead->pPrev = pNew;else
m_pTail = pNew;
m_pHead = pNew;++m_count;}void CList::AddTail(DATA data){if(!m_pHead){AddHead(data);return;}
SNode* pNew =new SNode;
pNew->data = data;
pNew->pNext =NULL;
m_pTail->pNext = pNew;
pNew->pPrev = m_pTail;
m_pTail = pNew;++m_count;}void CList::SetAt(POSITION pos, DATA data)const{((SNode*)pos)->data = data;}void CList::RemoveAt(POSITION position){
SNode* p =(SNode*)position;if(p == m_pHead)
m_pHead = p->pNext;else
p->pPrev->pNext = p->pNext;if(p == m_pTail)
m_pTail = p->pPrev;else
p->pNext->pPrev = p->pPrev;delete p;--m_count;}
DATA CList::RemoveHead(){if(!m_pHead)returnDATA();
DATA data = m_pHead->data;
SNode* p = m_pHead;
m_pHead = m_pHead->pNext;if(m_pHead)
m_pHead->pPrev =NULL;delete p;--m_count;return data;}
DATA CList::RemoveTail(){if(!m_pTail)returnDATA();
DATA data = m_pTail->data;
SNode* p = m_pTail;
m_pTail = m_pTail->pPrev;if(m_pTail)
m_pTail->pNext =NULL;delete p;--m_count;return data;}
POSITION CList::InsertBefore(POSITION position, DATA data){if(!m_pHead)returnNULL;if(m_pHead == position){AddHead(data);return m_pHead;}
SNode* p = m_pHead;while(p){if(p == position){
SNode* pNew =new SNode;
pNew->data = data;
pNew->pNext = p;
p->pPrev->pNext = pNew;
pNew->pPrev = p->pPrev;
p->pPrev = pNew;++m_count;return pNew;}
p = p->pNext;}returnNULL;}
POSITION CList::InsertAfter(POSITION position, DATA data){if(!m_pHead)returnNULL;if(m_pTail == position){AddTail(data);return m_pTail;}returnInsertBefore(((SNode*)position)->pNext, data);}