node.h
#pragma once
template<typename T>
class node
{
public:
node() = default;//默认构造函数
node(T x) :elem(x),next(NULL) {};
T elem; //节点元素
node *next;
};
linkList.h
#pragma once
# include"node.h"
# include<iostream>
# include<string>
using std::cout;
using std::endl;
template<typename T>
class linkList
{
public:
linkList();//默认构造函数
~linkList();//析构函数,删除整个链表,包括头结点
void clearList(); //清空链表(只是清空其他节点,保留头结点)
int linkLen(); //链表长度(节点个数)
bool empty(); //链表是否为空
bool getElem(int i,node<T>*&p);//返回指向第i个节点的指针
int locateElem(node<T> *p); //节点node在链表中的位置
void traverse(); //遍历链表
bool insert(int i,T x); //在第i个位置之后插入节点
bool dele(int i); //删除第i个位置上的节点
void push_back(T x); //在链表尾部插入节点
private:
node<T> *head;//头指针
int iLen; //节点个数(头结点除外)
};
//==============函数实现=======================
template<typename T>
linkList<T>::linkList():head(new node<T>()),iLen(0)//默认构造函数
{
}
template<typename T>
linkList<T>::~linkList()//析构函数
{
clearList();
delete head;
}
template<typename T>
void linkList<T>::clearList() //清空链表(只是清空节点,保留头结点)
{
node<T>* p1 = head;
for (node<T> *p = head->next;p;)
{
p1= p;
p = p1->next;
delete p1;
}
head->next = NULL;
iLen = 0;
}
template<typename T>
int linkList<T>::linkLen() //链表长度(节点个数)
{
return iLen;
}
template<typename T>
bool linkList<T>::empty() //链表是否为空
{
return iLen == 0;
}
template<typename T>
bool linkList<T>::getElem(int i, node<T>*&p)//获得指向第i个节点的指针
{
if (i<1 || i>iLen)
return false;
p = head;
for (int j = 1;j < i;j++)
{
p = p->next;
}
p = p->next;
return true;
}
template<typename T>
int linkList<T>::locateElem(node<T> *p) //节点node在链表中的位置
{
int i = 0;
node<T> *p1;
for (p1 = head->next;p1 != p;p1 = p1->next)
{
i++;
}
return ++i;
}
template<typename T>
void linkList<T>::traverse() //遍历链表
{
for (node<T> *p = head->next;p;p = p->next)
cout << p->elem << endl;
}
template<typename T>
bool linkList<T>::insert(int i,T x) //在第i个位置之后插入节点
{
node<T> *p;
if (!getElem(i, p))
return false;
node <T> *p1 = p->next;
node<T> *pNew = new node<T>(x);
p->next = pNew;
pNew->next = p1;
iLen++;
return true;
}
template<typename T>
bool linkList<T>::dele(int i) //删除第i个位置上的节点
{
node<T> *p;
if (!getElem(i - 1, p))
return false;
node<T> *p1=p->next;
p->next = p1->next;
delete p1;
iLen--;
return true;
}
template<typename T>
void linkList<T>::push_back(T x) //在链表尾部插入节点
{
node<T> *p, *p1;
for (p = head;p->next;p = p->next)
{
}
p1 = new node<T>(x);
p->next = p1;
iLen++;
}
main.cpp
# include<iostream>
# include"node.h"
# include"linkList.h"
using namespace std;
int main()
{
linkList<int> myList;
myList.push_back(1);
myList.push_back(3);
myList.push_back(5);
node<int> *p;
myList.getElem(2, p);
myList.insert(1, 2);
myList.locateElem(p);
myList.traverse();
system("pause");
return 0;
}
运行结果: