
数组中上一个数据的地址和下一个数据的地址是连续的,正好差一个整型大小
链表的物理存储结构:
各个数据的地址之间是没有任何关系的
如何找到链表中的各个数据:
上图说明数据元素是分散在内存的各个位置的。因此也就无法在通过顺序存储的方式去表示各个元素之间的关系了。那现在就有问题了,所谓的数据结构不仅要有数据还要求数据之间要能联系起来,现在如何来关联各个元素之间的关系呢?
可以使用指针的方式来表示各个数据元素之间的联系。就要在每一个数据元素之间存储一个指针地址,表示与之相关联的数据元素的地址。因此使用链式存储结构比顺序存储结构多了一个缺点,就是需要使用一部分空间来保存数据元素之间的关系。
链表这种数据结构中每一个数据元素的结构如下:
指针next指向下一个数据元素的地址
在链表这种数据结构中,称每一个数据元素为一个节点。那我们来看一下这一个个节点是如何关联起来形成一个线性结构的:
每一个节点存储自身的数据,并且连接自己的下一个节点。一个节点扣着一个节点,跟我们现实中的锁链非常的相似,因此我们将这种数据结构称之为链表 。
单链表的操作
现在链表这种数据结构已经构建出来了。数据可以存储了,各个数据之间也联系起来了。那么现在的问题就是如何使用这种数据结构,让他存储我们想要的数据,并能为我们所用。
还是从常规的操作入手:插入,删除,查找
创建
说到创建链表,其实是非常有意思的。上面我们已经知道,链表中的每一个节点都是可以动态创建的。因此当没有数据的时候,要创建一个链表是怎么创建呢?其实所谓的创建链表就是创建一个指向链表节点类型的指针,这个指针我们称它为链表的“头指针”,这个头指针有一个非常重要的特性,那就是这个指针永远指向这个链表的第一个节点。
不要小瞧这个头指针,这个头指针是非常重要的,绝对不能丢失。这边可以仔细思考一下为什么这个头指针不能丢失?
结合一下上面单链表这个数据结构的特性:没一个节点只保留这个节点本身的数据以及下一个节点的位置。那么就有一个问题了,如果想要知道第 n 个节点的值,就需要先知道第 n-1 个节点的地址然后根据 n-1 节点的 next 指针获取第 n 个节点的地址从而获取值。
那么 n-1 个节点的地址从何而来,只能从 n-2,以此类推最后肯定会找到第一个节点。那第一个节点的地址有如何知道呢?
因此需要有一个指针始终指向第一个节点。并且这个指针不能丢失,因为从上面可以得知,如果这个指针丢失了,那么这个链表就永远都找不到了。
因此创建一个链表,其实就是创建一个指针。因为这个链表一开始没有任何节点。因此,让这个指针指向null
表示当前链表没有任何数据元素。如下:
用代码创建如下:
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;
}SListNode;
int main(){
SListNode*plist=NULL;
return NULL;
}