【数据结构与算法】线性表 - 顺序表

目录

  • 1. 线性表
  • 2.顺序表
  • 3.顺序表的优缺点
  • 4.实现(C语言)
    • 4.1 头文件 seqList.h
    • 4.2 实现 seqList.c

1. 线性表

  线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

  线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述

2.顺序表

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

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
  2. 动态顺序表:使用动态开辟的数组存储。

  静态顺序表只适用于确定知道需要存多少数据的场景,静态顺序表的定长数组,长度N定大了,空间开多了浪费,开少了不够用。所以基本都是使用动态顺序表,根据需要动态的分配空间大小。

3.顺序表的优缺点

缺点:增删改速度慢。

  1. 中间 / 头部的插入删除,时间复杂度为O(N)。
  2. 增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。
  3. 增容一般是呈1.5或2倍的增长,势必会有一定的空间浪费。

优点:有数组索引,查询速度快。

4.实现(C语言)

4.1 头文件 seqList.h

#pragma once#include <stdlib.h>
#include <assert.h>
#include <string.h>// 初始大小
#define STD_SIZE 4// 顺序表数据类型
typedef int seqListDataType;// 顺序表
typedef struct SeqList 
{seqListDataType* list;int size; // 有效数据个数int cap; // 顺序表容量
} SeqList;// 初始化,销毁
void init(SeqList* psl);
void destroy(SeqList* psl);// 扩容
void checkResize(SeqList* psl);// 头插头删,尾插尾删
void addFront(SeqList* psl, seqListDataType ele);
void removeFront(SeqList* psl);
void addBack(SeqList* psl, seqListDataType ele);
void removeBack(SeqList* psl);// 指定位置[0-size+1)插入,[0~size)删除
void insert(SeqList* psl, int pos, seqListDataType ele);
void erase(SeqList* psl, int pos);

4.2 实现 seqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include "seqlist.h"// 初始化
void init(SeqList* psl)
{assert(psl);psl->list = NULL;psl->size = 0;psl->cap = 0;
}// 销毁
void destroy(SeqList* psl)
{assert(psl && psl->list);free(psl->list);psl->list = NULL;psl->size = 0;psl->cap = 0;
}// 检查容量并扩容
static void checkResize(SeqList* psl)
{if (psl->size == psl->cap) {int newCap = psl->size == 0 ? STD_SIZE : psl->cap * 2;seqListDataType* tmpList = realloc(psl->list, newCap * sizeof(seqListDataType));if (tmpList != NULL){psl->list = tmpList;psl->cap = newCap;// 只将扩容的内存置0memset((psl->list) + psl->size, 0, psl->size * sizeof(seqListDataType));}else{perror("checkCap(SqList* psl) realloc error");}}
} // 头插
void addFront(SeqList* psl, seqListDataType data)
{assert(psl);checkResize(psl);// 所有元素往后挪1位for (int i = psl->size - 1; i >= 0; i--){psl->list[i + 1] = psl->list[i];}psl->list[0] = data;psl->size++;
}// 头删
void removeFront(SeqList* psl)
{assert(psl && psl->size > 0);// 第2个元素开始,所有元素往前挪1位for (int i = 1; i < psl->size; i++){psl->list[i - 1] = psl->list[i];}psl->list[psl->size - 1] = 0;psl->size--;
}// 尾插
void addBack(SeqList* psl, seqListDataType data)
{assert(psl);checkResize(psl);psl->list[psl->size] = data;psl->size++;
}// 尾删
void removeBack(SeqList* psl)
{assert(psl && psl->size > 0);psl->list[psl->size - 1] = 0;psl->size--;
}// 指定位置[0-size+1)插入
void insert(SeqList* psl, int pos, seqListDataType ele)
{	assert(psl);checkResize(psl);assert(pos >= 0 && pos < psl->size + 1);// 从插入位置开始,所有元素向后挪动1位for (int i = psl->size - 1; i >= pos; i--){psl->list[i + 1] = psl->list[i];}psl->list[pos] = ele;psl->size++;
}// 指定位置[0~size)删除
void erase(SeqList* psl, int pos)
{assert(psl && pos >= 0 && pos < psl->size);// 从删除位置开始,所有元素往前移动1位for (int i = pos; i < psl->size; i++){psl->list[i] = psl->list[i + 1];}psl->list[psl->size - 1] = 0;psl->size--;
}

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

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

相关文章

音视频转换软件Permute mac中文板特点介绍

Permute mac是一款Mac平台上的媒体格式转换软件&#xff0c;由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式&#xff0c;并提供了一些常用工具以便于用户进行编辑和处理。 Permute mac软件特点 - 支持大量格式&#xff1a;支持几乎所…

最长公共子序列问题

构造最长公共子序列为什么要这样构造序列 for(int i1;i<n;i){int k;cin>>k;b[k]i;}for(int i1;i<n;i){int k;cin>>k;a[i]b[k];}并且为什么要求上升序列&#xff0c;是有什么数学知识包含在其中吗&#xff1f; 为什么在求最长公共子序列时&#xff0c;f[mid]大…

适用于中大型C++工程的CMake模板1

在C项目开发中&#xff0c;CMake是一种广泛使用的构建工具&#xff0c;它可以帮助我们管理和构建中大型项目。下面是一个适用于中大型C工程的CMake模板。 项目结构 首先&#xff0c;我们需要定义一个清晰的项目结构。一个典型的中大型C项目可能包括以下目录和文件&#xff1a…

汇编-指针

一个变量如果包含的是另一个变量的地址&#xff0c; 则该变量就称为指针(pointer) 。指针是操作数组和数据结构的极好工具&#xff0c;因为它包含的地址在运行时是可以修改的。 .data arrayB byte 10h, 20h, 30h, 40h ptrB dword arrayB ptrB1 dword OFFSET arrayBarray…

C语言绘图

C语言本身并没有内置的绘图库。但是&#xff0c;你可以使用外部库来进行绘图&#xff0c;比如SDL&#xff0c;OpenGL&#xff0c;或者Windows的GDI库。下面我将简单地解释一下如何使用SDL库进行绘图。 首先&#xff0c;你需要在你的计算机上安装SDL库。然后&#xff0c;你可以…

TS的内置对象

内置对象 let b: Boolean new Boolean(1)console.log(b)let n: Number new Number(true)console.log(n)let s: String new String(cqs)console.log(s)let d: Date new Date()console.log(d)let r: RegExp /^1/console.log(r)let e: Error new Error("error!")…

Linux:权限篇 (彻底理清权限逻辑!)

shell命令以及运行原理&#xff1a; Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。而是通过kernel的“外壳”程序&#xff0c;也就是所谓的shell&#xff0c;来…

YOLOV5部署Android Studio安卓平台NCNN

坑非常多&#xff0c;兄弟们&#xff0c;我已经踩了三天的坑了&#xff0c;我这里部署了官方的yolov5s和我自己训练的yolov5n的模型 下载Android Studio&#xff0c;配置安卓开发环境&#xff0c;这个过程比较漫长。 安装cmake&#xff0c;注意安装的是cmake3.10版本。 根据手机…

LeetCode——字符串(Java)

字符串 简介[简单] 344. 反转字符串[简单] 541. 反转字符串 II[中等] 151. 反转字符串中的单词 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#xff0c;可以在评论区提醒一下。 [简单] 344. 反转字符串…

【IPC】消息队列

1、IPC对象 除了最原始的进程间通信方式信号、无名管道和有名管道外&#xff0c;还有三种进程间通信方式&#xff0c;这 三种方式称之为IPC对象 IPC对象分类&#xff1a;消息队列、共享内存、信号量(信号灯集) IPC对象也是在内核空间开辟区域&#xff0c;每一种IPC对象创建好…

15分钟,不,用模板做数据可视化只需5分钟

测试显示&#xff0c;一个对奥威BI软件不太熟悉的人来开发数据可视化报表&#xff0c;要15分钟&#xff0c;而当这个人去套用数据可视化模板做报表&#xff0c;只需5分钟&#xff01; 数据可视化模板是奥威BI上的一个特色功能板块。用户下载后更新数据源&#xff0c;立即就能获…

windows安装wsl2以及ubuntu

查看自己系统的版本 必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11 才能使用以下命令 在设置&#xff0c;系统里面就能看到 开启windows功能 直接winQ搜 开启hyber-V、使用于Linux的Windows子系统、虚拟机平…

群晖7.2版本安装CloudDriver2(套件)挂载alist(xiaoya)到本地

CloudDrive是一个强大的多云盘管理工具&#xff0c;为用户提供包含云盘本地挂载的一站式的多云盘解决方案。挂载到本地后&#xff0c;可以像本地文件一样进行操作。 一、套件库添加矿神源 二、安装CloudDriver2 1、搜索安装 搜索框输入【clouddrive】&#xff0c;搜索到Clou…

拍照小白入坑

快门 M(上半圆)&#xff1a;通过控制快门打开时间控制感光量&#xff0c;高速可以定格时间&#xff0c;低速可以记录移动轨迹 清晰度&#xff0c;速度不够快&#xff0c;图片不清晰。拍景拍物1/100s&#xff0c;拍嬉戏的孩子、笑容1/500s&#xff0c;快速移动的鸟、汽车1/2000…

获取文章分类详情

CategoryController GetMapping("/detail")public Result<Category> detail(Integer id){Category c categoryService.findById(id);return Result.success(c);} CategoryService //根据id查询分类信息Category findById(Integer id); CategoryServiceImpl …

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

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-20&#xff09;山西电力市场全天平均日前电价为255.39元/MWh。其中&#xff0c;最高日前电价为436.50元/MWh&#xff0c;预计出现在18:00。最低日前电价为21.61元/MWh&#xff0c;预计出…

【hive遇到的坑】—使用 is null / is not null 对string类型字段进行null值过滤无效

项目场景&#xff1a; 查看测试表test_1&#xff0c;发现表字段classes里面有null值&#xff0c;过滤null值。 --查看 > select * from test_1; ----------------------------- | test_1.id | test_1.classes | ----------------------------- | Mary | class 1 …

【DevOps】Git 图文详解(三):常用的 Git GUI

Git 图文详解&#xff08;三&#xff09;&#xff1a;常用的 Git GUI 1.SourceTree2.TortoiseGit3.VSCode 中的 Git 如果不想用命令行工具&#xff0c;完全可以安装一个 Git 的 GUI 工具&#xff0c;用的更简单、更舒服。不用记那么多命令了&#xff0c;极易上手&#xff0c;不…

C语言循环结构 do while循环

do while循环 do while循环语句概述do while循环输出20个数do while循环注意事项 do while循环语句概述 作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;do{ 循环语句 } while&#xff08;循环条件&#xff09;&#xff1b; 注意&#xff1a;与 while…

Rocket如何实现顺序消费

RocketMQ 支持两种消息模式 集群消费&#xff08; Clustering &#xff09;和广播消费&#xff08; Broadcasting &#xff09;。 集群消费&#xff1a;同一 Topic 下的一条消息只会被同一消费组中的一个消费者消费。也就是说&#xff0c;消息被负载均衡到了同一个消费组的多…