文章目录
定义、基本操作
什么时候要传入参数的引用“&” —— 对参数的修改结果需要“带回来”
顺序表
1.静态分配
用数组来存,开辟一片连续的存储空间
将所有数据元素设为默认值,防止之前那个地方有脏数据
如果数组存满了只有等死了,因为静态分配的表长是没法更改的
2.动态分配
拓展容量不方便,要全部移动
3.顺序表的插入
注意第9个是data[8]
第i位之后的元素全部往后移
加两个判断条件
4.顺序表的删除
从后面直接往前覆盖
5.查找
1.按位查找
时间复杂度:O(1) ,顺序表可以立马找到
2.按值查找
单链表
1.定义
不带头结点,写代码更麻烦。对第一个数据结点和后续数据结点的处理需要用不同的代码逻辑;对空表和非空表的处理需要用不同的代码逻辑
2.单链表的插入
①带头结点
如果p=NULL说明i输入的有问题(太大了)
②不带头结点
体现了头结点的好处,不需要额外写代码
③后插
找到位置,直接后插就行(内存有可能分配失败)
时间复杂度 O(1)
④前插
给了p的指针,由于单链表的指针都是指向后面的,不能往前面查,所以只有从头结点开始找p的前驱q(用一个指针q,q→next=p,循环找),找到q后插
p后面插个新结点,把p里的复制进去,再用e去覆盖掉p里的内容(等同于前插)
时间复杂度O(1)
3.单链表的删除
偷天换日,让q指着p后面的,然后把q里的数据弄到p里去,改变一下指针,最后删掉q(否则得找到p的前驱去修改指针)
如果P是最后一个结点,就只有从头找到P的前驱
单链表的局限性:无法逆向检索,有时候不太方便
这些代码有可能考的,选择题出选项什么的
4.查找
①按位查找
②按值查找
③求表的长度
5.创建单链表
①尾插法
②头插法
双链表
1.初始化
2.插入
3.删除
4.遍历
循环链表
1.循环单链表
L指向尾部比较好(因为尾部一下就到头部,头部找过来要很久)
2.循环双链表
静态链表
开辟一个连续的空间,但是里面的内容又是随便放的(有种折中的感觉)
1.定义
2.各个基本操作
初始化静态链表:
把 a[0] 的 next 设为 -1
把其他结点的 next 设为一个特殊值用来表示结点空闲,如 -2
查找:
从头结点出发挨个往后遍历结点
插入位序为 i 的结点:
①找到一个空的结点(next是-2),存入数据元素
②从头结点出发找到位序为 i-1 的结点(-1)
③修改新结点的 next(-1,表示最后一个)
④修改 i-1 号结点的 next(新结点的位置)
删除某个结点:
①从头结点出发找到前驱结点
②修改前驱结点的游标
③被删除结点 next 设为 -2
数据结构里的三件套:逻辑结构,存储结构,基本操作,都是从这三方面展开研究的,所以开放式问题围绕这三个回答即可