数据结构--顺序表

1.顺序表的概念

1.1线性表

具有相同特性的数据元素的有限序列,再逻辑结构上呈现线性,但是在物理结构上不一定是线性(也就是在内存中非线性)

顺序表是线性表中的一种,他的底层逻辑就是数组,就是对数组的一种封装形式,有了增删改查等用法;

注:数组在逻辑结构和物理结构都是线性的;

1.2顺序表的分类

顺序表可分为:动态顺序表和静态顺序表

1.2.1静态顺序表

例如:

struct L
{int a[100];int size //当前有效数据个数
};

1.2.2动态顺序表

strcut
{int* a;int sizeint ca//当前空间大小
}

动态顺序表对于内存处理更加灵活;对于扩容更加方便,不需要整个数组进行修改,增加了数据的安全性。

1.3顺序表的头文件

1.3.1顺序表基础

//包含头文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
//关键字转变
typedef int SLDateType;
typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SQ;

第一,typedef int SLDateType;可以更好改变数据变量的类型;

第二,

typedef struct SeqList
{SLDateType* a;int size;int capacity;
}SQ;

把名叫SeqList的结构体typedef成SQ,方便未来对此结构体的调用。

    SLDateType* a;->a指向的空间就是顺序表存储的位置。
    int size;->顺序表成员的数量
    int capacity;->顺序表空间的大小

1.3.2顺序表基本应用

// 对数据的管理:增删查改 
//初始化
void SeqListInit(SQ* ps);
//结构体的清除
void SeqListDestroy(SQ* ps);
//结构体打印
void SeqListPrint(SQ* ps);
//尾插
void SeqListPushBack(SQ* ps, SLDateType x);
//头插
void SeqListPushFront(SQ* ps, SLDateType x);
//头删
void SeqListPopFront(SQ* ps);
//尾删
void SeqListPopBack(SQ* ps);
// 顺序表查找
int SeqListFind(SQ* ps, SLDateType x);
// 顺序表在pos位置插入x
void SeqListInsert(SQ* ps, int pos, SLDateType x);
// 顺序表删除pos位置的值
void SeqListErase(SQ* ps, int pos);
顺序表初始化
#include "SeqList.h"void SeqListInit(SQ* ps)
{assert(ps);ps->a = NULL;ps->size = 0;ps->capacity = 0;
}

a的空间指向NULL,size成员数量和空间大小都置为0;

顺序表清除
void SeqListDestroy(SeqList* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}

首先判断ps是否为空,为空则中断,不为空则为继续执行,此处assert(x),x为真

才不会被中断。

free(ps->a)把a所指向的空间置为NULL;

a的指针置为空,size,capacity为0;

顺序表的打印
void SeqListPrint(SQ* ps)
{assert(ps);for (inti = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("%\n");
}
顺序表空间开辟
void CheckCacpity(SQ* ps)
{if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;ps->a = (SLDateType*)realloc(ps->a, newcapacity*sizeof(SLDateType));ps->capacity = newcapacity;}
}

当size的大小和capacity的大小一样的时候,则表示空间满了,当空间capacity和size大小为空时,也会开辟空间;

创建newcapacity(判断capacity是非为0,为0则开辟为4,不为0,则*2)

realloc(存储空间,重新开辟空间的大小)

之后再把capacity置为新空间大小。

1.3.3顺序表的增删改查

顺序表的尾部插入
void SeqListPushBack(SQ* ps, SLDateType x)
{assert(ps);CheckCacpity(ps);ps->a[ps->size] = x;ps->size++;
}

首先断言ps是否为空指针,之后开辟一个空间,其中ps->a[ps->size],ps所指向的数组a的下标为ps->size的元素(新开辟空间的下标),因为下标是从0开始的,所以原数组最大下标为size-1,新开辟的则为size。

不要忘记size还需要增加。

顺序表的头部插入
void SeqListPushFront(SQ* ps, SLDateType x)
{assert(ps);CheckCacpity(ps);int end = ps->size;while (end > 0){ps->a[end] = ps->a[end - 1];--end;}ps->a[0] = x;++ps->size;
}

首先进行断言和开辟空间,设置一个新整型end存放最大元素个数size,end用来控制变量。

循环判定条件是end>0,循环体内部将数组元素向后移动,之后将end减小,直至end=0时,循环终止。

之后再将a[0]置为新的数字x,size又增大一位。

顺序表的头部删除
void SeqListPopFront(SQ* ps)
{assert(ps);int start = 0;while (start < ps->size-1){ps->a[start] = ps->a[start + 1];++start;}--ps->size;
}

先断言ps,创建一个整型变量,置为0,循环体内将整个数组进行遍历,原理是用后面的元素把前面的覆盖掉,从小到大覆盖,最后将size-1;

顺序表的尾部删除
void SeqListPopBack(SeqList* ps)
{assert(ps);ps->a[ps->size - 1] = 0;ps->size--;
}

老规矩,先断言,ps为空就不能进行插入删除,此处凸显了顺序表的好处,能够很灵活的调用顺序表内的各个成员(因为有下标的关系),

只需要将最后一个元素置为0,之后将size-1即可。

1.3.4顺序表其他应用

找到数据位x下标位置
int SeqListFind(SQ* ps, SLDateType x)
{for (int i = 0; i < ps->size; ++i){if (ps->a[i] == x){return i;}}return -1;
}

再循环体内,生成一个新整型i,对其进行增加操作,遍历数组,如果下标为i的元素等于要找的x,则返回下标i,如果没找到则返回-1;

顺序表在pos位置插入x
void SeqListInsert(SQ* ps, size_t pos, SLDateType x)
{assert(ps);assert(pos <= ps->size);CheckCacpity(ps);int end = ps->size ;while (end > pos){ps->a[end] = ps->a[end - 1];--end;}ps->a[pos] = x;ps->size++;
}

断言ps,断言下标pos不能小于size,开辟一个待插入的新空间

while循环将pos小标之后的元素集体向后移动一位,

最后留下pos位置置为x,size增加1;

顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps && pos < ps->size);int start = pos+1;while (start < ps->size){ps->a[start-1] = ps->a[start];++start;}ps->size--;
}

断言,start是pos的下一个;

循环前置,pos之后的数据集体向前覆盖,把pos覆盖,最后size--,表示原数组最后一位不在读取。

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

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

相关文章

flink程序本地运行:No ExecutorFactory found to execute the application

1.问题描述 在idea中运行flink job程序出现如下错误&#xff1a; Exception in thread "main" java.lang.IllegalStateException: No ExecutorFactory found to execute the application. at org.apache.flink.core.execution.DefaultExecutorServiceLoader.getE…

7文法分析 软设刷题 软考 +

文法分析 刷题1-55-1010-1515-2020-2525-3030-3535-4040-45 知识点1-55-1010-1515-2020-2525-3030-35 刷题 1-5 1 沟通渠道公式如下&#xff1a;Mn*&#xff08;n-1&#xff09;/ 2。M表示沟通渠道数&#xff0c;n表示项目中的成员数 2 本题给出的NFA&#xff0c;能够识别字…

基于STM32控制的双轮自平衡小车的设计

基于STM32控制的双轮自平衡小车的设计是一项涉及电子、控制理论、机械设计和编程的综合工程。以下是关于该设计的一个概述&#xff0c;包括关键组件、控制策略和示例代码。 设计概述 1. 项目背景 自平衡小车作为一种智能控制系统&#xff0c;其设计和实现涉及到多个学科领域…

c++20 std::jthread 源码简单赏析与应用

std::jthread 说明&#xff1a; std::jthread 是 C20 中引入的一个新特性&#xff0c;它是线程库中的一个类&#xff0c;专门用于处理 std::thread 与 std::stop_token 和 std::stop_source 之间的交互&#xff0c;以支持更优雅和安全的线程停止机制。 std::stop_source控制…

微软开发者大会:编程进入自然语言时代、“AI员工”闪亮登场

当地时间周二&#xff0c;美国科技公司微软召开年度Build开发者大会。在CEO纳德拉的带领下&#xff0c;微软各个产品团队再一次展现出惊人的执行力&#xff0c;在发布会上又拿出了接近50个新产品或功能更新。 整场发布会持续了接近两个小时&#xff0c;在这里挑选了一些投资者…

web自动化文件上传弹框处理

目录 文件上传介绍文件上传处理Alert 弹窗介绍Alert 弹窗处理 课程目标 掌握文件上传的场景以及文件上传的处理方式。掌握 Alert 弹窗的场景以及 Alert 弹窗的处理方式。 思考 碰到需要上传文件的场景&#xff0c;自动化测试应该如何解决&#xff1f; 文件上传处理 找到文…

el-switch自动触发更新事件

比如有这样一个列表&#xff0c;允许修改单条数据的状态。希望在更改el-switch状态时能够有个弹框做二次确认&#xff0c;没问题&#xff0c;el-switch已经帮我们想到了&#xff0c;所以它提供了beforeChange&#xff0c;根据beforeChange的结果来决定是否修改状态。一般确认修…

【python】串口双向透传python小程序

串口双向透传python小程序 import serial import threadingdef serial_forward(source, dest):while True:data source.read()dest.write(data)def main():# 串口1设置serial_port1 serial.Serial(COM9, 9600, timeout1)# 串口2设置serial_port2 serial.Serial(COM30, 9600…

递归,进程fork(),以及线程clone()之间的比较

在计算机科学中&#xff0c;处理复杂任务的常见方法有递归、进程&#xff08;通过 fork 创建&#xff09;&#xff0c;以及线程&#xff08;通过 clone 创建&#xff09;。这三种方式各有其独特的优势和适用场景。在本文中&#xff0c;我们将深入比较这三种方法&#xff0c;并展…

React Native 之 定义全局状态管理库(九)

假设你正在使用基于单页面应用&#xff08;SPA&#xff09;的微前端框架。以下简化一个应用之间共享状态的例子。 1. 使用发布/订阅模式 // globalStateManager.js class GlobalStateManager { constructor() { this.subscribers {}; this.state {}; } subscribe(key…

计算机缺失ffmpeg.dll如何修复,五种详细的修复教程分享

当你在使用电脑过程中&#xff0c;突然遇到系统或软件弹出提示信息&#xff0c;告知“ffmpeg.dll文件丢失”怎么办&#xff1f;当电脑提示ffmpeg.dll丢失时&#xff0c;可能会导致一些应用程序无法正常运行或出现错误提示。下面我将介绍5种解决电脑提示ffmpeg.dll丢失的方法。 …

String.intern()方法有什么作用

String.intern() 是一个 native&#xff08;本地&#xff09;方法&#xff0c;其作用是将指定的字符串对象的引用保存在字符串常量池中。字符串池是一个存储字符串字面量的固定池&#xff0c;它的主要目的是为了减少内存使用和提高性能。 当你调用intern()方法时&#xff0c;如…

神秘山洞惊现AI绘画至宝Stable Diffusion残卷

最近听到不少大宗门纷纷发声&#xff1a;随着AI神器的现世“程序员职业将不复存在”&#xff0c;“设计图将要失业”。 至此&#xff0c;不少修士开始担忧起来&#xff0c;现出世的AI神器会不会取代掉我辈修士。 其实&#xff0c;至女娲天神创造人类以来&#xff0c;在这漫漫…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

C++ (week4):Linux基础

文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令&#xff1a;查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件&#xff1a;mkdir2.删…

flink读kafka写mysql数据库

场景:从kafka读数据,通过jdbc写入mysql 示例: #往kafka测试主题写入数据 kafka-console-producer.sh --broker-list wh01t:21007 --topic ypg_test --producer.config /client/Kafka/kafka/config/producer.properties –创建mysql测试表 – dsg.test definition CREATE TABL…

【AI绘画Stable Diffusion】单人LoRA模型训练,打造你的专属模型,新手入门宝典请收藏!

大家好&#xff0c;我是灵魂画师向阳 本期我将教大家如何进行LoRA模型训练&#xff0c;打造你的专属模型&#xff0c;内容比较干&#xff0c;还请耐心看完&#xff01; 随着AIGC的发展&#xff0c;许多传统工作岗位正逐渐被AI取代。同时&#xff0c;AI变革也在创造前所未有的…

ftp是什么,ftp能做什么,ftp有什么用 -----ftp介绍

大家好&#xff0c;我是风屿&#xff0c;今天开始我会给大家介绍一些关于网络方面的配置以及介绍等等&#xff0c;今天是ftp FTP中文名字叫做文件传输协议&#xff0c;英文名字叫做File Transfer Protocol&#xff08;简称为ftp&#xff09; FTP 是因特网网络上历史最悠久的网…

JS 实战 贪吃蛇游戏

一、css 部分 1. 居中 想要开始和暂停两个按钮居中&#xff0c;可以将盒子设置为弹性盒 也可以使用其他方法 【代码】 2. 将父元素设置为相对定位&#xff0c;偏于之后贪吃蛇长长的身子&#xff0c;是以父元素为基点的绝对定位&#xff0c;通过 left 和 top 来控制位置 二、…

富甲美国---沃尔玛创始人山姆·沃尔顿

富甲美国---沃尔玛创始人山姆沃尔顿_山姆沃尔顿是犹太人吗?-CSDN博客文章浏览阅读786次。​1.不断地检讨回顾我们做得好不好或需要改进的&#xff0c;我们从没有对现况满足过。我们会短暂地大肆庆祝成功&#xff0c;然后认真地检讨下次如何能做得更好---不断改进与创新。2我们…