【数据结构--顺序表】

顺序表和链表

1.线性表:

  • 线性表是n个具有相同特性(相同逻辑结构,物理结构)的数据元素的有限序列。常见的线性表有:顺序表,链表,栈,队列,字符串…
  • 线性表在逻辑上是线性结构,也就说是连续的一条直线。但在物理结构上不一定是连续的,线性表在屋里上存储时,通常以数组和链式结构的形式存储。
  • 逻辑结构:抽象结构,人为想象。比如数组里有五个数据,我们抽象为一个长方形框;比如把排队买东西的人抽象为一条直线
  • 物理结构:存储时分配的物理空间(数组物理结构是连续的,因为分配的空间是连续的)

2.顺序表(逻辑结构:线性;物理结构:线性)

2.1 概念与结构

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

2.2 顺序表与数组的区别:

顺序表底层是数组,对数组实现封装,实现了常用的增删查改操作的接口(可以直接调用顺序表中增删查改相关方法)
在这里插入图片描述

2.3 顺序表的分类

2.3.1 静态顺序表
  • 使用定长数组存储数据
//静态顺序表
typedef int SLDataType;
#define N 6
typedef struct SeqList
{SLDataType a[N];//定长数组int size;//有效数据个数,下图有效数据个数为4,指向a[4]
}SL;

在这里插入图片描述

2.3.2 动态顺序表

//动态顺序表--运行时按需申请空间
typedef struct SeqList
{SLDataType* arr;int size;//有效数据个数int capacity;//空间容量
}SL;

在这里插入图片描述

//头文件--SeqList.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
//定义动态顺序表的结构
typedef int SLDataType;
typedef struct SeqList
{SLDataType* arr;//存储数据int size;//有效数据个数int capacity;//空间容量大小
}SL;
void SLInit(SL* ps);void SLPrint(SL* ps);
void SLInit(SL* ps);
void SLDestroy(SL* ps);//尾插
void SLPushBack(SL* ps, SLDataType x);
//头插
void SLPushFront(SL* ps, SLDataType x);//尾删
void SLPopBack(SL* ps);
//头删
void SLPopFront(SL* ps);//查找
int SLFind(SL* ps, SLDataType x);
//指定位置之前插⼊
void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置之后插入数据
void SLInsertAfter(SL* ps, int pos, SLDataType x);
//删除pos位置的数据
void SLErase(SL* ps, int pos);
//实现文件--SeqList.c
#include"SeqList.h"
void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;}
void CheckCapacity(SL* ps)
{int Newcapacity = ps->capacity == 0?4 : 2 * ps->capacity;//如果空间大小为0,就分配四个字节空间if (ps->capacity == ps->size){SLDataType* tmp = (SLDataType*)realloc( ps->arr, Newcapacity * sizeof(SLDataType));//realloc分配成功返回void*//realloc的第二个参数是字节数,可以给数字,比如12,就代表十二个字节//若用来存储12个int类型的数据,需要12*sizeof(int)//malloc(15)if (tmp == NULL){perror("error");exit(1);}ps->capacity = Newcapacity;ps->arr = tmp;;}
}
void SLPushBack(SL* ps, SLDataType x)//尾插
{assert(ps);//ps为指针变量,检查指向的地址是否为空,与初始化ps->arr=NULL无关CheckCapacity(ps);//检查空间是否足够ps->arr[ps->size] = x;//不可以直接写成size,访问指针变量的结构体成员必须用箭头ps->size++;
}
void SLPushFront(SL* ps, SLDataType x)//头插
{assert(ps);CheckCapacity(ps);for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i-1];}ps->arr[0] = x;ps ->size++; } 
void SLPopBack(SL* ps)//尾删
{assert(ps && ps->size);ps->size--;//这就是删除方法,之间减少数据的数量}
void SLPopFront(SL* ps)//头删
{for (int i = 1; i<ps->size; i++){ps->arr[i - 1] = ps->arr[i];}ps->size--;
}
int SLFind(SL* ps, SLDataType x)
{for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x){return i;}}return -1;//即没找到
}
void SLInsert(SL* ps, int pos, SLDataType x)//在指定位置之前插入数据
{assert(ps&&ps->size);CheckCapacity(ps);for (int i = ps->size; i >pos; i--){ps->arr[i] =ps-> arr[i - 1];}ps->arr[pos] = x;ps->size++;}
void SLInsertAfter(SL* ps, int pos, SLDataType x)//在指定位置之后插入数据
{assert(ps->size && ps);CheckCapacity(&ps);for (int i = ps->size; i > pos+1; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos + 1] = x;ps->size++;
}void SLPrint(SL* ps)//可以不用指针 ,用指针可以减少拷贝提高效率
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}
}
void SLErase(SL* ps, int pos)//删除指定位置的数据
{assert(ps && ps->size);if (pos >= ps->size){perror("该位置不存在");return 1;}for (int i = pos; i < ps->size-1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--;
}
void SLDestroy(SL*ps)
{if (ps->arr)free(ps->arr);ps->arr = NULL;ps->size = ps->capacity = 0;
}
//测试文件--test.c
#include"SeqList.h"
void test01()
{SL sl;SLInit(&sl); SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushFront(&sl, 8);SLPushFront(&sl, 9);SLPushFront(&sl, 10);/*SLPopBack(&sl);SLPopFront(&sl);SLPopFront(&sl);*//*int c=SLFind(&sl, 10);printf("%d\n", c);*/SLInsert(&sl, 1, 5);SLInsertAfter(&sl, 2, 7);/*SLErase(&sl, 2);*/SLPrint(&sl);SLDestroy(&sl);
}
int main()
{test01();return 0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96766.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyTorch】图像多分类部署

如果需要在独立于训练脚本的新脚本中部署模型&#xff0c;这种情况模型和权重在内存中不存在&#xff0c;因此需要构造一个模型类的对象&#xff0c;然后将存储的权重加载到模型中。加载模型参数&#xff0c;验证模型的性能&#xff0c;并在测试数据集上部署模型from torch imp…

FS950R08A6P2B 双通道汽车级IGBT模块Infineon英飞凌 电子元器件核心解析

一、核心解析&#xff1a;FS950R08A6P2B 是什么&#xff1f;1. 电子元器件类型FS950R08A6P2B 是英飞凌&#xff08;Infineon&#xff09; 推出的一款 950A/800V 双通道汽车级IGBT模块&#xff0c;属于功率半导体模块。它采用 EasyPACK 2B 封装&#xff0c;集成多个IGBT芯片和二…

【系列文章】Linux中的并发与竞争[05]-互斥量

【系列文章】Linux中的并发与竞争[05]-互斥量 该文章为系列文章&#xff1a;Linux中的并发与竞争中的第5篇 该系列的导航页连接&#xff1a; 【系列文章】Linux中的并发与竞争-导航页 文章目录【系列文章】Linux中的并发与竞争[05]-互斥量一、互斥锁二、实验程序的编写2.1驱动…

TensorRT 10.13.3: Limitations

Limitations Shuffle-op can not be transformed to no-op for perf improvement in some cases. For the NCHW32 format, TensorRT takes the third-to-last dimension as the channel dimension. When a Shuffle-op is added like [N, ‘C’, H, 1] -> [‘N’, C, H], the…

Python与Go结合

Python与Go结合的方法Python和Go可以通过多种方式结合使用&#xff0c;通常采用跨语言通信或集成的方式。以下是几种常见的方法&#xff1a;使用CFFI或CGO进行绑定Python可以通过CFFI&#xff08;C Foreign Function Interface&#xff09;调用Go编写的库&#xff0c;而Go可以通…

C++ 在 Visual Studio Release 模式下,调试运行与直接运行 EXE 的区别

前言 在 Visual Studio (以下简称 VS) 中开发 C 项目时&#xff0c;我们常常需要在 Debug 和 Release 两种构建模式之间切换。Debug 模式适合开发和调试&#xff0c;而 Release 模式则针对生产环境&#xff0c;进行代码优化以提升性能。然而&#xff0c;即使在 Release 模式下&…

南京方言数据集|300小时高质量自然对话音频|专业录音棚采集|方言语音识别模型训练|情感计算研究|方言保护文化遗产数字化|语音情感识别|方言对话系统开发

引言与背景 随着人工智能技术的快速发展&#xff0c;语音识别和自然语言处理领域对高质量方言数据的需求日益增长。南京方言作为江淮官话的重要分支&#xff0c;承载着丰富的地域文化和语言特色&#xff0c;在语言学研究和方言保护方面具有重要价值。本数据集精心采集了300小时…

基于LSTM深度学习的电动汽车电池荷电状态(SOC)预测

基于LSTM深度学习的电动汽车电池荷电状态&#xff08;SOC&#xff09;预测 摘要 电动汽车&#xff08;EV&#xff09;的普及对电池管理系统&#xff08;BMS&#xff09;提出了极高的要求。电池荷电状态&#xff08;State of Charge, SOC&#xff09;作为BMS最核心的参数之一&am…

Golang语言之数组、切片与子切片

一、数组先记住数组的核心特点&#xff1a;盒子大小一旦定了就改不了&#xff08;长度固定&#xff09;&#xff0c;但盒子里的东西能换&#xff08;元素值可变&#xff09;。就像你买了个能装 3 个苹果的铁皮盒&#xff0c;想多装 1 个都不行&#xff0c;但里面的苹果可以换成…

速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)

目录 引言&#xff1a; G-C-D, Unlucky! 题意分析 逻辑梳理 代码实现 结语&#xff1a; 引言&#xff1a; 因为今天打了个ICPC网络赛&#xff0c;导致坐牢了一下午&#xff0c;没什么时间打题目了&#xff0c;就打了一道题&#xff0c;所以&#xff0c;今天我们就只讲一题了&…

数据链路层总结

目录 &#xff08;一&#xff09;以太网&#xff08;IEEE 802.3&#xff09; &#xff08;1&#xff09;以太网的帧格式 &#xff08;2&#xff09;帧协议类型字段 ①ARP协议 &#xff08;横跨网络层和数据链路层的协议&#xff09; ②RARP协议 &#xff08;二&#xff…

Scala 新手实战三案例:从循环到条件,搞定基础编程场景

Scala 新手实战三案例&#xff1a;从循环到条件&#xff0c;搞定基础编程场景 对 Scala 新手来说&#xff0c;单纯记语法容易 “学完就忘”&#xff0c;而通过小而精的实战案例巩固知识点&#xff0c;是掌握语言的关键。本文精选三个高频基础场景 ——9 乘 9 乘法口诀表、成绩等…

java学习笔记----标识符与变量

1.什么是标识符?Java中变量、方法、类等要素命名时使用的字符序列&#xff0c;称为标识符。 技巧:凡是自己可以起名字的地方都叫标识符。 比如:类名、方法名、变量名、包名、常量名等 2.标识符的命名规则由26个英文字母大小写&#xff0c;0-9&#xff0c;或$组成 数字不可以开…

AI产品经理面试宝典第93天:Embedding技术选型与场景化应用指南

1. Embedding技术演进全景解析 1.1 稀疏向量:关键词匹配的基石 1.1.1 问:请说明稀疏向量的适用场景及技术特点 答:稀疏向量适用于关键词精确匹配场景,典型实现包括TF-IDF、BM25和SPLADE。其技术特征表现为50,000+高维向量且95%以上位置为零值,通过余弦或点积计算相似度…

【Mermaid.js】从入门到精通:完美处理节点中的空格、括号和特殊字符

文章标签&#xff1a; Mermaid, Markdown, 前端开发, 数据可视化, 流程图 文章摘要&#xff1a; 你是否在使用 Mermaid.js 绘制流程图时&#xff0c;仅仅因为节点文本里加了一个空格或括号&#xff0c;整个图就渲染失败了&#xff1f;别担心&#xff0c;这几乎是每个 Mermaid 新…

多技术融合提升环境生态水文、土地土壤、农业大气等领域的数据分析与项目科研水平

一&#xff1a;空间数据获取与制图1.1 软件安装与应用1.2 空间数据介绍1.3海量空间数据下载1.4 ArcGIS软件快速入门1.5 Geodatabase地理数据库二&#xff1a;ArcGIS专题地图制作2.1专题地图制作规范2.2 空间数据的准备与处理2.3 空间数据可视化&#xff1a;地图符号与注记2.4 研…

【音视频】Android NDK 与.so库适配

一、名词解析 名词全称核心说明Android NDKNative Development Kit在SDK基础上增加“原生”开发能力&#xff0c;支持使用C/C编写代码&#xff0c;用于开发需要调用底层能力的模块&#xff08;如音视频、加密算法等&#xff09;.so库Shared Object即共享库&#xff0c;由NDK编…

SpringBoot 轻量级一站式日志可视化与JVM监控

一、项目初衷Java 应用开发的同学都知道&#xff0c;项目上线后&#xff0c;日志的可视化查询与 JVM 的可视化监控是一件非常重要的事。 市面上成熟方案一般是采用 ELK/EFK 实现日志可视化&#xff0c;采用 Actuator Prometheus Grafana 实现 JVM 监控。 这两套都是非常优秀的…

【Leetcode hot 100】101.对称二叉树

问题链接 101.对称二叉树 问题描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;…

Zynq开发实践(FPGA之选择开发板)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】我们之所以选用zynq开发板&#xff0c;就在于它支持arm软件开发&#xff0c;也支持fpga开发&#xff0c;甚至可以运行linux&#xff0c;这是之前没有…