线性表的链式存储之单链表(完整)


       开始讲述单链表的基本操作。从开始的存储结构定义到实现一个具体的单链表,各种基本操作都通过具体的程序实现。欢迎指正!

1. 声明结构

       在单链表的存储结构中,我们需要指定两个区域:数据域 data =和指针域 next ;故名思义,数据域,即存放数据的地方,指针域,即存放指向下一节点的地址的地方。因此我们定义的存储结构如下:
结构定义

2. 初始化

       初始化,顾名思义就是在内存中开辟一块初始空间,存储数据域和指针域地址。在初始化中,单链表有两种方式:不带头结点和带头结点;由于在基本操作过程中,不带头结点的比带头结点的复杂,因此本文中的所有基本操作都是基于带头结点。同时,在链表中,我们要了解三个基本概念:头指针头结点首结点;对于基本概念,在此不再叙述,不懂的同学可以翻看数据结构课本复习一下,加深概念,建议借助图示加以理解。

  • 第一种初始化方式(不带头结点):
    不带头结点初始化
     
  • 第二种初始化方式(带头结点):
    带头结点初始化

3. 创建表

       链表中的创建操作跟顺序存储中的有点不一样。可以通过两种方式:头插法尾插法

  • 头插法
           原理:从空表开始,生成一个新结点,每次插入时,都是从链表的表头开始插入。每个结点插入的复杂度为O(1),总复杂度为O(n).读入的数据与生成的链表的元素的顺序时相反的。因此,通过头插法建立的单链表是逆序的,打印时会逆序输出。
    头插法
     
  • 尾插法
           原理:跟头插法相反,尾插法是插入新结点时,从表尾开始插入,因此要定义一个表尾指针,指示插入位置。由于尾插法每次都插入表尾中,也要遍历到表尾插入,因此复杂度为O(1)。尾插法读入的数据与生成的链表的元素顺序是相同的。
    尾插法

4. 插入操作

由于链式存储方式中存储地址不是连续的,只是由每个结点中的指针域的指向相连,因此在进行插入时,我们需要找到头指针,利用头指针指向遍历,找寻插入位置执行插入。在插入中有两种方式,一种是结点后插(insertNextNode);另一种是结点前插(insertPriorNode)。两种方式各有优势。结点后插的复杂度为O(n),结点前插的复杂度为O(1)。

  • 首先我们不进行封装优化,直接操作:
    插入
     
  • 优化后,将部分流程封装,对外提供访问,这样便于我们进行优化处理。其中,return 返回的部分演示使用的是后插方式 insertNextNode,也可使用前插方式insertPriorNode,getELem()为获取插入结点的前一个结点:
    优化
     
    后插封装:
    后插
     
    前插封装:
    前插

4. 删除操作

       删除操作跟插入操作类似,但又不相同。在删除查找中,当我们将某一结点删除 之后,要通过 free 函数释放该结点内存,这是一个良好的编程习惯。同时,由于在链表中,结点间是通过指针域的指向相连,因此删除某一结点的复杂度为O(1),但在删除时,需要找到其结点位置,因此也要遍历,所以总复杂度为O(n).在此之中,我们也可以将其中一些处理逻辑进行封装处理,由于在插入操作中已展示一些封装过程,在此不再过多讲述,就直接处理了。

  • 删除处理逻辑:
    删除

5. 按位查找

       按位查找:顾名思义就是通过给定一个位置,返回其结点为位置。原理:设定一个计数器 j ,计算其位置。再通过头指针遍历,找到该结点,并将其返回。

  • 处理逻辑
    按位查找

6. 按值查找

       按值查找:给定一个值,返回其结点。原理:与按位查找不同,在按值查找中,没有计数器。可以直接通过头指针遍历和访问遍历结点的数据域 data ,判断是否符合查找中 e

  • 处理逻辑:
    按值查找

7. 打印表

       在之前的顺序存储过程中,打印表的操作设定了的是什么时候的表,在此不再过多的讲述这些,要是对打印过程又不理解的同学,可返回看前边的顺序存储文章。因为打印操作就是通过头指针遍历结点,输入其数据域的数据。
打印表

8. 结语

       在此次单链表的实现中,我们把一些基本操作都实现了一遍,通过具体的逻辑处理,能够加深对链式存储的优势的理解,通过让我们对链式存储结构有一个基本的认识:不依赖连续的地址进行存储,对插入删除等操作有了明显的提升,不用移动大量元素便可实现。下一阶段,我们继续对链式存储 进行探究,如循环链表、双链表等。欢迎大家指教。


我的博客: 北     野

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值