一.温故知新
线性表
是n个具有相同类型的数据元素的集合
线性表是一种使用比较广泛的数据结构
线性表在逻辑上是线性的结构,也就相当于是一条直线
但是在物理结构上并不一定是连续的
线性表在物理存储时,通常以数组或者链表的形式存储
顺序表
是用一段连续的存储空间依次存储数据元素的线性结构
一般情况下使用的就是数组,在数组中做增删改查的操作
定长的顺序表 : 使用定长的数组
适用于确定成员个数的场景
不定长的顺序表 : 使用动态开辟的数组
可以根据需求灵活开辟空间
链表
在逻辑结构上是线性的存储,
但是在物理结构体并不是连续的存储结构
链表中数据的顺序根据链表中结点的指针的指向来确定
顺序表的优缺点
优点 : 使用的是连续的存储空间
可以使用下标快速定位到某个成员
缺点 : 定长的顺序表定义之后不能再扩容
插入新的成员以及删除成员,需要挪动后续所有成员
链表的优缺点
优点 : 插入新的成员和删除成员方便,不会造成空间的浪费
缺点 : 访问链表的成员不方便
总结 : 顺序表和链表是相辅相成的,需要在适合的场景下使用
如果写项目工程使用有头双向循环链表合适
如果在笔试面试中碰到链表的题目,一般来说考无头单向链表
===================================
早测
1.移出链表元素
给你一个无头单向不循环链表的首结点l和一个整数 val
请你删除链表中所有等于 val 的节点,并返回新的首结点 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| struct llist_node
{
int val;
struct llist_node *next;
};
struct llist_node* remove(struct llist_node* l, int val)
{
struct llist_node *cur = l;//指向要删除的结点
struct llist_node *back = NULL;
//指向要删除的结点的前一个位置
while(cur != NULL)//判断是否遍历完所有的结点
{
if(cur->val == val)//判断是否是要删除的数据
{
if(back == NULL)//判断删除的是否是第一个结点
{
l = l->next;//改变l的位置
free(cur);//释放第一个结点
cur = l;//改变cur的位置
}
else
{
back->next = cur->next;
free(cur);
cur = back->next;
}
}
else
{
back = cur;
cur = cur->next;
}
}
return l;
}
|
===================================
线性表
两种特殊的线性存储结构(受限制的存储形式)
栈式存储结构
一定要和内存中的栈区区分开
stack
特点 : 先进后出
可以把栈式存储结构抽象成有底的容器
把数据存储到栈式存储结构中 入栈|进栈|压栈|push
从栈式存储结构中取出数据 出栈|退栈|弹栈|pop
存入数据或者取出数据的一端 栈顶|ind
另外一端 栈底
由于栈式存储结构属于线性表中特殊的存储形式
所以既可以用顺序表来实现,也可以用链表来实现
入栈时需要判断,栈是否满了
出栈时需要判断,栈是否空了
队列式存储结构
=================================
作业
1.把今天讲过的内容完完整整的复习一遍
2.把栈式存储结构(三种方式)再重新实现一遍
3.把早测的功能函数再重新实现一遍
=================================
1
2
3
4
5
6
| l
|
V
11->22->11->33->11->44->11->NULL
11
|