数据结构--线性表的链式存储结构

这里写目录标题

  • 链式存储结构
  • 链表
    • 简介
    • 格式
    • 分类
    • 头结点
      • 位置
      • 示意图
      • 与不带头结点的区别
    • 链表的特点
  • 单链表
    • 定义
      • 链表的代码实现
        • 简介
        • 实操
    • 基本操作的实现
      • 初始化单链表
      • 销毁单链表
      • 清空单链表
      • 求单链表表长
    • 二级目录
    • 二级目录
    • 二级目录
    • 二级目录
    • 二级目录
    • 二级目录

链式存储结构

链表

简介

数据结构--线性表的链式存储结构_第1张图片
数据结构--线性表的链式存储结构_第2张图片
数据结构--线性表的链式存储结构_第3张图片

格式

数据结构--线性表的链式存储结构_第4张图片

案例

开头是头指针H 指向第一个数据元素的数据域,之后第一个数据元素的指针域指向第二个元素的数据域,由此连接成一个链表,最后末端是一个空指针,记作“^”
数据结构--线性表的链式存储结构_第5张图片

分类

数据结构--线性表的链式存储结构_第6张图片

头结点

位置

数据结构--线性表的链式存储结构_第7张图片
头指针只是一个指针域,没有数据域,头结点有数据域和指针域

示意图

数据结构--线性表的链式存储结构_第8张图片

与不带头结点的区别

数据结构--线性表的链式存储结构_第9张图片

数据结构--线性表的链式存储结构_第10张图片
数据结构--线性表的链式存储结构_第11张图片
数据域任意存放数据,可以用来存放线性表的长度等信息,但是头结点不计入链表的长度值

链表的特点

数据结构--线性表的链式存储结构_第12张图片

单链表

定义

链表的代码实现

简介

数据结构--线性表的链式存储结构_第13张图片
首先,对于一个结点来说,包含两个东西,一个是数据域,一个是指针域,用代码实现一个结点的时候,要用结构体,
第二,结构体里面,对于数据域的定义,使用表中的数据类型对应即可,对于指针域,因为其指向的是下一个结点,而每个结点都是一个结构体,所以,指针的类型是结构体类型,与自己所在的结构体一模一样
第三,typedef 是对后面圈起来的结构体起别名,相当于Java中对一个类起了一个别名,后面的Lnode 以及 *LinkList都是结构体的别名,二者是两种不同的形式

对于Lnode,可以直接利用它来定义一个对象,之后利用该对象调用结构体中的数据,这样这个对象就是结点本身
也可以,定义一个该类型的指针,用指针来操作结构体中的数据,这样指针就是指向结点的,如下图
数据结构--线性表的链式存储结构_第14张图片
而对于定义指针可以有更简便的方法,因为还定义了一个别名 是 *LinkList,所以可以直接,LinkList p
如下图
数据结构--线性表的链式存储结构_第15张图片

实操

数据结构--线性表的链式存储结构_第16张图片
定义链表,以及定义结点时,通常采用图中黄色部分

注意别忘了,头指针表示整个链表


右边为统一的定义方式,将所有数据打包为一个结构体,之后直接定义结构体类型的数据域

基本操作的实现

初始化单链表

数据结构--线性表的链式存储结构_第17张图片
空表定义,对于引用类型的参数,详情见上一篇文章“补充”,大致是,形参和实参共用一个地址
数据结构--线性表的链式存储结构_第18张图片

销毁单链表

数据结构--线性表的链式存储结构_第19张图片
首先将头指针的值赋值给结点指针p,之后要把第一个结点的指针域赋值给头指针L,以便L可以下移,找到下一个结点

之后销毁第一个结点,再把L的值赋给p,L再下移,这样循环,就可以销毁单链表

数据结构--线性表的链式存储结构_第20张图片

清空单链表

思路与销毁差不多,只不过新定义了一个指针,用来代替销毁时的L,这时L保持不动,用于保留头指针和头结点,最后将头结点的指针域置空即可

数据结构--线性表的链式存储结构_第21张图片
循环顺序与销毁有所不同,这里顺序不同,一定程度上影响着循环条件的判断,具体问题具体分析即可

求单链表表长

数据结构--线性表的链式存储结构_第22张图片
数据结构--线性表的链式存储结构_第23张图片
注意,p所指向的是一个结点,所以,p有值,那么就表示有结点,最后p指向空的时候,就会跳出循环
注意 头结点不计入长度,长度从首元结点算起

二级目录

二级目录

二级目录

二级目录

二级目录

二级目录

你可能感兴趣的:(数据结构)