链表能使人随时方便的插入删除元素,不太影响其他元素。
.顺序访问的线性群体——链表类
1、链表是一种动态数据结构,可以 用来表示顺序访问的线性群体(即你无法像数组那样通过下标灯光方式直接访问元素,需得知开始坐标往下找)。
2、链表是由系列节点组成的,节点可以在运行时动态生成。
3、每一个节点包括数据域和指向链表中下一个节点的指针(即下一个节点的地址,需要依赖它维持节点与节点间的次序关系)。如果链表每个节点中只有一个指向后继节点的指针,则该链表称为单链表。
注:
在使用数组的时候,我们是靠数组的物理地址的次序关系来维持逻辑上的次序关系,但链表上的节点不在相连,因此我们无法在通过物理地址来维持逻辑上的相连性。
.单链表结构示意图
.节点类模板代码实现
template<class T>
class Node
{
public:
T data; //存放数据
Node(const T& item, Node<T>* next = 0);//指针可以赋值为0表示我空指针,当然用nullptr会更明确
void insertAfter(Node<T>* p); //往当前节点后插入一个新的节点
Node<T>* deleteAfter(); //删除当前节点后的节点
Node<T>* nextNode();
const Node<T>* nextNode() const; //返回下一个节点的指针和地址
private:
Node<T>* next;
};
1、在节点之后插入一个节点
template<class T>
void Node<T>::insertAfter(Node<T>* p)
{
//p节点指针域指向的亲啊节点的后继节点
p->next = next;
//当前节点的指针域指向p
next = p;
}
2、删除节点(并返回)之后的节点
template<class T>
Node<T>* Node<T>::deleteAfter()
{
Node<T>* tempPtr = next;
if(next==0)
{
return 0;
}
next = tempPtr->next;
return tempPtr;
}
其他代码
//构造函数,初始数据和指针成员
template<class T>
Node<T>::Node(const T& item, Node<T>* next):data(item),next(next)
{
}
//返回后继节点的指针
template<class T>
Node<T>* Node<T>::nextNode()
{
return next;
}
//返回候机节点的指针
template<class T>
const Node<T>* Node<T>::nextNode() const
{
return next;
}
.链表的基本操作
生成链表
插入链表
查找链表
删除链表
遍历链表
清空链表
.链表类模板的声明
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "Node.h"
template<class T>
class LinkedList
{
public:
LinkedList(); //构造函数
LinkedList(const LinkedList<T>& L);//复制构造函数
~LinkedList(); //析构函数
//重载赋值运算符
LinkedList<T>& operator = (const LinkedList<T>& L);
int getSize()const; //返回链表中的元素个数
bool isEmpty()const; //链表是否为空
void reset(int pos = 0); //初始化游标的位置
void next(); //使游标移动到下一个节点
bool endOfList()const; //游标是否到了链尾
int currentPosition()const; //返回游标当前位置
void insertFront(const T& item); //在表头插入节点
void insertRear(const T& item); //在表尾插入节点
void insertAt(const T& item); //在当前节点之前插入节点
void insertAfter(const T& item); //在当前节点之后插入节点
T deleteFront; //删除头结点
void deleteCurrent(); //删除当前节点
T& data(); //返回当前节点的数据成员的引用
const T& data()const; //返回当前节点的数据成员的常引用
//清空链表,释放所有节点的内存空间。被析构函数、operator = 调用
void clear();
private:
Node<T> *front, *rear; //表头和表尾指针
Node<T>* prevPtr,* currPtr;//记录表当前遍历位置的指针,又插入和删除操作更新
int size; //表中的元素个数
int position; //当前元素在表中的位置序号。由函数reset使用
//生成新节点,数据域为item,指针域为ptrNext
Node<T>* newNode(const T& item, Node<T>* ptrNext = NULL);
//释放节点
void freeNode(Node<T>* p);
//将链表L复制到当前表(假设为空表),被复制构造函数、operator = 调用
void copy(const LinkedList<T>& L);
};
#endif //LINKEDLIST_H