线性表之——顺序表

哈喽小伙伴们大家好,这篇博客呢,鱼头会和大家分享一下我最近学习的数据结构中的顺序表,希望能对在读的各位提供帮助,还望多多支持!

目录

1.顺序表

1.1线性表

1.2顺序表的分类

1.2.1静态顺序表

1.2.2动态顺序表

2.动态顺序表的实现


1.顺序表

1.1线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。

线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。

但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

1.2顺序表的分类

顺序表,它的底层逻辑是数组,处理时可以直接当做数组来处理,不过是给数组加了一些变化而已

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

1.2.1静态顺序表

所谓静态,就是不能改变大小,也就是使用定长数组存储元素 ,如下所示:

#define N 7
typedef int SLDateType;//方便后续改变数组元素类型
typedef struct SeqList 
{SLDateType a[N];int size;//有效数据个数
}SL;
  • 优点:不用考虑内存泄漏问题
  • 缺陷:空间给少了不够用,给多了造成空间浪费

1.2.2动态顺序表

所谓动态,可以想到动态内存分配,就是可以根据需求调节数组大小,也就是静态顺序表里面的N。如下所示: 

typedef int SLDateType;
typedef struct SeqList {SLDateType* a;int size;//有效数据个数int capacity;//当前顺序表容量
}SL;

 这里多的capacity就代替了静态顺序表的N,区别在于capacity可以改变(通过对a的动态内存分配)

2.动态顺序表的实现

对于动态顺序表的实现,主要思想有:

  1. 初始化顺序表,第一种方法:让a指向NULL,其余项赋值为0;第二种方法:先为a分配少量空间,并将容量capacity改为相应值
  2. 销毁顺序表,为防止造成内存泄露,必须在使用完顺序表后释放为a分配的空间,将a置空
  3. 检查顺序表容量,每当插入数据的时候,必须要检查容量,防止造成越界访问
  4. 接下来就是正常的增删查改,整体思想围绕数组去做即可。增:包括头插,尾插,指定位置插入;删:包括头删,尾删,指定位置删除;查改就较为简单

下面是实现顺序表的基础代码,SeqList.h是相关函数声明:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"vld.h"typedef int SLDateType;
//定义动态顺序表
typedef struct Seqlist {SLDateType* a;int size;//有效数据个数int capacity;//容量
}SL;//初始化顺序表
void SLInit(SL* ps);
//销毁顺序表
void SLDestroy(SL* ps);//头部插入数据
void SLPushFront(SL* ps, SLDateType x);
//尾部插入数据
void SLPushBack(SL* ps, SLDateType x);//头部删除数据
void SLPopFront(SL* ps);
//尾部删除数据
void SLPopBack(SL* ps);//任意处插入数据(指定位置前插)
void SLInsert(SL* ps, int pos, SLDateType x);
//任意处删除数据
void SLErase(SL* ps, int pos);//检查容量
void SLCheckCapacity(SL* ps);
//输出顺序表
void PrintSL(SL* ps);//查找
int SLFind(SL* ps, SLDateType x);//修改
int SLChange(SL* ps,int pos, SLDateType x);

SeqList.c是相关函数定义:

#include"Seqlist.h"
//初始化
void SLInit(SL* ps)
{ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
//销毁
void SLDestroy(SL* ps)
{if(ps->a){free(ps->a);ps->a = NULL;}ps->capacity = ps->size = 0;
}
//输出顺序表
void PrintSL(SL* ps)
{int i;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}
//检查容量
void SLCheckCapacity(SL* ps)
{if (ps->size == ps->capacity){int Newcapacity;Newcapacity = (ps->capacity == 0) ? 4 : (2 * ps->capacity);SLDateType* p = (SLDateType*)realloc(ps->a, sizeof(SLDateType) * Newcapacity);if (p == NULL){perror("realloc fail");exit(1);}else {ps->a = p;ps->capacity = Newcapacity;}}
}
//尾插
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}
//头插
void SLPushFront(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);int i;for (i = ps->size; i > 0; i--){ps->a[i] = ps->a[i - 1];}ps->a[0] = x;ps->size++;
}
//尾删
void SLPopBack(SL* ps)
{assert(ps);ps->size--;
}
//头删
void SLPopFront(SL* ps)
{assert(ps);int i;for (i = 0; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}
//任意插入
void SLInsert(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int i;for (i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->size++;}
//任意删除
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int i;for (i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}//查找
int SLFind(SL* ps, SLDateType x)
{int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){return i;}}return -1;
}//修改
int SLChange(SL* ps, int pos, SLDateType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);ps->a[pos] = x;
}

-------------------------------------------------------------------------------------------------------------------------------- 

 希望这篇文章能对你有所帮助,点颗星星收藏一下吧(比心)

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

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

相关文章

如何使用PL/SQL Developer工具导出clob字段的表?

1 准备测试数据 导出测试对象&#xff1a;表test_0102&#xff0c;others字段为clob类型 --创建中间表test_0101 create table test_0101( id number, name varchar2(20), others clob);--插入100条测试数据 beginfor i in 1..100 loopinsert into test_0101 values(i,i||_a,l…

git上传到本地仓库

摘要&#xff1a;本地初始化init仓库&#xff0c;进行pull和push&#xff1b;好处是便于利用存储设备进行git备份 git init --bare test.git 随便到一个空的目录下git clone 然后使用git上传 把git仓库删除之后再clone一次验证一下是否上传成功&#xff1a; 如果在ubantu上面没…

20个Python异常处理的最佳实践

大家好&#xff0c;你知道吗&#xff1f;在编写代码时&#xff0c;就像驾驶一辆汽车&#xff0c;难免会遇到些小故障。但别担心&#xff0c;Python的异常处理机制就像我们的安全带&#xff0c;能帮助我们平稳度过那些意外。今天&#xff0c;我们就来聊聊20个Python异常处理的实…

JPA中,QBC查询,JpaSpecificationExecutor,Specification总结

class Specification {public static void main(String[] args) {// 底层实现原理,Specification接口底层就是利用EntityManager实现EntityManager entityManager SpringUtil.getBean(EntityManager.class);// 固定套路,总共十一步// 第一步: 获取条件构造器CriteriaBuilder c…

文件操作C

1、什么是文件 在程序设计中,我们一般谈的文件有两种:程序文件,数据文件(从文件功能的角度来分类的。) 11程序文件 包括源程序文件(后缀为.c),目标问价(windows环境后缀为.obj),可执行程序(Windows环境后缀为.exe)。 12数据文件 文件的内容不一定是程序,而是程序…

[C#]OpenCvSharp实现直方图均衡化全局直方图局部直方图自适应直方图

【什么是直方图均衡化】 直方图均衡化是一种简单而有效的图像处理技术&#xff0c;它旨在改善图像的视觉效果&#xff0c;使图像变得更加清晰和对比度更高。其核心原理是将原始图像的灰度直方图从可能较为集中的某个灰度区间转变为在全部灰度范围内的均匀分布。通过这种方法&a…

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归&#xff1a;有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散&#xff0c;但是目标变量y必…

简述JavaScript入门:掌握网络编程的关键

在数字时代&#xff0c;编程不仅是专业人士的技能&#xff0c;也越来越成为日常生活的一部分。JavaScript&#xff0c;作为最流行的编程语言之一&#xff0c;主要用于网页和网络应用开发。无论是个人兴趣&#xff0c;还是职业发展&#xff0c;学习JavaScript都是一个明智的选择…

Visual Studio 配置代码风格审查工具cpplint

文章目录 一、Visual Studio 配置代码风格审查工具cpplint1、安装2、运行3、集成到Visual Studio4、集成到Git 前言 cpplint是一个用于检查C代码风格的工具&#xff0c;它可以帮助我们发现潜在的编码问题&#xff0c;提高代码质量。cpplint遵循Google的C编码规范&#xff0c;通…

快速获取文件夹及其子文件夹下的所有文件名

1、在文件夹中新建文本文档&#xff0c;命名为“命令.txt” 2、输入以下内容 tree /F > 文件名.txt dir *.* /B > 文件名.txt 其中文件名和文件格式可以是任意的&#xff0c;tree命令可生成文件及其子文件夹下所有文件的名称&#xff0c;dir命令只生成当前目…

用wordpress搭建视频点播发布平台

目录 一、安装操作系统、宝塔面板 二、宝塔面板部署环境 1、安装nginx

技术驱动下的同城O2O发展:跑腿配送APP开发教学

在同城生活服务领域&#xff0c;跑腿配送APP的出现与发展&#xff0c;为人们的日常生活提供了极大的便利。今天&#xff0c;小编将着重为大家讲解技术驱动下的同城O2O发展&#xff0c;并从跑腿配送APP的开发角度进行教学和解析。 一、同城O2O发展概述 在同城O2O模式中&#x…

20240323-2-决策树面试题DecisionTree

决策树面试题 1. 简单介绍决策树算法 决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法&#xff0c;首先对数据进行处理&#xff0c;利用归纳算法生成可读的规则和决策树&#xff0c;然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类…

BCLinux-for-Euler配置本地yum源

稍微吐槽一句…… 在这片土地上&#xff0c;国产化软件的大潮正在滚滚而来&#xff0c;虽然都不是真正意义上的国产化&#xff0c;但是至少壳是国产的~~~ 之前使用的Centos7的系统&#xff0c;现在都要求统一换成BCLinux-for-Euler。说实话换了之后不太适应&#xff0c;好多用习…

四月软件测试面经合集(持续更新)

四月软件测试面经合集 polelink面试&#xff08;一面过&#xff09;01 对于JMeter接口测试&#xff0c;如何做接口关联&#xff1f;接口关联的定义JMeter关联方法正则表达式介绍贪婪匹配和非贪婪匹配案例分析正则表达式提取器步骤 02 是否会写shell脚本&#xff0c;能对shell进…

JVM—类加载子系统

JVM—类加载子系统 JVM的类加载是通过ClassLoader及其子类来完成的。 有哪些类加载器 类加载器如下&#xff1a; 启动类加载器&#xff08;BootStrap ClassLoader&#xff09;&#xff1a;负责加载JAVA_HOME\lib目录或通过-Xbootclasspath参数指定路径中的且被虚拟机认可&am…

【leetcode面试经典150题】2.移除元素(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

FaaF:利用事实作为评估RAG的函数方法

原文地址&#xff1a;faaf-facts-as-a-function-for-evaluating-rag 2024 年 4 月 5 日 在某些情况下&#xff0c;我们使用其他语言模型来验证RAG的输出结果&#xff0c;但这种方法并未能有效识别出数据生成过程中的错误和缺失。 论文解析 挑战 评估的可靠性和效率&#xff…

4月底,这门HCIA认证即将发布!

非常荣幸地通知您&#xff0c;华为认证HCIA-AI Solution V1.0&#xff08;中文版&#xff09;预计将于2024年4月30日正式对外发布。 为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕…

练习题(2024/4/6)

1最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target …