顺序表和链表介绍
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)。
总结
以上是介绍了顺序表和链表的基本概念。希望大家有所收获。至于链表的增删查改等操作,会在下篇文章介绍。
以上是关于顺序表和链表介绍的主要内容,如果未能解决你的问题,请参考以下文章