一、二级指针的应用场景
1、在被调函数中,想要修改主调函数中的指针变量,需要传递该指针变量的地址,形参用二级指针接收。
2、指针数组的数组名是一个二级指针,指针数组的数组名作为参数传递时,可用二级指针接收。
指针数组:保存多个指针的数组。 eg:char *a[10]
数组名:数组首元素的地址。
二、内核链表
内核链表是一个没有数据域的双向循环链表。不再将数据存储在链表结点中,而是将结点嵌入到存储的数据中。其结构示意图如下:
包含两个宏定义:
1、offset_of: 获取内核链表中链表结点到结构体起始位置的偏移量。
2、container_of: 通过偏移量获取结构体的首地址(结构体首地址 = 结点首地址 - 偏移量)。
三、栈
1、系统栈:
2、内存中栈区存储的数据类型
1)局部变量
2)函数的形参、函数的返回值
3)函数的调用关系
3、数据结构中的栈
1)栈结构:只允许从一端进行数据的插入和删除的线形存储结构,称之为栈结构。
2)特点:先进后出(FILO)
4、实现方法
1)顺序表(数组)---顺序栈
顺序栈的四种栈的结构:满增栈、满减栈、空增栈、空减栈。
(1)满栈、空栈:按栈顶所在的位置是否存在数据来区分。满栈:先移动栈顶位置,后存入数据(栈顶始终有数据);空栈:先在栈顶存入数据,后移动栈顶位置(栈顶无数据)。
(2)增栈、减栈:按照栈的生长方向区分。增栈:入栈时,栈顶从内存低地址向内存高地址移动;减栈:入栈时,栈顶从内存高地址向内存低地址移动。
2)链式结构---链式栈
(1)栈对象:
(2)应用
A. 链式栈函数的封装
a. 链式栈---创建链式栈函数的封装
b. 链式栈---判断是否为空函数的封装
c. 链式栈---遍历函数的封装
d. 链式栈---入栈(插入数据)函数的封装
e. 链式栈---出栈(删除数据)函数的封装
f. 链式栈---获取栈顶元素函数的封装
g. 链式栈---销毁函数的封装
上述函数封装时所需的头文件
B. 声明部分(头文件)
C. 在主函数中的书写格式
四、队列
1、概念
允许从一端进行数据插入,另一端进行数据删除的线形存储结构,称为队列结构。
插入操作:叫入队操作,插入的这端称为队列的队尾;
删除操作:叫出队操作,删除的这端称为队列的队头。
特点:先进先出(FTFO)
应用:数据缓存
2、实现方式
1)顺序表---顺序队列
顺序队列对象:
顺序队列的尾指针(tail):先存数据、后移到下一结点,尾指针始终没有数据。
在顺序队列中,边存边删会出现假溢出问题(尾指针的下一项为空,没有指向应该指向的首地址),将删除数据空出来的内存没有使用起来(可以用循环队列来解决)。
循环队列:用来实现头指针从最后指向最前的操作。可以解决假溢出问题,但为了区分队空与队满,将来少存储一个数据。
循环队列的判空:队头和队尾处于同一位置,此时任务队列为空。
循环队列的判满:当 队尾+1 跟上队头时,认为此时队列未满。
循环队列的实现:(head + 1)% len
(tail + 1)% len
元素范围:[head , tail )
2)链式表---链式队列
(1) 链式队列对象
(2)应用
A. 链式队列函数的封装
a. 链式队列---创建队列函数的封装
b. 链式队列---判断是否为空函数的封装
c. 链式队列---入队(插入数据)函数的封装
d. 链式队列---出队(删除数据)函数的封装
e. 链式队列---获取队头元素函数的封装
f. 链式队列---销毁函数的封装
g. 链式队列---遍历函数的封装
以上函数需要包含的头文件
B. 声明部分
C. 主函数书写格式
【END】