一个简单实用的链表,有时间再完善下其他功能:
#ifndef LINKLIST_H
#define LINKLIST_H
template <typename T>
struct SLink
{
T m_tData;
SLink* m_pNetx;
};
template <typename T>
class CLinkList
{
template <typename R>
friend std::ostream& operator<< ( std::ostream& os, const CLinkList<R>& list );
public:
CLinkList()
{
m_pHead = new SLink<T>();
m_pHead->m_tData = T();
m_pHead->m_pNetx = NULL;
}
virtual ~CLinkList()
{
SLink<T>* pLink = m_pHead;
while( pLink )
{
SLink<T>* pTempLink = pLink->m_pNetx;
delete pLink, pLink = NULL;
pLink = pTempLink;
}
}
//先插入的数据在链表后面
bool addLink( const T& val )
{
SLink<T>* pNewLink = new SLink<T>();
if( !pNewLink )
{
return false;
}
pNewLink->m_tData = val;
pNewLink->m_pNetx = m_pHead->m_pNetx;
m_pHead->m_pNetx = pNewLink;
return true;
}
//依次将每一个节点插入到head后面
void reverse()
{
SLink<T>* pLink = m_pHead->m_pNetx;
SLink<T>* pTempLink = NULL;
//置head的next为空,
m_pHead->m_pNetx = NULL;
while( pLink )
{
//记录下一个节点
pTempLink = pLink->m_pNetx;
//当前节点插入头节点之后,修改其next为之前的头结点的next
pLink->m_pNetx = m_pHead->m_pNetx;
m_pHead->m_pNetx = pLink;
pLink = pTempLink;
}
}
protected:
private:
SLink<T>* m_pHead;
};
template <typename R>
std::ostream& operator<< ( std::ostream& os, const CLinkList<R>& list )
{
SLink<R>* pLink = list.m_pHead->m_pNetx;
while( pLink )
{
os << pLink << "==>" << pLink->m_tData << std::endl;
pLink = pLink->m_pNetx;
}
return os;
}
#endif // LINKLIST_H