1.相关概念
- 链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻
- 线性表的链式表示又称为非顺序映像或链式映像。
- 与链式存储有关的术语:
- 1、结点:数据元素的存储映像。由数据域和指针域两部分组成
- 2、链表: n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构
- 3、单链表、双链表、循环链表:
- 结点只有一个指针域的链表,称为单链表或线性链表;
- 有两个指针域的链表,称为双链表;
- 首尾相接的链表称为循环链表。
- 4、头指针、头结点和首元结点:
- 头指针是指向链表中第一个结点的指针
- 首元结点是指链表中存储第一个数据元素a1的结点
- 头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息。
- 讨论1. 如何表示空表?
- 有头结点时,当头结点的指针域为空时表示空表.
- 讨论2. 在链表中设置头结点有什么好处?
- ⒈便于首元结点的处理 首元结点的地址保存在头结点的指针域中,所以在链表的第一个位置上的操作和其它位置一致,无须进行特殊处理;
- ⒉便于空表和非空表的统一处理 无论链表是否为空,头指针都是指向头结点的非空指针,因此空表和非空表的处理也就统一了。
- 讨论3. 头结点的数据域内装的是什么?
- 头结点的数据域可以为空,也可存放线性表长度等附加信息,但此结点不能计入链表长度值。
2.单链表的类型定义
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
// *LinkList为Lnode类型的指针
- 注意区分指针变量和结点变量两个不同的概念:
- 指针变量p:表示结点地址:LNode *p=LinkList p
- 结点变量*p:表示一个结点
3.单链表基本操作的实现
3.1 初始化(构造一个空表 )
- 算法步骤
- 生成新结点作头结点,用头指针L指向头结点
- 头结点的指针域置空。
- 算法描述
Status InitList_L(LinkList &L)
{
L=new LNode;
L->next=NULL;
return OK;
}
3.2 取值(根据位置i获取相应位置数据元素的内容)
- 算法步骤
- 从第1个结点(L->next)顺链扫描,用指针p指向当前扫描到的结点,p初值p = L->next。
- j做计数器,累计当前扫描过的结点数,j初值为1。
- 当p指向扫描到的下一结点时,计数器j加1。
- 当j = i时,p所指的结点就是要找的第i个结点。
- 算法描述