单链表专题(上)(顺序表链表线性表)

在开始之前思考一个顺序表的问题
1. 中间/头部的插⼊删除,时间
复杂度为O(N)
2. 增容需要申请新空间,拷⻉数据,释放旧空间。会有不⼩的消耗。
3. 增容⼀般是呈2倍的增⻓,势必会有⼀定的空间浪费。例如当前容量为100,满了以后增容到
200,我们再继续插⼊了5个数据,后⾯没有数据插⼊了,那么就浪费了95个数据空间。
思考:如何解决以上问题呢?
答案是肯定的,  那就是 链表

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尾删

 效果差不多就是这样

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值