线性表的链式存储结构
线性表的实现分顺序存储结构和链式存储结构。
上一节我们学学习了线性表的实现分顺序存储结构,并实现解顺序存储的基本操作。
这一节我们来学习线性表链式存储结构,那我们再想象一下我为什么我们要引入链式存储结构,万物存在必有其道理
主要还是因为线性存储结构存在着这样一个问题:当我们需要插入和删除元素时,就必须挪动大量与之无关的元素,因为线性存储结构结点与节点之间的关系是相邻关系,一个节点挨着一个节点
如为了插入或者删除一个元素移动大量的元素,这样就降低了程序运行效率。
当我们引入
顾名思义链式存储结构,数据与数据之间是以链式关系来产生连接的的,我们可以脑部一下锁链的样子,不扯淡了,进入正题--
我们如何定义一个链式存储结构的节点呢?
/*Node表示一个节点*/typedefstructNode{int data; //数据域
struct Node* next; //存放下一个节点的指针
}Node;
typedefstruct Node* LinkList; /*取了一个别名,定义LinkList = Node*,用于存放节点的指针*/
一个节点包括一个数据域和指针域
我们将这种只带有一个指针域的线性表称为单链表。
链表中第一个结点的存储位置叫做头指针。
单链表的第一个结点前附设一个结点,称为头结点。
注意可以没有头节点,但是要是链表,就一定存在头指针。
那么问题来了,我们如何区分头节点和头指针呢?
头指针:是指向链表的指针,如果不存在头节点,那么头指针就会指向链表的第一个节点。
头节点:实际上是不存在的,只不过是为了链表的一些操作方便而设置的,头节点与第一个节点以链式关系相连,并且头节点的数据域没有意义,指针域存放第一个节点的地址。
单链表的插入
s->next =p->next;
p->next=s; //注意前后顺序不能调
单链表的删除
q= p->next;
p->next = q->next;
free(q);
单链表的建表(头插法)