数据结构(2)

目录

一、线性表

二、顺序表

[2.1 概念与定义](#2.1 概念与定义)

[2.2 分类](#2.2 分类)

[2.2.1 静态顺序表](#2.2.1 静态顺序表)

[2.2.2 动态顺序表](#2.2.2 动态顺序表)

2.3顺序表的初始化和销毁

[2.4 顺序表的后插和头插](#2.4 顺序表的后插和头插)

[2.5 顺序表的尾删和头删](#2.5 顺序表的尾删和头删)

[2.6 顺序表指定位置的插入和删除](#2.6 顺序表指定位置的插入和删除)

[2.7 顺序表查找数据](#2.7 顺序表查找数据)


一、线性表

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

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

二、顺序表

2.1 概念与定义

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

顺序表的底层结构是数组,对数组进行的封装,实现了常用的增删改查等接口。

2.2 分类

2.2.1 静态顺序表

概念:使用定长数组存储元素。

SLDataType a8是定长数组;

int size 是有效数据个数

静态顺序表的缺陷是:空间给少了不够用,给多了造成空间的浪费

2.2.2 动态顺序表

首先,我们先定义了动态顺序表。如上述代码所示:

2.3顺序表的初始化和销毁

接着,我们定义顺序表的初始化和销毁;

注意这里需要传地址;在每写完一个后记得及时测试;

2.4 顺序表的后插和头插

尾插分为两种情况:

1、空间充足,将数据插入size指向的位置,size++

2、空间不足,先增容,再插入

增容一般呈倍数增加,比如2->.4->8->16......

增容也分为两种情况:

1、连续空间足够,直接扩容

2、连续空间不够,重新找一块地址,分配足够的内存,拷贝数据到新的地址,销毁旧的地址

在这里我们使用realloc函数来增容;在写尾插后,就可以进行测试,并写出打印顺序表的函数。

由于头插和尾差一样也需要先判断空间是否足够,因此我们可以将扩容写成一个函数

接下来,我们就可以实现头插的操作

即原数组整体后移一位。且注意:因为是后移一位,所以应该从最后一位开始移动。

2.5 顺序表的尾删和头删

尾删的实现:

ps->arrps-\>size-f = 0;

ps->size--;

注意:若顺序表为空,不可删除

则就要对size进行assert进行断言

在头删时,将第一个位置以后的数据从后往前移动一位;

2.6 顺序表指定位置的插入和删除

首先,我们先判断插入位置pos位于顺序表中;

在pos之后的数据整体往后移动一位

再插入对应的数据;

注:在删除pos的位置时,pos不能等于size

在删除指定位置时候,pos之后的数据整体向前挪动一位

之后size--就可以实现

2.7 顺序表查找数据

查找这里较为简单。不做过多叙述

由此,顺序表的基本就完成了。

相关推荐
wuyk55514 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-14 小时前
【链表】LC 138.随机链表的复制
数据结构·链表
洋不写bug15 小时前
链表补充练习,双链表的模拟实现
java·数据结构·链表·双链表·底层实现
白狐_79816 小时前
408 数据结构|外部排序:流程与 k 路归并
数据结构·算法
我不会起名字32218 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
不会就选b19 小时前
算法日常・每日刷题--<贪心+大根堆>2
数据结构·算法
事圆则缓19 小时前
Java 常见数据结构与 Android 使用场景
android·java·数据结构
白狐_79820 小时前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
kiracrimson1 天前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
心抵鹊1 天前
归并排序之翻转对(hard)
数据结构·算法