【数据结构与算法】—深度剖析之链表

📚参考资料:《数据结构C语言版》-严蔚敏

目录

一、单链表

1.1初始化单链表

1.2单链表基本操作的实现 

👻1.2.1初始化

👻1.2.2取值

 👻1.2.3查找(按值查找)

👻1.2.4插入 

👻1.2.5删除(按位置删除)

👻 1.2.6创建

 二、循环链表

 三、双向链表

👻双向链表的插入

  👻双向链表的删除


特点:用一组任意的存储单元存储线性表的数据元素(可以连续,可以不连续)。

对于数据元素ai来说,除存储本身的信息之外,还需要存储直接后继的存储位置。这两部分信息组成元素ai的存储映像,称为结点

结点包括两个域:

  • 数据域:存储数据元素信息的域
  • 指针域:存储直接后继存储位置的域。指针域中存储的信息称作指针或链。

n个结点(ai(1<=i<=n)的存储映像)链结成一个链表,即为线性表的存储结构。


一、单链表

1.1初始化单链表

链表的每个结点中只包含一个指针域,称作线性链表或单链表

(图1)

接下来我们来看一个单链表的示例,理解一下上述概念

(图2) 

(图3) 

//单链表的存储结构

typedef struct Lnode
{
	ElemType data;		//结点的数据域
	struct Lnode *next;		//结点的指针域 
}Lnode,*LinkList;			//Linklist为指向结构体Lnode的指针类型 
  • 为了提高程序的可读性,在此对同一结构体指针类型起了两个名称,LinkList与Lnode*,两者本质上是等价的。
  • 通常习惯上,用LinkList定义单链表,强调定义的是某个单链表的头指针;用Lnode*定义指向单链表中任意结点的指针变量。

我们看个例子:

若定义LinkList L,则L为单链表的头指针。若定义Lnode *p,则p为指向单链表中某个节点的指针,用*p代表该结点,当然也可以定义为LinkList p,这种定义形式完全等价于Lnode *p。

  • 单链表由表头指针唯一确定因此单链表可以用头指针的名字来命名。如果头指针名是L,则简称该链表为表L
  • Q:如何区分指针变量和结点变量?

        A:如果定义LinkList p或Lnode *p,则p为指向某结点的指针变量,表示该节点的地址;而*p为对应的节点变量,表示该结点的名称。 

Q:看了这么多概念,那首元结点、头结点、头指针有什么区别呢? 

A:

  • 首元结点是指链表中存储第一个数据元素ai的结点 ,也就是图3中的“zhao”
  • 头节点是在首元结点之前附设的一个结点,其指针域指向首元结点(也就是图3中的L)。头节点的数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息。例如,当数据元素为整数型时,头结点的数据域中可存放该线性表的长度。
  • 头指针是指向链表中第一个结点的指针(也就是图3中“L”指向“zhao”的指针)。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设结点,则头指针所指结点为该线性表的首元结点。

Q:链表增加头结点有什么作用?

A:便于首元结点的处理、便于空表和非空表的统一处理。


  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值