大话数据结构笔记(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xintonghanchuang/article/details/89330114
  1. 线性表(List):零个或多个数据元素的有限的序列.首先它是一个序列,即元素之间有顺序的,除了第一个元素无前驱,最后一个元素无后继,其中每一个元素有且只有一个前驱和后继.元素的个数即为线性表的长度,当长度为0时,称之为空表.
  2. 线性表抽象数据类型定义:
    在这里插入图片描述
  3. 线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素.一维数组即是顺序存储结构.
    在这里插入图片描述
  4. 线性表长度和数组长度.

a. 数组的长度是指存放线性表的存储空间的长度.
b. 线性表长度是指数组元素的个数.

在这里插入图片描述

  1. 存储器中的每个存储单元都有自己的编号,这个编号称为地址.
  2. 线性表的地址计算方法:假设占用的是C个存储单元,那么线性表中的第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系(LOG标识获得存储位置的函数).LOC(ai)=LOG(a1)+(i-1)*c
    在这里插入图片描述
  3. 顺序存储结构中获取指定位置的元素:根据第一个元素的地址获取指定下标元素的地址,利用指针取值.
    在这里插入图片描述
  4. 顺序存储结构中插入元素到指定位置:将插入位置的元素以及其后的元素都进行后移.
    在这里插入图片描述
  5. 顺序存储结构中删除指定位置元素:与插入算法思路相反.
    在这里插入图片描述
  6. 线性表顺序存储结构的优缺点:

a. 优点:

i. 无须为标识表中元素之间的逻辑关系而增加额外的存储空间.
ii. 可以快速地存取表中任一位置的元素.

b. 缺点:

i. 插入和删除操作需要移动大量元素.
ii. 当线性表长度变化较大时,难以确定存储空间的容量.
iii. 造成存储空间的”碎片”.

  1. 线性表的链式存储结构:用一组任一的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的.其每个存储单元除了要存数据信息外,还要存储它的后继元素的存储地址.
  2. 为了标识每个数据元素ai 与其直接后继数据元素ai+1 之间的逻辑关系,对数据元素ai 来说,除了存储其本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的存储位置).我们吧存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域.指针域中存储的信息称作指针或链.这两部分信息组成数据元素ai 的存储映像,称为节点(Node).
  3. 单链表:n个节点(ai的存储映像)链结成一个链表,即为线性表(a1,a2,a3,……,an)的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以叫做单链表.
    在这里插入图片描述
  4. 头指针:链表中的第一个节点的存储位置.线性链表的最后一个节点指针为”空”(通常用NULL或”^”符号标识).
    在这里插入图片描述
  5. 头结点:在单链表的第一个节点前附设一个节点,称为头结点.头结点数据域可以不存储任何信息,也可以存储入线性表的长度等附加信息,头结点的指针域存储指向第一个结点的指针.
    在这里插入图片描述
  6. 头指针与头结点的异同点:

a. 头指针:

i. 头指针是指单链表指向第一个结点的指针,若链表有头节点,则是指向头结点的指针.
ii. 头指针具有标识作用,所以常用头指针冠以链表的名字.
iii. 无论链表是否为空,头指针均不为空.头指针是链表的比必要元素.

b. 头结点:

i. 头结点是为了操作的同一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度).
ii. 有了头结点,对在第一个元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了.
iii. 头结点不一定是链表的必须要素.

  1. 单链表存储结构示意图
    在这里插入图片描述

    扫描二维码关注公众号,回复: 5909178 查看本文章
  2. 线性表链式存储结构代码描述:结点由存放数据元素的数据域和存放后继结点地址的指针域组成.
    在这里插入图片描述

  3. 单链表的读取:循环遍历,所以当查找元素下标为n时,最坏情况时间复杂度为O(n)
    在这里插入图片描述

  4. 单链表的插入:
    在这里插入图片描述
    在这里插入图片描述

  5. 单链表的删除:
    在这里插入图片描述
    在这里插入图片描述

  6. 线性表的单链式存储结构相对与顺序存储结构的优点是:对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显.

  7. 单链表的整表创建:

a. 声明一结点p和计数器变量I;
b. 初始化一空链表L;
c. 让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
d. 循环:
i. 生成一新节点赋值给p;
ii. 随机生成一数字赋值给p的数据域p->data;
iii. 将p插入到头结点与前一新结点之间.
e. 代码实现:下面这段代码其实用的是让新节点始终插入到第一的位置,这种算法简称为头插法.
在这里插入图片描述
在这里插入图片描述

f. 尾插法代码实现:始终把新节点都放到最后.

在这里插入图片描述
24. 单链表的整表删除:

a. 声明一个结点p和q;
b. 将第一个结点赋值给p;
c. 循环:

i. 将下一结点赋值给q;
ii. 释放p;
iii. 将q赋值给p

d. 代码实现:
在这里插入图片描述

  1. 单链表结构与顺序存储结构对比:

a. 存储分配方式:

i. 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素.
ii. 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素.

b. 时间性能:

i. 查找最坏时间复杂度:

  1. 顺序存储结构O(1);
  2. 单链表O(n);

ii. 插入和删除最坏时间复杂度:

1)顺序存储结构需要平均移动表长一半的元素,为O(n);
2)单链表在查找出某位置的指针后,插入和删除时间仅为O(1);

c. 空间性能:

i. 顺序存储结构需要预分配存储空间,分大了,浪费,分小了,内存溢出.
ii. 单链表初始是不需要分配存储空间,只要有就可以分配,元素个数也不受限制.

  1. 静态链表:建立一个数组,每个数组元素都是由两个数据域组成,其中一个数据域存放数据元素,另外一个数据域存放下一个后继元素在数组中的下标,像这种利用数组描述的链表叫做静态链表.
  2. 静态链表数组的第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;二数组的最后一个元素的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为02.
    在这里插入图片描述
    在这里插入图片描述
  3. 静态链表的操作:

a. 插入
b. 删除

  1. 静态链表的优缺点

a. 优点:

i. 在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点.

b. 缺点:

i. 没有解决连续存储分配的表长度难以确定的问题.
ii. 失去了顺序存储结构随机存取的特性.

猜你喜欢

转载自blog.csdn.net/xintonghanchuang/article/details/89330114