为了加深对模板的理解,我们今天一起用模板写一个单链表,希望通过这个例子,能够帮助大家加深对模板的体会,具体如下:
SList.hpp内容:
#ifndef _SLIST_H_
#define _SLIST_H_
#include <iostream>
using namespace std;
template<typename T>
struct Node
{
T m_Data;
Node<T> * m_pNext;
Node()
{
m_pNext = NULL;
}
};
template<typename T>
class CSList
{
public:
CSList();
~CSList();
//尾插法
bool AppendNode(T Data);
//删除
bool DelNode(T Key);
//修改
bool ModNode(T Key, T New);
//查找
bool FindNode(T Key);
//逆序
bool Reverse();
//打印
void Print();
//销毁
void Clear();
private:
Node<T> * m_pFirst;
};
template<typename T>
CSList<T>::CSList()
{
m_pFirst = NULL;
}
template<typename T>
CSList<T>::~CSList()
{
Node<T> * pCurNode = NULL;
pCurNode = m_pFirst;
while (pCurNode)
{
m_pFirst = m_pFirst->m_pNext;
delete pCurNode;
pCurNode = m_pFirst;
}
}
//尾插法
template<typename T>
bool CSList<T>::AppendNode(T Data)
{
Node<T> * pNewNode = new Node<T>;
Node<T> * pCurNode = NULL;
if (!pNewNode)
return false;
pNewNode->m_Data = Data;
pNewNode->m_pNext = NULL;
if (!m_pFirst)
{
m_pFirst = pNewNode;
return true;
}
pCurNode = m_pFirst;
while (pCurNode->m_pNext)
{
pCurNode = pCurNode->m_pNext;
}
pCurNode->m_pNext = pNewNode;
return true;
}
//删除
template<typename T>
bool CSList<T>::DelNode(T Key)
{
Node<T> * pPrevNode = NULL;
Node<T> * pCurNode = NULL;
if (!m_pFirst)
return false;
if (m_pFirst->m_Data == Key)
{
pCurNode = m_pFirst;
m_pFirst = m_pFirst->m_pNext;
delete pCurNode;
pCurNode = NULL;
return true;
}
pPrevNode = m_pFirst;
pCurNode = m_pFirst->m_pNext;
while (pCurNode->m_Data)
{
if (pCurNode->m_Data == Key)
{
pPrevNode->m_pNext = pCurNode->m_pNext;
delete pCurNode;
return true;
}
pPrevNode = pCurNode;
pCurNode = pCurNode->m_pNext;
}
return false;
}
//修改
template<typename T>
bool CSList<T>::ModNode(T Key, T New)
{
Node<T> * pCurNode = NULL;
if (!m_pFirst)
return false;
pCurNode = m_pFirst;
while (pCurNode)
{
if (pCurNode->m_Data == Key)
{
pCurNode->m_Data = New;
return true;
}
pCurNode = pCurNode->m_pNext;
}
return false;
}
//查找
template<typename T>
bool CSList<T>::FindNode(T Key)
{
Node<T> * pCurNode = NULL;
if (!m_pFirst)
return false;
pCurNode = m_pFirst;
while (pCurNode)
{
if (pCurNode->m_Data == Key)
return true;
pCurNode = pCurNode->m_pNext;
}
return false;
}
//逆序
template<typename T>
bool CSList<T>::Reverse()
{
Node<T> * pPrevNode = NULL;
Node<T> * pCurNode = m_pFirst;
Node<T> * pNext = NULL;
while (pCurNode)
{
pNext = pCurNode->m_pNext;
pCurNode->m_pNext = pPrevNode;
pPrevNode = pCurNode;
pCurNode = pNext;
}
m_pFirst = pPrevNode;
return true;
}
template<typename T>
void CSList<T>::Print()
{
Node<T> * pCurNode = m_pFirst;
while (pCurNode)
{
cout << pCurNode->m_Data << "\t";
pCurNode = pCurNode->m_pNext;
}
cout << endl;
}
template<typename T>
void CSList<T>::Clear()
{
Node<T> * pCurNode = NULL;
pCurNode = m_pFirst;
while (pCurNode)
{
m_pFirst = m_pFirst->m_pNext;
delete pCurNode;
pCurNode = m_pFirst;
}
}
#endif
main.cpp的内容:
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include "SList.hpp"
void main()
{
CSList<int> IntList;
IntList.AppendNode(1);
IntList.AppendNode(7);
IntList.AppendNode(4);
IntList.AppendNode(2);
IntList.AppendNode(8);
IntList.AppendNode(5);
IntList.AppendNode(9);
IntList.AppendNode(6);
IntList.AppendNode(3);
IntList.Print();
IntList.Reverse();
IntList.Print();
IntList.DelNode(3);
IntList.DelNode(1);
IntList.DelNode(2);
IntList.Print();
if (IntList.FindNode(6) == true)
{
cout << "find" << endl;
}
else
{
cout << "not find" << endl;
}
if (IntList.FindNode(7) == true)
{
cout << "find" << endl;
}
else
{
cout << "not find" << endl;
}
if (IntList.FindNode(5) == true)
{
cout << "find" << endl;
}
else
{
cout << "not find" << endl;
}
if (IntList.FindNode(100) == true)
{
cout << "find" << endl;
}
else
{
cout << "not find" << endl;
}
IntList.ModNode(6, 66);
IntList.ModNode(7, 77);
IntList.ModNode(5, 55);
IntList.Print();
IntList.Clear();
_CrtDumpMemoryLeaks();
system("pause");
}
运行效果如图1所示:
图1 运行效果图
从今天开始,我们以实践的方式,帮助大家加深对模板的理解。