数据结构(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 顺序表查找数据

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

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

相关推荐
@小博的博客21 分钟前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
泉崎2 小时前
11.7比赛总结
数据结构·算法
你好helloworld2 小时前
滑动窗口最大值
数据结构·算法·leetcode
JSU_曾是此间年少4 小时前
数据结构——线性表与链表
数据结构·c++·算法
sjsjs114 小时前
【数据结构-合法括号字符串】【hard】【拼多多面试题】力扣32. 最长有效括号
数据结构·leetcode
blammmp5 小时前
Java:数据结构-枚举
java·开发语言·数据结构
昂子的博客5 小时前
基础数据结构——队列(链表实现)
数据结构
lulu_gh_yu6 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
~yY…s<#>7 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev8 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节