文章目录
- 1. 数据结构
- 2. 顺序表
- 2.1 顺序表的概念及结构
- 2.1.1 线性表
- 2.1.2 顺序表与数组的差别
- 2.2 顺序表的分类
- 2.2.1 静态顺序表
- 2.2.2 动态顺序表
- 2.3 静态顺序表和动态顺序表的区别
在学完C语言的知识后,我们也该跨入到学习数据结构的领域中来。毕竟学习语法是为解决问题而用的,而问题的解决离不开恰当好处的方法,这些方法就是我们要学习的数据结构。
那么本文章就是我们开启新篇章的起点,这里会介绍一个“新朋友”,名为顺序表。
在讲解顺序表之前,我先跟大家聊一聊什么是数据结构。
1. 数据结构
数据结构是计算机存储、组织数据的方式。
这么说着可能有点干巴,那我就结合一个生活中的例子。
也许大家心里可能都有一个值得陪伴自己一生的人,你们或许还未遇见,或许还在遇见的路途中又或是正在争取着对方,亦或是已经成为能够为对方遮风挡雨的存在。
那我们现在幻想一下,比如失忆的我现在要追求一个自己心爱的人,但是我只记得她的名字,假设每个人的名字的是独一无二的。
第一种方案是:在大街上一个个人的问。显然这种方式是效率低下而且成功率很低的。
第二种方法是:去到警察局问。这个可能有点夸张,但是效率绝对是高的,因为警察局里面能够查询到每个人的身份信息,这就相当于把信息给组织保存起来了。
由这个离谱的例子,你可以感受到,如果我们能够将一些信息按照某种方式进行保存,可以方便我们日后对数据进行一系列的操作。这便是数据结构的魅力所在。
总结:
- 能够存储数据(如顺序表、链表等结构)
- 存储的数据能够方便查找
那什么样的数据结构才算是最好的呢?
其实学过C语言的读者们,早就学过一种数据结构——数组。因此数组是最简单的数据结构。
【思考】有了数组,为什么还要学习其他的数据结构?
假定数组有10个空间,现在已经使用了5个,我们要向数组插入数组,步骤如下:
- 求出数组长度
- 求出数组当前有效数据个数
- 向下标为有效数据个数的位置插入数据(注意:这里是否要判断数组是否满了,满了还能继续插入吗?)
而且当数组的大小不够用时,我们又该怎么办?
假设数据十分庞大,频繁的获取数组有效数据的个数会直接影响到程序运行效率。
结论:最基础的数据结构能够给我们提供的操作已经不能完全满足复杂算法的实现。
2. 顺序表
2.1 顺序表的概念及结构
2.1.1 线性表
线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性的,也就是连续的一条直线。但是在物理结构(内存)上并不一定连续,线性表在物理上存储时,通常以数组和链式结构的形式存储。
线性表就相当于我们日常生活中所讲的蔬菜,蔬菜包括大白菜、青菜…,线性表中就是指这一类具有此特点的数据结构的集合。
那我们如何理解线性表中的逻辑结构和物理结构?
其实方法很简单,我们可以想象到一大群人站在餐厅门口排队等待叫号吃饭,但是我们我们所排的队伍在服务员的肉眼上看并不是完全笔直的,但是在他们的脑中我们所排的队伍就是笔直的,这也就是逻辑上和物理上的区别。
那我们所说的顺序表因为器底层是数组,所以其在物理上是连续的,在逻辑上肯定也是连续的,因此顺序表就是线性表。
2.1.2 顺序表与数组的差别
顺序表的底层结构是数组,对数组的封装,实现了常用的增删查改等接口。
2.2 顺序表的分类
顺序表分为静态顺序表和动态顺序表。
2.2.1 静态顺序表
定义:使用定长的数组存储数据元素。
代码实现:
#define M 100
typedef int SLDataType;
struct SeqList
{
//int arr[100]; //不建议这样写,因为后期的维护比较麻烦
SLDataType arr[M];
int size;//用来记录有效的数据个数
};
2.2.2 动态顺序表
定义:使用可调整的空间来存储数据。
代码实现:
typedef int SLDataType;
struct SeqList
{
SLDataType* arr; //指向动态开辟空间的结构体变量成员
int size; //有效数据的个数
int capacity; //当前空间大小
};
2.3 静态顺序表和动态顺序表的区别
如果要你从静态顺序表和动态顺序表中二选一,从各方面考虑,你会选择选谁?
我的答案是动态顺序表 。从静态顺序表的缺点我们可以看到,所存储数据的个数不能灵活变通,一旦确认下来之后就无法改变了。而动态顺序表可以灵活的改变所存储的数据个数。
那么至此,详解顺序表(上)的内容就讲解完毕了。在详解顺序表(下)中,我将会给出顺序表中的各种操作的源码,以及帮助读者跳过一些初学程序员经常踩的坑。
如果觉得本文还不错的话,麻烦给偶点个赞吧!