链表(Linked Table)
线性表的链式存储结构生成的表,称作“链表”。
链表分为单向链表和双向链表。
1.单链表(singly linked list)
单链表(singly linked list)是用一组任意的存储单元存放的线性表元素,这组存储单元可以连续也可以不连续,甚至可以零散分布在内存中的任意位置。为了能够体现出数据元素之间的逻辑关系,每个存储单元在在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点(node)。
链表的简单原理图如图:
结点结构如图所示:
元素的构成
每个元素本身由两部分组成:
- data 称为“数据域”,用来存放数据元素(可以是一个成员,或多个成员);
- next 称为“指针域”,用来存放该结点的后继结点的地址。
单链表正是通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起,由于每个结点只有一个指针域,故称为单链表。
单链表中每个结点的存储地址存放在其前驱结点的next域中,而第一个元素无前驱,所以设头指针(head pointer)指向第一个元素所在结点(称为开始结点),整个单链表的存取必须从头指针开始进行,因而头指针具有标识一个单链表的作用;同时,由于最后一个元素无后继,故最后一个元素所在结点(称为终端结点)的指针域为空,即NULL。
指向第一个结点(开始结点)的指针必须保存,否则该链表将会消失。通常在单链表的开始结点之前附设一个类型相同的结点,称为头结点(head node)。加上头结点之后,无论单链表是否为空,头指针始终指向头结点。
链表结点中包含一个指针变量,用于存放下一个Node结构结点的地址,所以该指针必须是与结构体相同的数据类型。
typedef int ElementType;
struct Node
{
ElementType data; //Elem