数据结构与算法——单链表的使用
1. 单链表
用一组地址任意的存储单元存放线性表中的数据元素,其中其数据元素由一系列的结点构成。结点又包含数据域和指针域:
以“结点的序列” 表示的线性表称作链表。
1.1 单链表的存储结构
1.不带头结点:
不带头结点的的单链表
以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针(head)。
- 链表指针存放链表第一个数据元素结点的地址
- 空链表时该指针域为NULL
2.带头结点 :
带头结点的的单链表(箭头所指表示头结点)
有时为了操作方便,在第一个结点之前虚加一个“头结点”,并用链表的头指针指向头结点,称为带头结点的单链表。
- 一个专门的结点,称为头结点
- 该头结点永远存在
- 该头结点指针域存放第一个数据元素结点的地址
- L.next = NULL
用法举例:已知指针p指向单链表L的第i个结点,则访问第i个数据和第i+1个数据的方法分别是p->data和p->next->data。
1.2 单链表的C语言实现
简单链表示例:
具有两个节点的单链表
代码实现:
// 类型定义
typedef struct Node
{
ElemType elem;
struct Node *next;
}Node,*Ptr;
typedef Ptr *SqListPtr;
//变量的定义和使用
Node n1, n2;/* 定义2个结点变量*/
Ptr p = &n1;/* 定义一个指向结点的指针变量p, 并存放n1的地址(指针) */
n1.next = &n2; /* 结点n1的指针域存放结点n2的地址*/
SqListPtr L = p; //定义一个单链表L
N2.next = NULL;
1.2.1 查找——按位置查找
代码实现:
//寻找位于 pos 的结点,并将数据存储到 *elem 中。
Status List_Retrieve(SqListPtr L, int pos, ElemType *elem)
{
Status s = range_error;
Ptr p = (*L)->next;; /* 带头结点,移动p指向第一个元素结点*/
int i