李哈哈的数据结构和算法笔记【part 2:线性表】

李哈哈的数据结构和算法笔记【part 2:线性表】

感受线性表的存在

排队,记住自己前边的人就行。
线性表定义:
由零个或多个数据元素组成的有限序列。
几个强调:

  • 是一个序列,有先来后到。
  • 若有多个元素,第一个无前驱,最后一个无后继,其他元素有且只有一个前驱和后继。
  • 线性表是有限的。

线性表的抽象数据类型(ADT)

抽象数据类型:abstract date type
把数据类型和相关操作捆绑在一起。
线性表的抽象数据类型定义:

  • ADT 线性表 List
  • DATE
    线性表的数据对象集合为{a1 a2 a3 …… an},每个元素类型为DateType
  • Operation
    InitList(*L):初始化操作,建立一个空的线性表L
    ListEmpty(L):判断是否为空表,为空返回true,否则返回false
    ClearList(*L):将线性表清空
    GetElem(L,i,e):将线性表L中的第i个位置元素返回个e
    LocateElem(L,e):在线性表L中查找与给定值e相等的元素,成功则返回表中序号,否则返回0表示失败
    ListInsert(*L,i,e):在线性表L中第i个位置插入元素e
    ListDelete(*L,i,*e):删除线性表L中第i个位置的元素,并用e返回其值
    ListLength(L):返回线性表L中的元素个数
  • endADT

以上子函数可以由用户自行编写。

线性表的顺序存储结构

分类:

  • 顺序存储结构:一段地址连续的存储单元依次存储线性表中的数据元素
  • 链式存储结构:同时存储数据元素信息以及后继元素的存储地址

顺序存储结构存在一个问题:需要增加或删除一个元素时,需要处理的时间复杂的是O(n),这样资源占用很大,所以创造了链式存储结构。
链式存储结构:
数据域:存储数据元素信息的域
指针域:存储直接后继位置的域,存储信息称为指针或链
存储映像: 这两部分信息组成的数据元素,也称为结点

单列表

第一个结点的存储位置叫做头指针,最后一个结点指针为空(NULL)
头指针和头结点的异同:
头结点数据域一般不存储任何信息

头指针:

  1. 头指针是指向链表的第一个结点的指针,若链表有头节点,则是指向头结点的指针
  2. 头指针具有标识作用,常用头指针冠以链表的名字(指针变量名)
  3. 无论链表是否为空,头指针均不为空
  4. 头指针是链表的必要元素

头结点:

  1. 为了操作统一和方便而设立的,放在第一个元素的结点前,数据域一般无意义,但也可以用来存放链表的长度。
  2. 有了头结点,对在第一元素结点前插入节点和删除第一节点的操作与其他结点的操作就统一了。
  3. 头结点不是链表的必须要素

单链表读取是从头开始找,直到要找的第i个元素为止,最坏的情况时间复杂度为O(n)。
核心思想:工作指针后移

单链表的整表创建

什么是整表创建?
头插法建立单链表:
把新的元素放在表头后的第一个位置
先让新节点的next指向头结点之后
然后让表头的next指向新结点
关键代码:

p->next = (*L)->next;
(*L)->next = p;

这里p是每次创建的新元素

尾插法建立单链表:
把新元素放在链表最后
关键代码:

r->next = p;
r = p;

这里p也为每次创建的新元素。

单链表的整表删除

思路:
声明结点p和q
将第一个结点赋值给p,下一结点赋值给q
循环执行释放p和将q赋值给p的操作
代码如下:

q = p->next;
delete(p);
p = q;

这里的q用来存放下一个结点,不然在delete(p)时会把指针也清掉。

静态列表

定义: 用数组藐视的链表称为静态链表
这种描述方法叫做游标实现法:(下图E上应当是0)
在这里插入图片描述
由示例可知:
0下标存储的游标是末尾数据游标,其实是空闲下标位置
末尾元素游标是数据起始的下标
其余游标均为下标加一
具体用法:
用游标去访问下标,这也是上述第三句话的意义所在。

猜你喜欢

转载自blog.csdn.net/qq_41883714/article/details/109505907