Professional Documents
Culture Documents
( 1 )顺序表的定义
typedef struct {
datatype data[maxsize]; // 顺序表数据域
int n; // 顺序表长度
} sqlist;
…… a[i] a[i+1]
A …… 16 9
上节回顾
( 2 )顺序表的插入运算
Insert(L,i,x) 表示在顺序表 L 的第 i 个元素前插入数
据x
① 检查顺序表是否已满
② 移动数据,最后一个元素开始往前至第 i 个元素,
将每个元素后移一位
③ 插入数据
时间复杂度:
最好——插入位置在表尾,不用移动数据, O(1)
平均, O(n)
上节回顾
( 3 )顺序表的删除运算
Delete(L,i) 表示把顺序表 L 的第 i 个元素删除
① 检测表是否为空
② 移动数据,从第 i 个元素开始,将每个元素前移一
位
时间复杂度:
最好——删除位置在表尾,不用移动数据, O(1)
平均, O(n)
上节回顾
( 4 )顺序表的查找运算
Locate(L,x) 表示寻找顺序表 L 中值为 x 的元素位置
for 顺序表中每一个元素 ai
if ai == k return i;
return 0;
时间复杂度:
最好——待查数据在表头,只比较一次, O(1)
最坏——待查数据在表尾 / 不存在,比较 n/n+1 个数据
, O(n)
平均, O(n)
课堂练习
( 1 )顺序表的优点是( )
A. 插入方便 B. 删除方便
C. 随机读取方便 D. 节省空间
答案: C
课堂练习
( 2 )下面应用,不适合采用顺序表的是( )
A. 逆转线性表内的元素
B. 求线性表奇数位置上的元素之和
C. 快速排序中的划分操作
D. 字符串中的替换操作
答案: D
分析:
A ,前后元素交换; B ,随机读取奇数位置的元素; C
,交替扫描; D ,考虑到待替换和被替换的字符串长短
不同,可能需要频繁地前移或后移数据
课堂练习
( 3 )在一个长度为 n (n≥ 1) 的顺序表中的第 i 个元
素之前插入一个元素时,需要向后移动( )个元素。
答案:
( 3 ) n-i+1 ,即从 i 到 n 之间的元素个数
( 4 ) n-1 ,当被删元素位于表头,则数据移动个数最
多,需移动 n-1 个
第 4 讲 链表
2.3 线性表的链接实现
顺序表的问题:
( 1 )插入、删除数据需要移动大量的数据
( 2 )需要预分配大量的空间
解决方法:
用一组任意的存储单元来存放线性表的结点,结点之间
的逻辑关系用指针(内存地址)来描述
( 1 )插入和删除结点时,只需要修改指针指向,不需
要移动数据在内存的位置
( 2 )可实现动态分配空间,需要时才生成结点
链表
2.3 线性表的链接实现
链表:采用链接存储结构的线性表,链表中的数据元素用
结点来描述,用指针来链接
head ……
结点:是一个结构体类型,包括两个域——数据域和指针
域 数据域 指针域 指针域 数据域 指针域
( 1 )数据域,存放结点的数据,可以包含多种类型的数据
( 2 )指针域,记录相邻结点的地址(不连续),体现当前
结点与相邻结点的逻辑关系
2.3 线性表的链接实现
链表的主要分类:
单链表 循环链表
• 每个结点只有一个指针域
• 每个结点只有一个指针域
• 尾部结点与首结点相连
head ˄
head
双链表 静态链表
• 每个结点有两个指针域,分别与 • 用数组下标代替指针
前趋和后继结点相连
next next ˄ 3 9 8 7 2 6 10 5 4
head
˄ front front a b c d e f g h i
2.3.1 单链表
最常见的链表,其结点只有一个指针域,用于指向后
继结点
头指针
• 指向单链表的首结点
• 单链表的入口 data next
• 作为单链表名称
结点
空表时, head=NULL head NULL
2.3.1 单链表
带头结点的单链表,即在单链表首结点前设置的一个
特殊的结点
表结点
head
× D D D ……
头结点
• 数据域不用(或用于记录链表 统一空表与非
元素个数) 空表的操作
• 指针域指向单链表首结点
// 先创建二维数组
int** p3 = (int**) malloc(m*n*sizeof(int));
// 再循环指定每一行的空间大小
for(int i=0;i<m;i++)
p3[i] = (int*) malloc(n*sizeof(int));
2.3.1 单链表
结点的动态定义,访问和释放
( 1 )动态定义,即需要时从内存中申请空间
C++ 版(利用关键字 new )
(*p).data = 10;
// 先通过 * 运算符获取 p 指向的结点,再通过 . 运算符访
问域
pnext = NULL;
// 通过运算符直指通过指针访问结点域
2.3.1 单链表
结点的动态定义,访问和释放
( 3 )结点的释放( delete )
删除结点后,结点所占的空间要释放处理,防止内存资
源浪费
释放单个结点
释放一个结点数组