模板链式线性表

今天终于完成了链式的线性表,只实现了一些基本操作,使用起来可能不太方便,以后有时间来改良
#ifndef AFX_XTLINKLIST_H__ 
#define AFX_XTLINKLIST_H__ 

#if _MSC_VER > 1000
#pragma once
#endif  

//链式链表
template <class T>
class XTLinkList  
{
public:
XTLinkList();
virtual ~XTLinkList();

XTLinkList(const XTLinkList<T> &src);

public:
//表尾插入数据
void   InsertTail(const T &data);
//表头插入数据
void   InsertHead(const T &data);
//删除数据
void   RemoveData(const T &data);
void   RemoveAll();
//判断链表是否为空
bool   IsEmpty();
//得到元素个数
int    GetItemCount() const;
//得到第一个元素
bool   GetFirstData(T &data);
//得到下一个元素
bool   GetNextData(T &data);
//得到元素的值
bool   GetData(int nIndex,T &data) const;
private:
struct LinkNode
{
T data;
LinkNode *pNext;
};
LinkNode *m_pHead; //链表头结构
LinkNode *m_pCurrent;//当前遍历节点,遍历方便
LinkNode *m_pTail; //表尾指针

};


//以上定义头文件
template <class T>
XTLinkList<T>::XTLinkList()
{
m_pHead = new LinkNode;
m_pHead->pNext = NULL;
m_pCurrent = m_pHead;
m_pTail = m_pHead;
}

template <class T>
XTLinkList<T>::~XTLinkList()
{
LinkNode *pNode = m_pHead;
LinkNode *pNext = pNode;
while (pNode != NULL)
{
pNext = pNode->pNext;
delete pNode;
pNode = pNext;
}
}

template <class T>
XTLinkList<T>::XTLinkList(const XTLinkList<T> &src)
{
m_pHead = new LinkNode;
m_pHead->pNext = NULL;
m_pCurrent = m_pHead;
m_pTail = m_pHead;

T data;
int nCount = src.GetItemCount();
for (int i = 0; i < nCount; ++i)
{
src.GetData(i,data);
InsertTail(data);
}
}

//插入数据
template <class T>
void  XTLinkList<T>::InsertTail(const T &data)
{
LinkNode *pNode = new LinkNode;
pNode->data = data;
pNode->pNext = NULL;

m_pTail->pNext = pNode;
m_pTail = m_pTail->pNext;
}

template <class T>
void XTLinkList<T>::InsertHead(const T &data)
{
LinkNode *pNode = new LinkNode;
pNode->data = data;
pNode->pNext = m_pHead->pNext;

if (m_pTail->pNext == NULL)
m_pTail = pNode;
m_pHead->pNext = pNode;
}

//删除数据
template <class T>
void  XTLinkList<T>::RemoveData(const T &data)
{
LinkNode *pNode = m_pHead;
LinkNode *pNodeBefore = pNode;
pNode = pNode->pNext;
while (pNode != NULL)
{
if (data == pNode->data)
{
pNodeBefore->pNext = pNode->pNext;
pNode->pNext = NULL;
delete pNode;
break;
}
pNodeBefore = pNode;
pNode = pNode->pNext;
}
}

//判断链表是否为空
template <class T>
bool XTLinkList<T>::IsEmpty()
{
if (m_pHead->pNext == NULL)
return true;
else
return false;
}

//得到标头节点
template <class T>
void XTLinkList<T>::RemoveAll()
{
LinkNode *pNode = m_pHead->pNext;
LinkNode *pNodeT =  NULL;
while (pNode != NULL)
{
pNodeT = pNode->pNext;
delete pNode;
pNode = pNodeT;
}
m_pHead->pNext = NULL;
m_pCurrent = m_pHead;
m_pTail = m_pHead;
}

//得到元素个数
template <class T>
int XTLinkList<T>::GetItemCount() const
{
LinkNode *pNode = m_pHead->pNext;
int nCount = 0;
while (pNode != NULL)
{
nCount++;
pNode = pNode->pNext;
}

return nCount;
}

//得到元素的值
template <class T>
bool XTLinkList<T>::GetData(int nIndex,T &data) const
{
bool bTrue = false;
int nCount = 0;
if (nCount > nIndex)
return false;

LinkNode *pNode = m_pHead->pNext;
while (pNode != NULL)
{
if (nCount == nIndex)
{
data = pNode->data;
bTrue = true;
break;
}

pNode = pNode->pNext;
nCount++;
}

return bTrue;
}

//得到第一个元素
template <class T>
bool XTLinkList<T>::GetFirstData(T &data)
{
m_pCurrent = m_pHead->pNext;

if (m_pCurrent != NULL)
{
data = m_pCurrent->data;
return true;
}
else
{
return false;
}
}

//得到下一个元素
template <class T>
bool XTLinkList<T>::GetNextData(T &data)
{
m_pCurrent = m_pCurrent->pNext;
if (m_pCurrent != NULL)
{
data = m_pCurrent->data;
return true;
}
else
{
return false;
}
}
#endif // !defined(AFX_XTLINKLIST_H__A52A4E1A_70B8_44A3_9676_7D27D5E100BE__INCLUDED_)


测试用例
void TestLinkList()
{
XTLinkList<int> list;
for (int i = 0; i < 50; ++i)
{
list.InsertTail(i);
}

list.RemoveData(45);

XTLinkList<int> list2(list);
int data = 0;
if (list2.GetFirstData(data))
{
cout << data << endl;
while (list2.GetNextData(data))
{
cout << data << endl;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值