当前位置: 首页 > news >正文

顺序表【数据结构】

文章目录

  • :star2:1. 顺序表概念
  • :star2:2. 框架
  • 3. 基本功能
    • 3.1 头文件
    • :star:3.2 初始化
    • :star:3.3 扩容
    • :star:3.4 打印
    • :star:3.5 尾插
    • :star:3.6 头插
    • :star:3.7 尾删
    • :star:3.8 头删
    • :star:3.9 指定插入
    • :star:3.10 指定删除
    • :star:3.11 查找
    • :star2:3.12 注意事项
  • 4. 顺序表的缺点

🌟1. 顺序表概念

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

将数据一个一个连续的存放在数组中,这种存储结构是顺序结构,采用顺序结构的线性表简称为顺序表
顺序表一般可以分为

  1. 静态顺序表 :使用定长数组存储数据
    在这里插入图片描述
  2. 动态顺序表(本章实现):动态开辟内存来存放数据
    在这里插入图片描述

🌟2. 框架

较大程序分3个及以上文件来写,这里分三个文件

  • SeqList.c
  • SeqList.h
  • Text.c

SeqList.c文件用来实现与顺序表有关的函数
SeqList.h文件用来声明函数和结构体
Text.c文件用来测试代码是否正确

3. 基本功能

顺序表需要实现的基本功能有

  • 头删
  • 尾删
  • 头插
  • 尾插
  • 随机删
  • 随机插
  • 查找
  • 打印
  1. 在正式实现顺序表功能之前,我们先对顺序表执行初始化,将顺序表的初始容量置为0,初始化函数SeqListInit
  2. 当我们插入数据时,需要检查Capacity是否满了,若满了,则需要扩容,扩容函数SeqListCheckCapacity

3.1 头文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLtype;
typedef struct
{SLtype* a;	//a是动态开辟的数组size_t size;	//有效数据的个数size_t capcity;//动态开辟数组的容量
}SeqList;void SeqListInit(SeqList* ps);
//扩容
void SeqListCheckCapacity(SeqList* ps);
//打印
void SeqListPrint(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLtype pos);
//尾删
void SeqListPopBack(SeqList* ps);
//头插
void SeqListPushFront(SeqList* ps, SLtype pos);
//头删
void SeqListPopFront(SeqList* ps);
//随机插入
void SeqListInsert(SeqList* ps, int pos, SLtype data);
//随机删除
void SeqListDelecate(SeqList* ps, int pos);

以上函数的形参均是SeqList*类型的,因为我是将上述函数放在测试函数中进行测试,因此需要指针作为形式参数,如果形参是SeqList类型,则形参的改变不会影响实参,即顺序表的数据不会收到改变

⭐️3.2 初始化

初始化函数形参定义为顺序表类型的指针SeqList* ps

为了让顺序表类型SL变量有意义,先将SL的a成员赋值为NULL,capacity size成员赋值为0

void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->capcity = ps->size = 0;

⭐️3.3 扩容

当容量满了后,顺序表选择将容量扩成原来最大容量的2倍,这样既不会浪费太多空间,也不会扩容太频繁,事实上,随着扩容的次数逐渐增多,一次扩容所产生的空间逐渐增加
扩容需要使用realloc函数
在这里插入图片描述
注:当memblock是NULL时,realloc会进行malloc的操作

void SeqListCheckcapacity(SeqList* ps)
{if (ps->size == ps->capacity) //有效数据的个数和最大容量相等时,需要扩容{ps->capacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//一开始将最大容量设置为4,后面扩成2倍ps->a = (SeqListDataType*)realloc(ps->a, sizeof(SeqListDataType) *  ps->capacity);assert(ps);}
}

⭐️3.4 打印

注意打印的个数是有效数据的个数,而不是最大容量

void SeqListPrint(SeqList* ps)
{for (int i = 0; i < ps->size; i++) //打印有效数据{printf("%d ", ps->a[i]);}printf("\n");
}

⭐️3.5 尾插

因为size标记的就是顺序表的尾部,所以尾插较简单,只需要将a[size]赋值为插入的元素
在这里插入图片描述

void SeqListPushBack(SeqList* ps, int pos)
{//当顺序表的容量满了SeqListCheckcapacity(ps);ps->a[ps->size] = pos;ps->size++;//有效数据+1
}

⭐️3.6 头插

头插需要将所有的数据从前往后移动,并且保证挪动方向是[size-1]->[size],[size-2]->[size-1]……

void SeqListPushFront(SeqList* ps, int pos)
{SeqListCheckcapacity(ps);size_t cnt = 0;while (cnt < ps->size)//有多少个有效数据,移动多少次{ps->a[ps->size - cnt] = ps->a[ps->size - 1 - cnt];cnt++;}ps->a[0] = pos;ps->size++;
}

⭐️3.7 尾删

尾删很简单,只需要将有效数据的个数-1即可,即使该数据在动态开辟的数组中,但是不在有效数据范围内最后也不会打印

void SeqListPopBack(SeqList* ps)
{assert(ps->size);//注意当有效数据为0时不能够删数据ps->size--;
}

⭐️3.8 头删

头删和头差类似,都需要挪动其他的有效数据,头删时挪动方向是从后往前挪,并且保证最开始是[1]->[0],[2]->[1]……

void SeqListPopFront(SeqList* ps)
{assert(ps->size);size_t begin = 1;while (begin <= ps->size - 1)//size个有效数据移动size-1次{ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

⭐️3.9 指定插入

有效数据元素为4时,插入到下标pos为2的位置,需要挪动数据3次
在这里插入图片描述
size越大,挪动的次数越多,pos越小,挪动的次数越多,因此在有效数据为size的数组中,将数据差到pos位置,需要挪动数据size-pos+1次,挪动方向[size-1]->[size],[size-2]->[size-1]……

void SeqListInsert(SeqList* ps, int pos, SeqListDataType data)
{assert(pos >= 1 && pos <= ps->capacity);//判断插入的位置是否合法SeqListCheckcapacity(ps);size_t cnt = 0;//一共循环size+1-pos次while (cnt < ps->size - pos + 1){ps->a[ps->size - cnt] = ps->a[ps->size - 1 - cnt];cnt++;}ps->a[pos - 1] = data;ps->size++;//有效数据+1
}

⭐️3.10 指定删除

4个有效数据删除位置为2的元素需要挪动数据2次
在这里插入图片描述
推测size个有效数据删除位置为pos的元素需要挪动数据size-pos次,挪动方向[pos]->[pos-1],[pos+1]->[pos]……

void SeqListDelecate(SeqList* ps, int pos)
{assert(ps->size);assert(pos >= 0 && pos <= ps->size);//一共循环size-pos次while (pos < ps->size){ps->a[pos - 1] = ps->a[pos];pos++;}ps->size--;
}

⭐️3.11 查找

查找很简单,直接遍历

void SeqListFind(SeqList* ps, int key)
{for (size_t i = 0; i < ps->size; i++){if (key == ps->a[i]){printf("The pos is %d\n", i + 1);return;}}printf("Fail Find!\n");
}

🌟3.12 注意事项

  1. 凡是插入时,需要使用assert来判断插入位置是否合法
  2. 插入数据时,有效数据的个数需要+1,删除数据时,有效数据的个数需要-1

4. 顺序表的缺点

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

针对顺序表的缺陷,我们研究出了链表,链表可以弥补顺序表得缺点,我们下次内容来研究如何实现链表

相关文章:

顺序表【数据结构】

文章目录:star2:1. 顺序表概念:star2:2. 框架3. 基本功能3.1 头文件:star:3.2 初始化:star:3.3 扩容:star:3.4 打印:star:3.5 尾插:star:3.6 头插:star:3.7 尾删:star:3.8 头删:star:3.9 指定插入:star:3.10 指定删除:star:3.11 查找:star2:3.12 注意事项4. 顺序表的缺点&#…...

SNAP中根据入射角和干涉图使用波段计算器计算垂直形变--以门源地震为例

SNAP中根据入射角和相干图使用波段计算器计算垂直形变--以门源地震为例0 写在前面1 具体步骤1.1 准备数据1.2 在SNAP中打开波段运算Band Maths1.3 之前计算的水平位移displacement如下图数据的其他处理请参考博文在SNAP中用sentinel-1数据做InSAR测量&#xff0c;以门源地震为例…...

Ubuntu20.04中Docker安装与配置

一、安装 1、卸载可能存在的旧版本 sudo apt-get remove docker docker-engine docker-ce docker.io2、更新apt包索引 sudo apt-get update显示“正在读取软件包列表… 完成” 3、安装以下包以使apt可以通过HTTPS使用存储库(repository) sudo apt-get install -y apt-tran…...

pytorch权值初始化和损失函数

pytorch权值初始化和损失函数 权值初始化 梯度消失与爆炸 针对上面这个两个隐藏层的神经网络&#xff0c;我们求w2的梯度 可以发现&#xff0c;w2的梯度与H1&#xff08;上一层网络的输出&#xff09;有很大的关系&#xff0c;当h1趋近于0时&#xff0c;w2的梯度也趋近于0&am…...

maven将jar文件上传至本地仓库及私服

maven官方仓库有些依赖并不存在&#xff0c;现在项目都是maven直接获取jar&#xff0c;当maven获取不到时&#xff0c;需要我们把jar上传至maven仓库。已 ImpalaJDBC41.jar 文件为例&#xff0c;如&#xff1a;希望上传后&#xff0c;设置的依赖为&#xff1a;<dependency&g…...

前端学习第三阶段-第1、2章 JavaScript 基础语法

01第一章 JavaScript网页编程课前导学 1-1 JavaScript网页编程课前导学 02第二章 JavaScript 基础语法 2-1 计算机基础和Javascript介绍 01-计算机基础导读 02-编程语言 03-计算机基础 04-JavaScript初识导读 05-初始JavaScript 06-浏览器执行JS过程 07-JS三部分组成 08-JS三种…...

hibernate学习(二)

hibernate学习&#xff08;二&#xff09; 一、hibernate常见配置&#xff1a; 1.XML提示问题配置&#xff1a; 二、hibernate映射的配置&#xff1a; &#xff08;1&#xff09;class标签的配置&#xff1a; 标签用来建立类与表之间的映射关系属性&#xff1a; 1.name&…...

平安银行LAMBDA实验室负责人崔孝林:提早拿到下一个计算时代入场券

量子前哨重磅推出独家专题《“量子”百人科学家》&#xff0c;我们将遍访全球探索赋能“量子”场景应用的百位优秀科学专家&#xff0c;从商业视角了解当下各行业领域的“量子”最新研究成果&#xff0c;多角度、多维度、多层面讲述该领域的探索历程&#xff0c;为读者解析商业…...

linux下进不去adb

linux 进不去adb cat /sys/kernel/debug/usb/devices 查看是否有adb口 首先查看adb是否被识别成串口 option 如果被识别成串口 方法1&#xff1a; https://patchwork.kernel.org/project/linux-usb/patch/20180723140220.7166-1-romain.izard.progmail.com/ diff --git a/dri…...

【SPSS】多因素方差分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 方差分析概述 多因素方差分析原理...

我的投稿之旅

一、铁道科学与工程学报选择这个期刊的原因是&#xff1a;感觉影响因子较低&#xff0c;而且实验室有师兄师姐中过这个期刊&#xff0c;所以抱着试一试的心态投了。投稿之前需要去官网注册账号由于方向不一致&#xff0c;被退稿了“您的稿件内容不属于本刊刊载范畴&#xff0c;…...

51单片机DS18B20的使用

文章目录前言一、DS18B20介绍二、单总线协议三、DS18B20引脚说明四、DS18B20程序编写1.DS18B20复位函数2.DS18B20存在检测3.DS18B20读取一个bit和一个byte函数4.DS18B20写一个字节函数5.开始温度转换函数6.DS18B20初始化函数7.DS18B20读取温度函数五、代码测试总结前言 本篇文…...

Vue组件原理知识(1)

Vue 组件知识整理&#xff08;1&#xff09;文章目录Vue 组件知识整理&#xff08;1&#xff09;一、组件介绍1.1 传统方式与组件方式编写应用对比二、组件使用2.1 非单文件组件的使用**1. 组件的创建****2. 组件的注册****3. 组件的使用****4. Vue中使用组件的三大步骤总结***…...

Linux:IO库函数

目录标准库IO函数一、fopen二、fwrite三、fread四、fseek五、fclose在编写程序时&#xff0c;离不开IO操作&#xff0c;最常见的IO操作就是用printf函数进行打印&#xff0c;本文主要介绍的是封装后的IO库函数。 标准库IO函数 常使用的IO库函数如下&#xff1a; 函数作用fop…...

Go爬虫学习笔记

N002.02 Go分布式爬虫实战 开篇 学习三阶段 入门&#xff0c;照猫画虎底层&#xff0c;了解方方面面&#xff0c;深入阅读源码和书籍借助开源组件来进行复杂设计&#xff0c;窥探各个组件赋能业务 分布式系统&#xff1a; 扩展性一致性可用性高并发微服务 爬虫&#xff1…...

数据结构课程设计:高铁信息管理系统(C++实现)

目录 简介实验输出实验要求代码运行环境结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖…...

Python 模块之 datetime

datetime 对象格式化为字符串 标准转换格式符号&#xff1a; %a 本地星期的短名称 如&#xff1a;Sun, Mon, ..., Sat (en_US); So, Mo, ..., Sa (de_DE) %A 本地星期全名称 如 &#xff1a;Sunday, Monday, ..., Saturday (en_US);Sonntag, Montag, ..., Samstag (de_DE) %w…...

linux安装编译ffmpeg

ffmpeg下载&#xff1a;http://ffmpeg.org/releases可以下载适合自己的版本。我下载的是5.0版本&#xff0c;然后解压&#xff1a;tar xvf ffmpeg-5.0.tar.gz进入ffmpegcd ffmpeg-5.0编译ffmpeg./configure --prefix/root/ffmpeg //编译文件存放的路径如果是交叉编译添加以下参…...

嵌入式Linux驱动开发(二)LED驱动

1. Linux下LED驱动原理 与裸机区别在于&#xff0c;编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写&#xff0c;linux下需要经过MMU。 1.1 地址映射相关概念 1&#xff09;MMU&#xff08;Memory Manage Unit - 内存管理单元&#xff09;&#xff1a; …...

C++学习

强制转换运算符 C 引入了四种不同的强制转换运算符以进行强制转换&#xff1a; const_caststatic_castreinterpret_castdynamic_cast C语言强制类型转换缺点&#xff1a; 主要是为了克服C语言强制类型转换的以下三个缺点。 没有从形式上体现转换功能和风险的不同。 例如&am…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...