C++中的节点类与链表类及链表操作

链表能使人随时方便的插入删除元素,不太影响其他元素。

.顺序访问的线性群体——链表类
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
  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值