线性表复习提纲
线性表的基本操作:
- 初始化
- 销毁
- 判断为空
- 求长度
- 输出
- 查找
- 按位查找
- 按值查找
- 插入
- 删除
线性表的存储结构
- 顺序存储结构
- 链式存储结构
- 单链表
- 双链表
- 循环链表
顺序表
顺序表的类型定义
typedef ElemType char;
typedef struct
{
ElemType data[MAXSIZE];
//线性表的长度
int length;
}SqList;
顺序表的基本操作
见上方线性表的基本操作
顺序表典型例题
1.设顺序表L有10个整数。设计一个算法,以第一个元素为分界线(基准),将所有小于等于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面。
解题思路:用两个变量i,j同时从顺序表的前后开始扫描,j遇到小于等于的元素时停止,i遇到大于的元素时停止,交换两元素位置,重复直到i=j,即是第一个元素应该插入的位置。
2.荷兰国旗问题:设有一个条块序列,每个条块为红(0)、白(1)、兰(2)三种颜色中的一种。假设该序列采用顺序表存储,设计一个时间复杂度为O(n)的算法,使得这些条块按红、白、兰的顺序排好,即排成荷兰国旗图案。
解题思路:
该算法的解题思路可以类比于上述第一题。用i、j分别指向顺序表的前后,新增变量k用来遍历顺序表,若k对应为值0,则k,i交换并各自增1,若k对应1,则k自增1,若k对应2,则j,k交换,j自减1,k不动
链表
需要知道的几点
- 头指针、头节点、首节点、尾指针
- 头节点的优势
- 第一个节点的操作和表中其他节点的操作相一致。
- 统一空表和非空链表的处理
- 存储密度
单链表
单链表的节点类型定义如下
typdef struct LNode
{
ElemType data;
//指向后继节点
struct LNode *next;
}LinkNode;
单链表的特点:当访问过一个节点之后,只能接着访问它的后继节点,而无法访问它的前驱结点。
单链表表的基本操作
见上方线性表的基本操作
单链表的操作有以下几点需要注意:
- 建立单链表的常用方法有两种
- 头插法
- 尾插法
- 链表在进行操作时,总是需要找到其前驱结点
双链表
双链表的优点
- 从任一节点出发可以快速找到其前驱结点和后继结点。
- 从任一节点出发可以访问其他节点。
双链表的节点类型
typedef struct DNode
{
ElemType data;
//指向后继结点
struct DNode *next;
//指向前驱结点
struct DNode *prior;
}DLinkNode;
循环单链表
与普通单链表相比,循环单链表的特点
- 链表中没有空指针域
- p所指节点为尾节点的条件:p->next == 头节点
循环双链表
与非循环双链表相比,循环双链表的特点
- 链表中没有空指针域
- p所指节点为尾节点的条件:p->next == 头节点
- 从头节点找到尾节点只用一步操作
线性表的应用
好难啊,先过吧