数据结构---数组与链表


一、数组

数组的特点
1.在内存中,数组是一块连续的区域
2.数组需要预留空间,在使用前需要提前申请所占内存的大小,不知道需要多大的空间,可能会浪费内存空间,即数组空间利用率低
3.在数组起始位置处,插入数据和删除数据效率低。
插入数据时,待插入位置的的元素和它后面的所有元素都需要向后搬移
删除数据时,待删除位置后面的所有元素都需要向前搬移
4.随机访问效率很高,是一种随机存取结构,时间复杂度可以达到O(1)
因为数组的内存是连续的,想要访问哪个元素,直接从数组的首地址处向后偏移就可以访问到了
5.数组开辟的空间,在不够使用的时候需要扩容,扩容的话,就会涉及到需要把旧数组中的所有元素向新数组中搬移
6.数组的空间是从栈分配的

数组的优点
随机访问性强,查找速度快,时间复杂度为O(1)

数组的缺点
1.头插和头删的效率低,时间复杂度为O(N)
2.空间利用率不高
3.内存空间要求高,必须有足够的连续的内存空间
4.数组空间的大小固定,不能动态拓展

二、链表

链表的特点
1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续
2.链表中的元素至少都会两个属性,一个是数据域,存储数据,另一个是指针域,此指针标记了下一个元素的地址
3.查找数据时效率低,只能顺序存取,时间复杂度为O(N)
因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度达到O(N)
4.空间不需要提前指定大小,是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,故空间的利用率较高
5.任意位置插入元素和删除元素效率较高,时间复杂度为O(1)
6.链表的空间是从堆中分配的

链表的优点
1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
2.内存利用率高,不会浪费内存
3.链表的空间大小不固定,可以动态拓展

链表的缺点
随机访问效率低,时间复杂度为0(N)

三、数组和链表的选择

在这里插入图片描述
数组为随机存取,链表为顺序存取
1.当线性表的长度变化较大,难以预估规模时,应该选择链表
2.当线性表的长度变化不大,容易事先确定规模时,为了节约存储空间,应该选择数组
3.对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组
4.对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表

四、链表的基本使用和算法

数组我们已经比较熟悉了,下面主要是链表的使用
下述内容基于严蔚敏是c语言版数据结构教材,代码有些为伪代码

定义:
首元结点:链表中存储第一个数据元素的结点
头节点:在首元结点前附设的一个结点,其指针域指向首元结点。头结点的数据域可以不存储任何信息,也可以存储其他附加信息,如线性表的长度等。
头指针:指向链表中第一个结点的指针,若设有头节点,则头指针指向头节点,否则指向首元结点

链表添加头节点的好处:
1.便于对首元结点的处理
首元结点的地址保存在头节点中,对其操作可以和其他结点一样,无需特殊处理
2.便于空表和非空表的统一处理
添加头节点后,无论链表是否为空,头指针都指向头节点。当链表为空时,头结点的指针域为空。

链表结点定义

typedef struct LNode {
   
	int data;
	struct LNode* next;
}LNode,*LinkList;

1.链表的创建

void initList(LinkList 
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值