1.头文件
#ifndef _LINK_LIST_H
#define _LINK_LIST_H
template <typename T>
struct LinkListNode
{
T t;//节点包含的数据
LinkListNode<T> *next;//指向下一个节点的指针(正好和节点的数据类型一样)
};
//采用模板类,实现链式线性表
template<typename T>
class CLinkList
{
public:
CLinkList();
~CLinkList();
//插入一个节点
int insertNode(T &t,int nPos);
//获取一个节点
T * getNode(int nPos);
//删除一个节点
T * delNode(int nPos);
//获取链式线性表的长度
int getLen();
//清空线性表
void Clear();
//如果想被继承,关键字可以改成protect
private:
int m_nLen;//线性表的长度
LinkListNode<T> *m_pHead;//头结点
};
#endif //_LINK_LIST_H
2.源文件
#include <iostream>
#include "LinkList.h"
#include "vld.h"
using namespace std;
template<typename T>
CLinkList<T>::CLinkList()
{
m_pHead=new LinkListNode<T>;
memset(m_pHead,0,sizeof(LinkListNode<T>));
m_pHead->next=NULL;
m_nLen=0;
}
template<typename T>
CLinkList<T>::~CLinkList()
{
if (m_pHead!=NULL)
{
delete m_pHead;
m_pHead=NULL;
}
m_nLen=0;
}
template<typename T>
int CLinkList<T>::insertNode(T &t,int nPos)
{
if (nPos<0)
{
cout<<"insertNode parameter is error";
return -1;
}
LinkListNode<T> *pCurrent=NULL;
pCurrent=m_pHead;//首先赋值给头节点
for (int i=0;i<nPos;i++)
{
pCurrent=pCurrent->next;
}
//把上层应用的t节点缓存到容器中
LinkListNode<T> *pNode=new LinkListNode<T>;
memset(pNode,0,sizeof(LinkListNode<T>));
pNode->t=t;
pNode->next=NULL;
//分两步实现加入节点
pNode->next=pCurrent->next;
pCurrent->next=pNode;
m_nLen++;
return 0;
}
template<typename T>
T* CLinkList<T>::getNode(int nPos)
{
if (nPos<0||nPos>m_nLen)
{
cout<<"getNode() paramerter is error"<<endl;
return NULL;
}
LinkListNode<T> *pCurrent=NULL;
pCurrent=m_pHead;//首先赋值给头节点
for (int i=0;i<nPos;i++)
{
pCurrent=pCurrent->next;
}
//T t=pCurrent->next->t;//这是个临时变量,当返回值是,临时变量被析构掉,出现乱码
//return &t;
T *pT=new T;
memset(pT,0,sizeof(T));
*pT=pCurrent->next->t;
cout<<pT<<endl;
return pT;
}
template<typename T>
int CLinkList<T>::getLen()
{
return m_nLen;
}
template<typename T>
T* CLinkList<T>::delNode(int nPos)
{
if (nPos<0||nPos>m_nLen)
{
cout<<"delNode() paramerter is error"<<endl;
return NULL;
}
LinkListNode<T> *pCurrent=NULL;
pCurrent=m_pHead;//首先将当前节点赋给头节点
for (int i=0;i<nPos;i++)
{
pCurrent=pCurrent->next;
}
LinkListNode<T> *rect=NULL;
rect=pCurrent->next;
T *pT=new T;
memset(pT,0,sizeof(T));
if (rect!=NULL)
{
*pT=rect->t;
//删除操作
pCurrent->next = rect->next;
m_nLen--;
delete rect;//释放内存,因为插入节点的时候是new
}
return pT;
}
template<typename T>
void CLinkList<T>::Clear()
{
//把旧的结点 del掉
LinkListNode<T> *tmp = NULL;
while (m_pHead)
{
tmp = m_pHead->next;
delete m_pHead;
m_pHead = tmp;
}
//重新创建
m_pHead = new LinkListNode<T>;
m_nLen = 0;
}
3.测试程序
#include <iostream>
#include "LinkList.hpp"
#include <string>
using namespace std;
typedef struct _Teacher
{
char sName[64];
int nAge;
}Teacher;
int main()
{
Teacher t1,t2,t3;
memset(&t1,0,sizeof(Teacher));
memset(&t2,0,sizeof(Teacher));
memset(&t3,0,sizeof(Teacher));
t1.nAge=10;
strcpy(t1.sName,"小李");
t2.nAge=11;
strcpy(t2.sName,"小张");
t3.nAge=12;
strcpy(t3.sName,"小刘");
CLinkList<Teacher> list;
list.insertNode(t1,0);
list.insertNode(t2,1);
list.insertNode(t3,2);
int nLen=list.getLen();
cout<<"共"<<nLen<<"节点"<<endl;
for (int i=0;i<nLen;i++)
{
Teacher *pTeacher=list.getNode(i);
if (pTeacher!=NULL)
{
cout<<pTeacher->sName<<" "<<pTeacher->nAge<<endl;
delete pTeacher;
pTeacher=NULL;
}
else
{
cout<<"获取节点指针为空"<<endl;
}
}
while (list.getLen()>0)
{
Teacher *pTeacher=list.delNode(0);
if (pTeacher!=NULL)
{
cout<<"删除节点:"<<pTeacher->sName<<" "<<pTeacher->nAge<<endl;
delete pTeacher;
}
}
nLen=list.getLen();
cout<<"共"<<nLen<<"节点"<<endl;
for (int i=0;i<nLen;i++)
{
Teacher *pTeacher=list.getNode(i);
if (pTeacher!=NULL)
{
cout<<pTeacher->sName<<" "<<pTeacher->nAge<<endl;
}
else
{
cout<<"获取节点指针为空"<<endl;
}
}
return 0;
}