双向循环链表
1.概念
1.链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域data,另一个是存储下一个结点地址的指针域 next。最后一个结点的next为空。(怪我自己描述不了,就把百度百科的拿来了)
在用程序实现时,除了第一个结点以外,链表中的其他结点都可以通过前一个结点的指针域(存储了下一个结点地址)来定位,但我们该如何寻找链表的第一个结点呢?我们需要建立一个头指针来指向链表的第一个结点,这样我们就能通过头指针寻找到链表中的所有结点并进行操作。
2.双向循环链表
双向循环链表即在单链表(上文描述的链表为单链表)的基础上进行改进,每个结点不光有存储下一个结点地址的指针域 next,还增加了存储上一个结点地址的指针域 prev,其中头(第一个结点)的 prev 指向尾结点(最后一个结点),尾结点的 next 指向头结点。
2.实现
在操作时创建 temp 指针指向链表中各元素,更改 prev 及 next 指向的结点就可以实现对链表的基本增删查改等操作。
1. list.h
struct Node
{
int data;
Node *next, *prev;
Node(int x) : data(x), next(nullptr), prev(nullptr) {
};
};
class List
{
private:
Node *head;
int length;
public:
List();
bool list_insert(int x, int pos); //插入元素x到指定位置pos
int list_search(int x); //查找元素x,返回所在位置
bool list_delete(int x); //删除元素x
int get_data(int pos); //获取指定位置的元素
bool modify_data(int x, int pos); //修改指定位置元素数据
int get_length(); //获取链表长度
void traverse(); //遍历链表
};
2. List()
由于最开始链表中还没有元素,所以在构造函数中,指定 head 指针为空指针,链表长度 length为 0 。
List::List()
{
head = nullptr</