当前位置:   article > 正文

【数据结构】顺序表_数据结构顺序表

数据结构顺序表

目录

1.前言

2.线性表

3.顺序表

3.1 概念及结构

3.2 接口实现

1.顺序表初始化

2.顺序表销毁

3.检查空间并扩容

4.顺序表尾插 

5.顺序表头插

6.顺序表尾删

7.顺序表头删

8.顺序表查找

9.顺序表在pos位置插入x

10.顺序表删除pos位置的值

11.顺序表打印

4.数组相关面试题

1.移除元素

2.删除有序数组中的重复项


1.前言

什么是数据结构?

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
在我们以后的项目中,数据结构是必不可少的,因为我们就是在跟数据打交道。而数据结构有许多种,没有一种数据结构能够满足各种场景,所以我们需要学习很多数据结构,彼此都有很多差异。然后当我们在开发中,有什么场景适合哪个数据结构,我们就从我们学习的数据机构中选一个出来用

今天,我们将来学习一个数据结构:顺序表

2.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使
用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

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

3.顺序表

3.1 概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。


顺序表看上去和数组好像有些相似,但是数组当我们定义之后便无法动态改变其长度,而顺序表却能实现动态改变。但是顺序表要求我们要依次紧挨着存储元素,不能像数组一样跳跃间隔存放。

✏️顺序表结构设计

在开始之前,我们可以先创建 SeqList.h的头文件用于存放各个接口(函数)的声明以及各种全局需要的代码,再创建SeqList.c的源文件用于存放各个接口的具体实现,最后再创建一个test.c源文件用于写主函数(测试函数)
这样做能使得代码更加清晰易读

顺序表能够存放各种数据类型的数据,所以我们需要利用结构体

而我们可以在结构体中定义一个变量用于标记存储数据的个数

1.静态顺序表:使用定长数组存储元素

  1. #define N 10
  2. struct SeqList
  3. {
  4. int arr[N];
  5. int size;
  6. };

顺序表我们是想存储各种类型的数据,像如上的写法直接定义int 这不就写死了嘛,所以我们可以利用重定义(便于修改)进行优化

  1. #define N 10
  2. typedef int SLDataType;
  3. struct SeqList
  4. {
  5. SLDataType arr[N];
  6. int size;//存储数据的个数
  7. };

2.动态顺序表:使用动态开辟内存存储

因为动态内存开辟是通过指针接收的,所以结构体中的数据结构定义为指针就能通过realloc函数灵活地动态开辟内存,改变长度

而因为动态改变,所以我们可以再定义一个变量来标记存储空间的大小

  1. typedef int SLDataType;
  2. struct SeqList
  3. {
  4. SLDataType* a;
  5. int size;
  6. int capacity;//存储空间的大小
  7. };

顺序表的结构基本实现后,当我们通过函数调用的时候,会发现结构体的名字太长了

比如作为参数调用函数时:void seqListInit(struct SeqList s1); 

那么我们可以再次利用重定义简化

  1. typedef int SLDataType;
  2. typedef struct SeqList
  3. {
  4. SLDataType* a;
  5. int size; //存储数据的个数
  6. int capacity; //存储空间的大小
  7. }SL;

以上就是我们顺序表的结构了,接下来我们开始实现顺序表的各种接口

3.2 接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表 本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】

推荐阅读
相关标签