1.1 单链表
在之前的学习中,我们接触到了数组这一数据结构。但这存在一个问题:在分配数组的存储空间的时候,由于内存的分配是连续的,在我们分配的内存空间很大的时候,我们可能会遇到内存分配失败的问题。
比如我们定义以下语句:
#define MAX 100000000
int Arr[MAX];
如果是这样的话,我们的编译器大概率会报错。但在实际生产环境,同时处理一万个甚至是一百万个的场景是十分常见的。那我们是否就无法处理这样的问题了呢?答案是否定的,在本节中我们所介绍的链表就可以很简单的解决这个问题。
- 链表的基本知识
以单向链表为列,链表由若干个节点和指针组成。链表的基本组成单位是节点。节点我们一般分为两个区域:数据域和指针域。我们一般在数据域中存放我们所需要存储的数据,而指针域我们用来存储下一个节点的地址。换而言之,就是当前节点的指针域指向下一个节点。
我们通常命名链表的第一个节点为头节点,头节点的数据域不进行处理,指针域存放下一个节点也就是我们存放第一个数据的节点。我们一般把这个存放第一个数据的节点称之为首节点。链表的最后一个节点,我们一般称之为尾节点。尾节点的数据域正常存储数据,而指针域为空,也就是空指针(NULL),空指针的出现预示着链表的终止。
Q:为什么我们要定义一个指针域呢?
A:在C语言中,我们一般使用malloc函数来分配动态内存空间,这使得我们所分配的内存空间是不连续的。这一方面很好的解决了我们连续内存空间分配失败的问题,但另一方面,假若我们不在内存空间中不存储下一个节点的地址,我们是无法寻址至另一个节点的。这使得链表与数组相比,我们浪费了一倍链表长度的空间。
Q:那么我们为什么需要一个头节点呢?
A:习惯用法。头节点的存在是为了防止在插入新的节点的时候,若该节点插入的地址是在第一个节点之前,如果我们不定义头节点的话,新链表中指向第一个节点的指针便会丢失。但事实上,这是一种极其特殊的情况,你也可以不定义,但一定要在程序的注释中说明清楚。在本专栏中,除非特别声明,链表均带有头节点。

2.链表的类型声明

3.链表的创建

4.链表的遍历

5.链表的插入

6.链表的删除


浙公网安备 33010602011771号