持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情。
顺序表的按位查找
获取表L中第i个位置的元素的值。
静态分配:
动态分配:
顺序表的按值查找
在表L中查找具有给定关键字值的元素。
按值查找的时间复杂度:(最深层循环语句的执行次数和问题规模n的关系)
最好情况:目标元素在表头,循环一次O(1) 最坏情况:目标元素在表尾,循环一次O(n) 平均:O(n)
在C语言中不能用“==”直接判断两个结构体是否相等的。(C++可以尝试重载)
LocateElem(L,e)在顺序表L中查找第一个元素值等于e的元素,并返回其位序,从第一个元素开始依次往后检索。
单链表
typedef关键字---数据类型重命名
、
声明头指针,因为带头结点的代码写起来更方便,头结点的下一个节点才能存放数据。
* 单链表(带头结点)按位序插入
在表L中第i位置上插入指定元素e。
i=1(插在表头)
黄色箭头和绿色箭头不能颠倒。
i=3(插在表中)
单链表(不带头结点)按位序插入
指定结点的后插操作
指定结点的前插操作
删除结点(带头结点)
如果p是最后一个结点,只能从表头开始依次寻找p的前驱,这就是单链表的局限性:无法逆向检索,有时不方便,∴该段代码有点小bug,指定结点是最后一个节点时,需特殊处理,问题不大。
封装的好处
按位查找
获取表L中第i个位置的元素的值。
i=8不合法
按值查找
获取表L中查找具有给定关键字值的元素。
求表长度
顺序表可以借助一维数组实现(加长度)。
在链式存储结构下,线性表的存储空间可以是分散不连续的。
双链表
静态链表
不用指针时,想要发挥链表结构的长处可以用一个二维数组来模拟。
静态链表便于插入和删除。
静态链表需要分配较大空间,插入和删除不需要移动元素。
栈
只允许在一段进行插入或删除的线性表(基础为顺序表),先进后出。
上溢出----当栈满时,再做栈运算产生空间溢出的现象。
下溢出----当栈空时,作退栈运算产生的溢出现象。
共享栈
链栈
先进先出
顺序栈和链栈的比较:
时间:基本操作时间复杂度都为O(1)
空间:初始顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和
空间浪费的问题。链栈无栈满问题,只有内存无才会栈满,但每个元素都要
一个指针域,增大开销。
栈的应用:主要在括号匹配、表达式求值、递归中。
中缀求后缀,划括号,将括号内的运算符放到该括号后,再去括号。
中缀求前缀,划括号,将括号内的运算符放到该括号前,再去括号。