介绍
线性表的链式存储结构,指的是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
链表(Linked List),动态存储分配,运行时分配空间。
存储特点:
- 逻辑次序和物理次序不一定相同。
- 元素之间的逻辑关系用指针表示
单链表
单向链表是链表的一种,它由节点组成,每个节点都包含下一个节点的指针。
结点结构
数据域 | data,存储数据元素 |
指针域 | next,存储指向后继节点的地址 |
特点:节点的连接方向是单向的;相对于数组来说,单链表的随机访问速度较慢,但是单链表删除/添加数据的效率很高
双链表
双向链表是链表的一种。和单链表一样,双向链表也是由节点组成,它的每个数据节点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个节点开始,都可以很方便地访问它的前驱节点和后继节点。一般我们都构造双向循环链表。
结点结构
数据域 | data,存储数据元素 |
指针域 | prev,存储指向前驱节点的地址 next,存储指向后继节点的地址 |
————————————————————————————————————————————————————————————————————————————
单向链表及其操作示例
单向链表的示意图
在单链表的第一个元素结点之前附设一个类型相同的结点,以便空表和非空表处理统一,并且可统一对任意位置的结点的操作实现。
删除结点
添加结点
—————————————————————————————————————————————————————————————————————————————
双向链表及其操作示例
双链表的示意图
删除结点
添加结点
—————————————————————————————————————————————————————————————————————————————
算法实现
C++实现单链表
头文件LInkedList.h
#ifndef LINKED_LIST
#define LINKED_LIST
#include<iostream>
using namespace std;
template<class T>
struct DNode
{
public:
T value;
DNode *next;
public:
DNode(){}
DNode(T t, DNode *next)
{
this->value = t;
this->next = next;
}
};
template<class T>
class LinkedList
{
public:
LinkedList();
~LinkedList();
int size();
bool is_empty();
T get(int index);
T get_first();
T get_last();
bool insert(int index