数据结构(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 a[8]是定长数组;

int size 是有效数据个数

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

2.2.2 动态顺序表

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

2.3顺序表的初始化和销毁

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

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

2.4 顺序表的后插和头插

尾插分为两种情况:

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

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

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

增容也分为两种情况:

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

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

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

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

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

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

2.5 顺序表的尾删和头删

尾删的实现:

ps->arr[ps->size-f] = 0;

ps->size--;

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

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

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

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

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

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

再插入对应的数据;

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

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

之后size--就可以实现

2.7 顺序表查找数据

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

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

相关推荐
搬砖的小码农_Sky2 小时前
C语言:数组
c语言·数据结构
先鱼鲨生4 小时前
数据结构——栈、队列
数据结构
一念之坤4 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
IT 青年4 小时前
数据结构 (1)基本概念和术语
数据结构·算法
熬夜学编程的小王4 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
liujjjiyun5 小时前
小R的随机播放顺序
数据结构·c++·算法
Reese_Cool7 小时前
【数据结构与算法】排序
java·c语言·开发语言·数据结构·c++·算法·排序算法
djk88887 小时前
.net将List<实体1>的数据转到List<实体2>
数据结构·list·.net
搬砖的小码农_Sky8 小时前
C语言:结构体
c语言·数据结构
_OLi_9 小时前
力扣 LeetCode 106. 从中序与后序遍历序列构造二叉树(Day9:二叉树)
数据结构·算法·leetcode