0
点赞
收藏
分享

微信扫一扫

单链表的预备基础知识

程序猿不脱发2 2022-04-21 阅读 99
数据结构

线性表的链式存储结构——链表(单链表)

1.熟悉单链表

每个存储结点包含元素本身的信息(数据域
每个存储结点包含表示元素之间逻辑关系的信息(指针域
从一个链表的头指针所指的头结点出发,沿着结点的链指针域的值可以访问到每个结点。

注意:线性表中的每个元素最多只有一个前驱元素和一个后继元素
单链表:每个结点中除包含有数据域只设置一个指针域用于指向其后继结点。
头指针:在线性表的链式存储中,通常每个链表都带有一个头节点并通过头节点的指针唯一
首指针:指向首结点或开始结点的指针
尾指针:指向尾结点的指针,因此,统一了空表与非空表的过程。

在单链表中增加头节点的优点:
1.单链表中首结点的插入与删除操作与其他结点一致
2.无论单链表是否为空都有一个头节点,因此统一了空表与非空表的处理过程

在单链表中,由于每个结点只包含一个指向后继结点的指针,所以当访问过一个结点后,只能接着访问它的后继结点,而无法访问它的前驱结点,因此在进行单链表的插入和删除时,就不能简单地对该结点操作,还必须考虑其前后的结点。

在单链表中,每个结点的类型用LinkNode表示,它应包括存储元素的数据域,这里用data表示,还包括存储后继结点的位置的指针域,这里用next表示。

LinkNode类型声明:
typedef struct LNode {
	ElemType data;//存放元素值
	struct LNode* next;//指向后继结点
}LinkNode;//单链表结点类型

2.单链表的插入和删除结点操作。

2.1插入

这里插入指在单链表的两个数据域分别为a和b的结点(已知a结点是指针p)之间插入一个数据域为x的结点(由s指向它)如图一其操作是首先让x的结点的指针域(s->next)指向b结点(p->next),然后让a结点的指针域(p->next)指向x的结点(s),从而实现三个逻辑关系之间的变化。

s->next = p->next;
p->next = s;

注意这两个语句顺序不能颠倒否则先执行p->next = s;语句指向b结点的指针就不存在了,在执行s->next = p->next;语句,相当于执行s->next=s,这样插入操作错误。

2.2删除

这里删除指在单链表中删除结点p的后继结点,删除b结点的操作是让a结点的指针域(p->next)指向c结点(p->next->next)

p->next=p->next->next

在一般情况下,删除一个结点后还需要释放其存储空间,实现上述b结点并释放其存储空间

q = p->next;
p->next = q->next;
free(q);
举报

相关推荐

0 条评论