顺序表之初

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 线性表简介
    • 顺序表定义
    • 动态顺序表的初始化
    • 尾插
    • 头插
    • Cheak 判断是否增容
    • 尾删:
    • 头删:
    • 打印
    • 在pos位置前插入x
    • 删除pos位置的值
    • 查找
    • 修改
    • 销毁

线性表简介

百度:线性表最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

  • 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
  • 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

![在这里插入图片描述](https://img-blog.csdnimg.cn/407892b043c9486db9b64ff8f8d330a0.png


顺序表定义

顺序表是用一段物理地址连续的储存单元依次储存数据结构的线性结构,一般情况采用的是数组储存;在数组上完成数据的增删查改;

顺序表可以分为:
1.静态顺序表:使用固定长数组存储元素;

#define N 100
typedef int SLDateType;
//定义静态顺序表
typedef struct SeqList
{SLDateType a[N]; //固定数组大小,N的值无法改变int size;        //数组有效的个数}SeqList;

2.动态顺序表:使用动态开辟的数组储存;

typedef int SLDateType;
//定动态义顺序表
typedef struct SeqList
{SLDateType* a;//指向动态数组的指针int size;     //数组的有效数据int capacity; //空间大小
}SeqList;

动态顺序表的初始化

初始化顺序表是使用动态分配数组空间方式构造一个空的线性表。

//初始化
void SeqListInit(SeqList* ps)
{//用 malloc申请一块空间ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);if (ps->a== NULL)//判断是否申请空间成功{perror("malloc");exit(-1);}ps->capacity = 4;//将顺序表的最大长度设为 4ps->size = 0; //将顺序表的当前长度设为 0}

有关malloc函数申请动态内存空间,可以看我的另一篇博客动态内存空间管理,有详细解释;

尾插

尾插就是在最后一个元素的后面插入一个元素

  • 尾插有三种情况:
    第一种:情况是顺序表压根就没有空间,用assert解决;
    第二种:情况就是我们创建的 capacity 空间满了,需要增容再往后插入;
    第三种:情况是空间足够,直接插入数据即可;
void SeqListPushBack(SeqList* ps, SLDateType x)
{//每次进来判断依次满了要扩容if (ps->size  == ps->capacity){//realloc函数是专门用来增容的,以两倍的增容SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2  * sizeof(SLDateType));if (tem == NULL)//判断是否增容成功{perror("realloc");exit(-1);}ps->a = tem;ps->capacity *= 2;//空间大小以两倍增容}ps->a[ps->size] = x;//运用下标存储要插入的值ps->size++;//尾插成功则有效数据就加 1
}

有关realloc函数调整动态申请的内存空间,详解也再我的另一篇博客中:动态内存空间管理,其详细解释,一定要看懂!很重要!!

头插

顺序表要求数据是连续存储的,且必须是从头开始存储。所以,对于顺序表而言如果要实现头插,就需要把数据往后挪动。不能从前往后挪,如果从前往后挪就挪就会把后面的数据覆盖掉。
在这里插入图片描述

void SeqListPushFront(SeqList* ps, SLDateType x) {//每次进来判断依次满了要扩容if (ps->size == ps->capacity){//realloc函数是专门用来增容的,以两倍的增容SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));if (tem == NULL)//判断是否增容成功{perror("realloc");exit(-1);}ps->a = tem;ps->capacity *= 2;//空间大小以两倍增容}//从后往前式的往后移动一个元素int end = ps->size - 1;while (end>=0){ps->a[end+1] = ps->a[end];--end;}ps->a[0] = x;//插入首元素ps->size++;//头插成功有效元素加1
}

这个时候你回头会发现,如果要增容的时的代码几乎一致,我们可以为要增容单独写一个函数,判断是否要增容:

Cheak 判断是否增容

void Cheak(SeqList*ps)
{//每次进来判断依次满了要扩容if (ps->size == ps->capacity){//realloc函数是专门用来增容的,以两倍的增容SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));if (tem == NULL)//判断是否增容成功{perror("realloc");exit(-1);}ps->a = tem;ps->capacity *= 2;//空间大小以两倍增容}
}

而这个时候的尾插、头插这样写:

头插:

void SeqListPushFront(SeqList* ps, SLDateType x) {Cheak(ps);//判断增容//从后往前式的往后移动一个元素int end = ps->size - 1;while (end>=0){ps->a[end+1] = ps->a[end];--end;}ps->a[0] = x;//插入首元素ps->size++;//头插成功有效元素加1
}

尾插:

void SeqListPushBack(SeqList* ps, SLDateType x)
{Cheak(ps);//判断增容ps->a[ps->size] = x;//运用下标存储要插入的值ps->size++;//尾插成功则有效数据就加 1
}

尾删:

顺序表的尾删比较简单,直接让size–就可以;

void SeqListPopBack(SeqList* ps)
{//当顺序表中无元素,不会进行尾删if (ps->size == 0){printf("size越界访问");exit(-1);}ps->size--;
}

头删:

头删可以理解为:直接将从第二元素从前往后的覆盖上去;

//头删
void SeqListPopFront(SeqList* ps)
{assert(ps->size > 0);//删减int i = 0;for (i = 0; i < ps->size; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

打印

打印出顺序表中的元素;

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

在pos位置前插入x

需要知道pos为元素下标,找到pos位后,然后将其后面的所有元素向后移动一个元素,再将要插入的x插入pos位置;

void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{//检查pos位置是否在顺序表里面assert(pos >= 0 && pos <= ps->size);Cheak(ps);//判断是否增容//找到有效数据元素的下标int end = ps->size - 1;//往后移while (end>=pos){ps->a[end+1] = ps->a[end];end--;}ps->a[pos] = x;//空出pos位后插入ps->size++;
}

注意:SeqListInsert这个函数可以代替尾插或头插;

删除pos位置的值

删除指定位置的数据,我们仍然要限制 pos 的位置。限制条件部分和 SeqListInsert 不同的是,因为 psl->size 这个位置没有效数据,所以删除的位置不能是 psl->size!

void SeqListErase(SeqList* ps, int pos) {//检查pos位置是否在顺序表里面assert(pos >= 0&&pos< ps->size);//找到pos位置的下一个int begain = pos + 1;while (begain < ps->size){ps->a[begain - 1] = ps->a[begain];begain++;}ps->size--;}

注意:SeqListErase这个函数可以代替尾删或头删;

查找

//查找返回其下标,否则返回-1;
int SLFind(SL* ps, SLDatatype x)
{assert(ps);for (int i = 0; i <= ps->size; i++){if (ps->a[i] == x)return i;}return -1;}

修改

修改pos位置的值

//修改pos位置的值,pos是其下标
void SLModify(SL* ps, int pos, SLDatatype x)  
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos] = x;}

看代码运行结果:
在这里插入图片描述
最后的是:

销毁

如果进行了动态内存的内存空间申请,一定要记得销毁,因为动态内存空间是不会主动释放的,除非程序结束,否则可能会存在内存泄漏的风险;

//销毁
void SeqListDestroy(SeqList* ps)
{//释放free(ps);ps->a = NULL;ps->capacity = 0;ps->size = 0;}

到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

相关文章

Python学习笔记_实战篇(二)_django多条件筛选搜索

多条件搜索在很多网站上都有用到&#xff0c;比如京东&#xff0c;淘宝&#xff0c;51cto&#xff0c;等等好多购物教育网站上都有&#xff0c;当然网上也有很多开源的比楼主写的好的多了去了&#xff0c;仅供参考&#xff0c;哈哈 先来一张效果图吧&#xff0c;不然幻想不出来…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度智…

电子电路学习笔记之SA1117BH-1.2TR——LDO低压差线性稳压器

关于LDO调节器&#xff08;Low Dropout Regulator&#xff09;是一种电压稳压器件&#xff0c;常用于电子设备中&#xff0c;用于将高电压转换为稳定的低电压。它能够在输入电压和输出电压之间产生较小的差异电压&#xff0c;因此被称为"低压差稳压器"。 LDO调节器通…

设计模式之职责链模式(ChainOfResponsibility)的C++实现

1、职责链模式的提出 在软件开发过程中&#xff0c;发送者经常发送一个数据请求给特定的接收者对象&#xff0c;让其对请求数据进行处理&#xff08;一个数据请求只能有一个对象对其处理&#xff09;。如果发送的每个数据请求指定特定的接收者&#xff0c; 将带来发送者与接收…

【LeetCode】1448.统计二叉树中好节点的数目

题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,3,null,1,5] 输出&#xff1a;4 …

【MOS管的作用和工作原理】

数电/模电知识学习与分享001 MOS管的作用和工作原理1、MOS管基本概念2、MOS管基本原理3、MOS管广泛作用4、MOS管特点4、参考文献 MOS管的作用和工作原理 1、MOS管基本概念 MOS管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor&#xff09;是一种常用的半导体…

python AI绘图教程

前提 1.安装python 2.安装git 步骤 下载stable-diffusion-webui项目&#xff08;链接&#xff1a;GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI&#xff09; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 安装st…

【Go Web 篇】Go 语言进行 Web 开发:构建高性能网络应用

随着互联网的快速发展&#xff0c;Web 开发已经成为了软件开发领域中不可或缺的一部分。随之而来的是对于更高性能、更高效的网络应用的需求。在这个领域&#xff0c;Go 语言因其并发性能、简洁的语法以及丰富的标准库而备受关注。本篇博客将深入探讨如何使用 Go 语言进行 Web …

centos7设置静态IP地址

安装完成系统后&#xff0c;接下来就是配置静态IP地址&#xff0c;如下&#xff1a; 进入编辑模式vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件名不一定是ifcfg-ens33&#xff0c;到/etc/sysconfig/network-scripts下面找下是哪个文件 修改 &#xff1a; BOOTPROTO…

Python OCR 使用easyocr库将图片中的文章提取出来

Python OCR 使用easyocr库将图片中的文章提取出来 初环境内容步骤一&#xff1a;安装easyocr库步骤二&#xff1a;导入必要的库步骤三&#xff1a;创建OCR阅读器对象步骤四&#xff1a;指定要识别的图片路径步骤五&#xff1a;执行OCR识别并提取文章内容步骤六&#xff1a;遍历…

深入分析负载均衡情景

本文出现的内核代码来自Linux5.4.28&#xff0c;为了减少篇幅&#xff0c;我们尽量不引用代码&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、有几种负载均衡的方式&#xff1f; 整个Linux的负载均衡器有下面的几个类型&#xff1a; 实际上内核的负载均衡…

【TI毫米波雷达笔记】UART串口外设配置及驱动(以IWR6843AOP为例)

【TI毫米波雷达笔记】UART串口外设初始化配置及驱动&#xff08;以IWR6843AOP为例&#xff09; 最基本的工程建立好以后 需要给SOC进行初始化配置 int main (void) {//刷一下内存memset ((void *)L3_RAM_Buf, 0, sizeof(L3_RAM_Buf));int32_t errCode; //存放SOC初…

同态比较算法

参考文献&#xff1a; [PS73] Paterson M S, Stockmeyer L J. On the number of nonscalar multiplications necessary to evaluate polynomials[J]. SIAM Journal on Computing, 1973, 2(1): 60-66.[IZ21] Iliashenko I, Zucca V. Faster homomorphic comparison operations …

redis7高级篇3 数据量亿级别的统计分析(hyperloglog,bitmap,geo)

一 亿级别统计分类 1.1 统计分类 1.聚合统计&#xff1a;统计多个集合聚合的结果&#xff0c;也就是多个集合之间交并差的统计。 2.排序统计&#xff1a;在需要展示最新列表&#xff0c;排行榜等场景时&#xff0c;如果数据更新频繁或者需要分页时&#xff0c;建议使用zset12…

滚珠螺杆导程对精度有影响吗?

滚珠螺杆的导程也称螺距&#xff0c;即螺杆每旋转一周螺母直线运动的距离&#xff0c;导程与直线速度有关&#xff0c;在输入转速一定的情况下&#xff0c;导程越大速度越快。正常来说&#xff0c;选择导程时&#xff0c;尽量选5和10最好。 很多人一直觉得导程会影响滚珠螺杆的…

【安卓】自定义View实现画板涂鸦等功能

一、实现效果 二、代码 1、MainActivity.class package com.lsl.mydrawingboarddemo;import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat;import android.os.Bundle; import android.os.Handler; import android.view.View; impo…

73 # 发布自己的 http-server 到 npm

1、添加 .npmignore 文件&#xff0c;忽略不需要的文件 public2、去官网https://www.npmjs.com/检查自己的包名是否被占用 3、切换到官方源&#xff0c;然后检查确认 nrm use npm nrm ls4、登录 npm 账号 npm login5、发布 npm publish6、查看发布情况&#xff0c;发布成功…

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g&#xff0c;之后是up to date in&#xff0c;然后vue -V&#xff0c;版本号一直都在&#xff0c;说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置&#xff0c;找到文件删掉 where vue 3、再…

山西电力市场日前价格预测【2023-08-27】

日前价格预测 预测明日&#xff08;2023-08-27&#xff09;山西电力市场全天平均日前电价为318.11元/MWh。其中&#xff0c;最高日前电价为356.66元/MWh&#xff0c;预计出现在19: 15。最低日前电价为273.48元/MWh&#xff0c;预计出现在04: 30。 价差方向预测 1&#xff1a; 实…

Jenkins的定时任务配置

jenkins配置定时任务位置(点击日程表的问好可查看语法配置) jenkins的定时任务的参数 # 定时任务参数(每个参数之间使用tab键或空格分隔)MINUTE HOUR DOM MONTH DOW 参数解释取值范围 MINUTE 分钟0-59HOUR小时0-23DOM一月的天数1-31MONTH月份1-12DOW 一周的天数0…