顺序表和链表介绍

Posted 银背欧尼酱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表和链表介绍相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


本篇梗概

线性表

线性表是N个同类型的数据元素的有限序列。

常见的线性表有:顺序表,队列,链表等

线性表在逻辑上是连续的,也就是连续的一条直线结构。但在物理结构不一定连续,即地址不一定连续。线性表通常以数组和链式结构的形式存储。

在这里插入图片描述
在这里插入图片描述


1.1顺序表

顺序表是一种线性结构,他的元素地址连续。通常采用数组存储。

顺序表分类:

​ 1.静态数据表:使用定长数组存储

​ 2.动态数据表:使用动态开辟的数组存储

//顺序表的静态存储
#define N 100
typedef int SLDataType;

typedef struct SeqList
{
 SLDataType array[N]; // 定长数组
 size_t size; // 有效数据的个数 
}SeqList;
// 顺序表的动态存储
typedef struct SeqList
{
 SLDataType* array; // 指向动态开辟的数组
 size_t size ; // 有效数据个数
 size_t capicity ; // 容量空间的大小
}SeqList;

静态顺序表的空间开大了浪费,开小了不够用,只适用于确定知道需要存多少数据的场景。所以现实中基本都是使用动态顺序表。

在这里插入图片描述

这是顺序表的存储结构,所有的数据都是存储在连续空间当中。当插入或删除元素时需要移动大量数据,插入/删除位置后面的每个元素都要移动,而查找元素只需要根据内存中的地址查找就可以了。

所以时间复杂度时O(N)。而查找元素由于每个数据在内存中的地址都是连续的,所以复杂度是O(1)。


1.2链表

链表是一种非连续非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现。

在这里插入图片描述

常规的申请内存的方式,每个内存空间只能存放数据,不带指针,为了定义这种带指针的空间,需要借助结构体。

//节点的定义
typedef struct SlistNode
{
	DataType data;
	struct SlistNode *next;//定义了一个结构体指针,这样每一个结构体就包含了一个想存储的数据,和一个指向下一个同类型结构体的指针
}Node;
//此时Node就变成了结构体类型(相当于int,float等),是我们人为定义的一个数据类型

链表的种类:

1.单项,双项

2.带头,不带头

3.循环,非循环

在这里插入图片描述

​ 无头单项非循环链表

在这里插入图片描述

​ 带头双向循环链表

无头单向链表和带头双向链表是最常用的。

顺序表和链表对比:

链表插入元素的时间复杂度为O(1),查找元素复杂度为O(N)。

顺序表插入时间复杂度为O(N),查找为O(1)。


总结

以上是介绍了顺序表和链表的基本概念。希望大家有所收获。至于链表的增删查改等操作,会在下篇文章介绍。

以上是关于顺序表和链表介绍的主要内容,如果未能解决你的问题,请参考以下文章

顺序表和链表的区别

C中线性表和链表的区别

线性表——顺序表和链表

C中线性表和链表的区别

顺序表和链表的基本操作,用C语言实现!

链表是顺序表吗?