1.链表顺序表线性表
链表和顺序表都是线性表
线性表:
1.在逻辑结构上一定是线性的
2.在物理结构上不一定是线性的
链表在物理结构上就不是线性的。
如上图所示:
顺序表分布是连续的一整块的,但是链表在内存的上的分布是杂乱无章的
那么这里就会有一个疑问,既然链表分布是杂乱无章的,那么数据到底是怎么找到的呢
链表就和下面的火车挺像的
火车是一节一节车厢连着的 ,火车连接的地方都有一个钩子把俩节车厢钩在一起,
同理
链表的数据也是
说到底链表就是一个结构体,然后他分为两个部分
1.上面的数字中保存的数据
2.下一个结构体的地址
是的链表就是由一个个节点(结点)组成的
举例:
上图就是由四个节点组成的
顺序表底层是通过数组来实现的,数组的内存分布就是连续的,所以顺序表在逻辑上和物理上都是线性的
链表里面存着下一个数据的指针,他并不是一个数组,他分配的内存自然也不是连续的
顺序表扩容如果满了一般是按照1.5倍扩容,或2倍,但插入的数据一般都会小于阔如的数量,所以就会有空间存在浪费、
链表扩容,他是采用地址,那么他只需要存下那个的地址,自然也就不会存在浪费
那么我们结构体就可以定义成这样
struct SListNode
{
int data;
struct SListNode* next;
};
Node也就是节点的意思
链表就是List ,SLlist就是单链表
ps:链表里面还分为很多种
2.代码实现
老样子先添加三个文件
2.1 链表的打印
SList.h头文件的内容
在text文件里面导入头文件创建四个变量
单链表顾名思义单向的,只往一个方向走
所以我们可以在每一个的数据加上下一个数据的地址
但是正常的链表插入不会用这种方式这种方式只是用来展示
链表的尾插
尾插就需要改变3原来指向的NULL改成指向四然后四指向NULL
接着找到尾节点然后才可以加上数据
还需要写其他的插入(头插任意位置的插入)这些都需要申请空间这里直接把申请空间写成一个函数
2.2节点申请
2.3尾插
2.4头插
2.5尾删
效果差不多就是这样