「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。
线性表的链式存储结构定义:
我们将存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。
指针域中的存储信息叫做指针或链,这两部分信息组成数据元素的存储映像称为结点。
n个结点链结成一个链表,即为线性表的链式存储结构,因为次链表的每一个结点中只包含一个指针域,所以称为单链表
链表中第一个结点的存储位置称为头指针。
单链表的第一个结点设一个结点称为头结点。
头指针和头结点的区别:
头指针:
链表必要元素
是链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。
有标识作用,所以常用头指针描述链表名字。
无论链表是否为空,头指针均不为空。
头结点:
非链表必要元素
为操作统一和方便,放在第一元素的结点之前,其数据域一般无意义。
可存放链表长度。
线性表的结构定义:
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
结点由存放 数据元素的数据域 和 存放后继结点地址的指针域 组成。
单链表的读取:
获得链表第i个数据的算法思路:
1.声明一个指针h指向链表第一个结点,初始化j从1开始;
2.当j<i时,就遍历链表,让h的指针向后移动,不断指向下一个节点,j累加1;
3.若到链表末尾h为空,则第i个结点不存在,否则查找成功。
4.返回结点h的数据。
Status GetElem (LinkList L,int i,ElemType *e)
{
int j;
LinkList p;
p = L->next;
j = 1;
while(p && j<i)
{
p = p->next;
++j;
}
if( !p || j>i)
return 0;
*e = p->data;
return 1;
}
其实就是从头开始找,直到第i个结点为止,该算法是时间复杂度为O(n)。主要核心思想就是工作指针后移。
单链表也有插入和删除,但跟顺序结构略有不同。
对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。
单链表整表创建的算法思路:
1.声明指针p和计数器变量i;
2.初始化一空链表L;
3.让L的头结点指向NULL,即建立一个带头结点的单链表;
4.循环:
- 生成一新结点赋值给p;
- 生成一随机数赋值给p->data;
- 将p插入到头结点与前一新结点之间。
单链表整表删除的算法思路:
1.声明一结点p和q;
2.将第一个结点赋值给p;
3.循环:
- 将下一节点赋值给q;
- 释放p;
- 将q赋值给p。