今天终于完成了链式的线性表,只实现了一些基本操作,使用起来可能不太方便,以后有时间来改良
#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;
}
}
}