顺序表(数据结构与算法)

请添加图片描述
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 无人扶我青云志 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 我自踏雪之山巅🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅

🍋顺序表

  • 🍌顺序表的定义
  • 🍌顺序表的结构
    • 🍍静态顺序表
    • 🍍动态顺序表
  • 🍌顺序表接口的实现(增删查改)
    • 🍍其它接口
    • 🍍顺序表初始化
    • 🍍检查空间是否增容(空间满了就增容)
    • 🍍顺序表尾插
    • 🍍顺序表尾删
    • 🍍顺序表头插
    • 🍍顺序表头删
    • 🍍顺序表查找
    • 🍍顺序表在pos位置插入x
    • 🍍顺序表删除pos位置的值
    • 🍍顺序表修改pos位置的值
    • 🍍顺序表销毁
    • 🍍顺序表打印
  • 🍌顺序表整体代码的实现

🍌顺序表的定义

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

在这里插入图片描述

线性表:线性表是最基本、最简单、也是最常用的一种数据结构。大部分线性表除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。而又一些小部分,比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点

🍌顺序表的结构

🍍静态顺序表

静态顺序表就是以一定长度的数组来存储元素

//静态存储
#define  N  5
typedef int SLDetatype ;
typedef struct SeqList
{SLDetatype a[N] ;//有限空间的数组int size ;//有效的数据个数
}SeqList;

在这里插入图片描述

🍍动态顺序表

动态顺序表使用动态开辟的数组来存储元素

//动态存储
typedef  int SLDetatype ;
typedef struct SeqList
{SLDetatype *a ;   //指向动态开辟的数组int size ;       //有效的数据个数int capicity ;   //空间的容量
}SeqList;

在这里插入图片描述

🍌顺序表接口的实现(增删查改)

🍍其它接口

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* a;int capacity;int size;
}SeqList;

🍍顺序表初始化

void SeqListInit(SeqList* ps)
{ps->a = NULL;            //在初始情况我们可以直接置空//当然也可以创建空间,看自己习惯ps->capacity = ps->size = 0;
}

🍍检查空间是否增容(空间满了就增容)

void CheckCapacity(SeqList* ps)
{assert(ps);//在两个相等时,空间可能会满,还可能空间为0,这是因为我们在初始化没有创建空间导致if (ps->capacity == ps->size){if (ps->capacity == 0)ps->capacity = 2;elseps->capacity *= 2;int newcapacity = ps->capacity;//在扩容时,我们都是利用realloc,创建空间利用mallocSLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);if (cur == NULL){perror("realloc   faild");exit(-1);}ps->a = cur;ps->capacity = newcapacity;}
}

大家如果对于malloc和realloc以及空间的创建的用法有些遗忘,可以看我这篇博客:动态内存管理(这是一个链接,有需要的朋友可以直接点进去)

🍍顺序表尾插

void SeqListPushBack(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);  //需要检查空间是否满或者空ps->a[ps->size] = x;(ps->size)++;
}

在这里插入图片描述

🍍顺序表尾删

//顺序表尾删
void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size > 0);  //检查数据个数是否为0,如果为0就不执行,反之亦然(ps->size)--;
}

在这里插入图片描述

🍍顺序表头插

// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);//判断空间是否满还是空//注意头插要分两种情况//第一种是数组里没有元素,此时头插就是相当于尾插//第二种是数组里有元素,这时就先把整体元素往后移动一位if (ps->size - 1 == 0){ps->a[ps->size -1] = x;(ps->size)++;}else{int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;(ps->size)++;}
}

注意
注意头插要分两种情况
(1)第一种是数组里没有元素,此时头插就是相当于尾插
(2)第二种是数组里有元素,这时就先把整体元素往后移动一位

在这里插入图片描述

🍍顺序表头删

// 顺序表头删
void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size > 0);//注意头删要分两种情况//第一种是数组里没有元素,此时头删就是相当于尾删//第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖if (ps->size - 1 == 0){(ps->size)--;}else{int end = 0;while (end < ps->size - 1){ps->a[end] = ps->a[end + 1];end++;}(ps->size)--;}
}

注意:
注意头删要分两种情况
(1)第一种是数组里没有元素,此时头删就是相当于尾删
(2)第二种是数组里有元素,这时就需要把除了第一个元素外的所有元素往前移动一位,把原来的第一位元素覆盖

在这里插入图片描述

🍍顺序表查找

// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{assert(ps);int i = 0;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return 1;}return -1;
}

🍍顺序表在pos位置插入x

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i + 1] = ps->a[i];}ps->a[pos-1] = x;(ps->size)++;
}

注意:pos必须在0到ps->size之间

在这里插入图片描述

🍍顺序表删除pos位置的值

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

注意:pos必须在0到ps->size之间

🍍顺序表修改pos位置的值

//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos - 1] = x;
}

🍍顺序表销毁

// 顺序表销毁
void SeqListDestory(SeqList* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}

🍍顺序表打印

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

🍌顺序表整体代码的实现

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int SLDatatype;
typedef struct SeqList
{SLDatatype* a;int capacity;int size;
}SeqList;//顺序表初始化
void SeqListInit(SeqList* ps)
{ps->a = NULL;ps->capacity = ps->size = 0;
}//检查空间,如果满了就增容
void CheckCapacity(SeqList* ps)
{assert(ps);if (ps->capacity == ps->size){if (ps->capacity == 0)ps->capacity = 2;elseps->capacity *= 2;int newcapacity = ps->capacity;SLDatatype* cur = (SLDatatype*)realloc(ps->a, sizeof(SLDatatype) * newcapacity);if (cur == NULL){perror("realloc   faild");exit(-1);}ps->a = cur;ps->capacity = newcapacity;}
}//顺序表尾插
void SeqListPushBack(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);ps->a[ps->size] = x;(ps->size)++;
}//顺序表尾删
void SeqListPopBack(SeqList* ps)
{assert(ps);assert(ps->size > 0);(ps->size)--;
}// 顺序表头插
void SeqListPushFront(SeqList* ps, SLDatatype x)
{assert(ps);CheckCapacity(ps);if (ps->size == 0){ps->a[ps->size] = x;(ps->size)++;}else{int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;(ps->size)++;}
}// 顺序表头删
void SeqListPopFront(SeqList* ps)
{assert(ps);assert(ps->size > 0);if (ps->size - 1 == 0){(ps->size)--;}else{int end = 0;while (end < ps->size - 1){ps->a[end] = ps->a[end + 1];end++;}(ps->size)--;}
}// 顺序表查找
int SeqListFind(SeqList* ps, SLDatatype x)
{assert(ps);int i = 0;for (int i = 0; i < ps->size; i++){if (ps->a[i] == x)return 1;}return -1;
}// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);CheckCapacity(ps);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i + 1] = ps->a[i];}ps->a[pos-1] = x;(ps->size)++;
}// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{assert(ps);assert(pos >= 0 && pos <= ps->size);int i = 0;for (i = pos - 1; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}(ps->size)--;
}// 顺序表销毁
void SeqListDestory(SeqList* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}// 顺序表打印
void SeqListPrint(SeqList* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}//顺序表修改pos位置的值
void SeqModify(SeqList* ps, int pos, SLDatatype x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos - 1] = x;
}void test1()
{SeqList cur;SeqListInit(&cur);SeqListPushBack(&cur, 500);//尾插SeqListPushBack(&cur, 400);//尾插SeqListPushBack(&cur, 300);//尾插SeqListPrint(&cur);SeqListPopBack(&cur);//尾删SeqListPrint(&cur);SeqListPushFront(&cur, 100);//头插SeqListPushFront(&cur, 200);//头插SeqListPushFront(&cur, 600);//头插SeqListPrint(&cur);SeqListPopFront(&cur); //头删SeqListPrint(&cur);if (SeqListFind(&cur,200) == 1)//元素查找printf("找到了\n");else{printf("没有找到\n");}SeqListInsert(&cur, 3, 999);//在pos位置插入xSeqListPrint(&cur);SeqListErase(&cur, 3);//删除pos位置的值SeqListPrint(&cur);SeqModify(&cur, 3, 666); //修改pos位置的值SeqListPrint(&cur);
}int main()
{test1();return 0;
}

请添加图片描述

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

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

相关文章

从0开始学习JavaScript--JavaScript 流程控制

JavaScript中的流程控制结构是编写结构化、可读性强的代码的关键。本文将深入研究JavaScript中的流程控制&#xff0c;包括条件语句、循环结构、跳转语句等&#xff0c;并通过丰富的示例代码来更全面地了解和运用这些概念。 条件语句 条件语句用于基于不同的条件执行不同的代…

架构开发与优化咨询和实施服务

服务概述 得益于硬件平台算力的提升&#xff0c;汽车电子电气架构的集成度逐渐提高&#xff0c;从单体ECU、到功能域集成控制器、到区域集成控制器&#xff0c;多域融合成为了目前行业中软件工程的重要工作内容。同时&#xff0c;在传统控制器C代码开发的基础上&#xff0c;C、…

C#中.NET 7.0 Windows窗体应用通过EF访问新建数据库

目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、移植&#xff08;Migrations&#xff09;数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 前文已经说过.NET 6.0 控制台应用通过EF访问…

μC/OS-II---事件标志组管理1(os_flag.c)

目录 事件标志组创建事件标志组删除事件标志组获取/等待 当任务要与多个事件同步时&#xff0c;就要使用事件标志组。一个事件标志就是一个二值信号&#xff0c;事件标志组是若干二值信号的组合。使用事件标志组同步任务分为独立性同步和关联性同步。 事件标志组创建 flags&a…

MySql分区

一、什么是分区 MySQL分区是一种数据库设计和管理技术&#xff0c;它允许你将表分割成独立的、具有特定规则的存储单元。每个分区可以独立地进行管理&#xff0c;包括备份、恢复和优化。分区的主要目的是提高查询性能、简化维护以及实现数据的更有效管理。 以下是MySQL分区的…

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 项目部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起&#xff0c;Docker成为了现代软件开发的关键工具。在Java开发中&#xff0c;Spring Boot是一款备受青睐的框架&#xff0c;然…

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

阎良区公益创投之“小飞机大梦想” 航模DIY主题活动

创造是人类探索迈出的第一步&#xff0c;科学是开启奇妙世界的金钥匙。为进一步提升“未来星”对科技知识的兴趣&#xff0c;培养他们的科学创新精神&#xff0c;11月16日&#xff0c;阎良区社会组织公益创投——“未来星”助力乡村留守儿童成长计划项目在阎良区聚宝小学开展“…

【淘宝API】商品详情+搜索商品列表接口

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

【具身智能评估1】具身视觉语言规划(EVLP)仿真环境汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…

医院数字化LIS(检验信息系统)源码

临床检验信息管理系统&#xff08;LIS&#xff09;是利用计算机连接医疗设备&#xff0c;通过计算机信息处理技术&#xff0c;将医院检验科或实验室的临床检验数据进行自动收集、存储、处理、提取、传输和交换&#xff0c;满足所有授权用户的功能需求。 一、系统概述 1.LIS&am…

性能测试【第三篇】Jmeter的使用

线程数:10 ,设置10个并发 Ramp-Up时间(秒):所有线程在多少时间内启动,如果设置5,那么每秒启动2个线程 循环次数:请求的重复次数,如果勾选"永远"将一直发送请求 持续时间时间:设置场景运行的时间 启动延迟:设置场景延迟启动时间 响应断言 响应断言模式匹配规则 包括…

Qt QLable 字符过长省略

前言&#xff1a; 项目中常用到字符过长问题&#xff0c;Qt默认的省略并不好用&#xff0c;不是自己想要的&#xff1b; QFontMetri 可使用 QFontMetri 当text的像素宽度超过width&#xff0c;将返回字符串的一个省略版本取决于mode。否则将返回原字符串&#xff1b; mode…

解决STM32F429烧录程序后还需复位才能植入程序的bug

1.打开魔术棒&#xff0c;打开debug 2.打开setting 3.打开Flas Download 4.开启Reset and Run 5.点进去Pack选项页面&#xff0c;去掉enable

postgresql:记录表膨胀引起的io问题的处理

文章目录 1. io异常2.查看profile报告2.1 生成事发时间段的pgprofile2.2 查看报告 3.检查table是否膨胀4.执行vacuum full5.总结 1. io异常 iostat -x 1 20 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq…

【数据结构】直接插入排序

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Stable Diffusion进阶玩法说明

之前章节介绍了Stable Diffusion的入门&#xff0c;介绍了文生图的魅力&#xff0c;可以生成很多漂亮的照片&#xff0c;非常棒 传送门&#xff1a; Stable Diffusion新手村-我们一起完成AI绘画-CSDN博客 那我们今天就进一步讲讲这个Stable Diffusion还能做些什么&#xff0c; …