之前给别人讲解过线性表这一数据结构,发现很多人在引入线性表的控制头后就把控制头指针与不带头节点链表的链表头指针混淆了,其实造成这一误区的根本原因还是对于带头节点链表与不带头节点链表的本质不够清楚。本文会通过线性表数据结构实现方式与线性表类的区别作为切入点,详细解释带头结点链表与不带头结点链表的区别。

        首先我们区别三个概念:线性表,链表,链表类。

        线性表是一种数据结构,表示数据之间的关系呈线性关系的一系列数据集合。这是一种抽象的概念,是用来描述数据之间的关系的。我们可以用数组的方式实现这种数据结构,也可以用我们今天讲到的链表的方式实现。

        链表是线性表的一种实现手段,具体实现方法不在本文中详细讲述,本文重点放在区分几个概念上。

        链表类包含在链表的基础上再增加一系列对于链表的属性的描述以及针对该链表的一系列操作。

        下面我们用一幅图来描述三者之间的关系:

详谈线性表中带头节点与不带头结点链表

        从中我们不难理解,我们在学习C语言时所学的链表只是一种实现手段,因此,带头结点链表与不带头节点链表的讨论应该集中在链表的实现手段上,而这两种实现手段的区别就在于该链表的头部究竟是一个指向链表节点类型的数据的一个指针(指类为结构体类型的指针类型),还是一个链表节点类型的数据(结构体类型)并用该结构体的next成员存储第一个数据节点的首地址值。

        上文所说的是链表的实现手段,它在链表类中扮演的是图中用蓝色线框出的那一部分,它是链表类的主体,也可以叫做核心,其他的数据,例如length、maxLength... ...以及一些图中没有画出的基于链表的一系列操作:如,建立链表、销毁链表、增、删、查找等等都是基于该链表主体的属性的描述以及基于该链表主体需要实现的操作。这时链表头(head)仅仅作为链表类里的一个成员,我在图中没有标明这个“head”是什么类型,就是为了说明这个“head”的类型是由链表的实现方式决定的。

        这时我们就要讲到另一个容易混淆的概念了,那就是链表类的总控制头和链表头。这样的问题只会存在于C语言中,因为C语言没有给出类这样的工具,只有通过结构体和指针相结合的方式来实现类。从图中我们可以看出有一个LINK_LIST *类型的数据指向了一个LINK_LIST类型的数据,而这个LINK_LIST类型的结构体才是真正的链表类。由于我们在使用这一类型的时候免不了要修改其中的数据,因此我们要使用该结构体时必须通过该结构体的指针间接访问(如果该处不理解,请先复习C语言函数的形参与实参),因此,该LINK_LIST *类型的数据就是我们所说的链表类的总控制头。

相关文章:

  • 2022-12-23
  • 2021-11-14
  • 2022-12-23
  • 2022-12-23
  • 2021-06-19
  • 2021-12-31
  • 2021-05-25
  • 2021-10-16
猜你喜欢
  • 2022-12-23
  • 2021-07-28
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案