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

目录

  • 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;
			// 只将扩容的内存置0
			memset((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--;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gRPC 的原理 介绍带你从头了解gRPC

gRPC 的原理 什么是gRPC gRPC的官方介绍是&#xff1a;gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架&#xff0c;基于 HTTP2 协议设计&#xff0c;序列化使用PB(Protocol Buffer)&#xff0c;PB 是一种语言无关的高性能序列化框架&#xff0c;基于 HTTP2PB 保…

Qt布局技巧

可以先把控件放置了&#xff0c;再选中所有控件右键布局 或者是点击上面的&#xff1a;

cesium雷达效果(脉冲圆)

cesium雷达效果(脉冲圆) 下面富有源码 实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写glsl来实现当前效果 示例代码 index.html <!DOCTYPE html> <html lang="en"><head>

CronExpression

CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JA…

Matlab群体智能优化算法之海象优化算法(WO)

文章目录 一、灵感来源二、算法的初始化三、GTO的数学模型Phase1&#xff1a;危险信号和安全信号Phase2&#xff1a;迁移&#xff08;探索&#xff09;Phase3&#xff1a;繁殖&#xff08;开发&#xff09; 四、流程图五、伪代码六、算法复杂度七、WO搜索示意图八、实验分析和结…

jbase打印导出实现

上一篇实现了虚拟M层&#xff0c;这篇基于虚拟M实现打印导出。 首先对接打印层 using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml;namesp…

探索NLP中的核心架构:编码器与解码器的区别

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

高校教师资格证备考

高等教育制度 关于人的全面发展和个体发展的关系&#xff0c;说法正确的是&#xff08;ABC&#xff09;。 A.个体发展是在全面发展基础上的选择性发展 B.全面发展是个体发展的前提和基础 C.个体发展又是全面发展的动力 D.个体发展是全面发展的前提和基础

什么是缓存雪崩、击穿、穿透?

背景 数据一般是存储于数据库中&#xff0c;数据库中的数据都是存在磁盘上的&#xff0c;磁盘读写的速度相较于内存或者CPU中的寄存器来说是非常慢的了。 如果用户的请求都直接访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就崩溃了&#xff0c;所以为了…

html网页设计 01基础标签

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body> <!-- 标题标签 h1最大 --><h1>最大标签</h1><h2>二级标签</h2><h3>三级标签</h3><…

SpringBoot 统一功能处理

一、用户登录拦截器 1、拦截器实现步骤 步骤1&#xff1a;自定义拦截器 // 自定义拦截器 Component public class LoginInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object h…

信号的机制——信号的发送与处理

对于硬件触发的&#xff0c;无论是中断&#xff0c;还是信号&#xff0c;肯定是先到内核的&#xff0c;然后内核对于中断和信号处理方式不同。一个是完全在内核里面处理完毕&#xff0c;一个是将信号放在对应的进程 task_struct 里信号相关的数据结构里面&#xff0c;然后等待进…

紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板

这是一套紫色调城市和奔跑人物剪影背景工会工作总结汇报PPT模板&#xff0c;共33页&#xff1b; PPT模板封面&#xff0c;使用了蓝天白云、城市剪影、奔跑人物剪影背景图片。中间填写工会工作总结汇报PPT标题。界面色彩丰富充满活力。 PowerPoint模板内容页&#xff0c;由31张…

gittee启动器

前言 很多小伙伴反馈不是使用gitee&#xff0c;不会寻找好的项目&#xff0c;在拿到一个项目不知道从哪里入手。 鼠鼠我呀就是宠粉&#xff0c;中嘞&#xff0c;老乡。整&#xff01;&#xff01;&#xff01; git的基本指令 在使用gitee的时候呢&#xff0c;我们只需要记住…

C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例

目录 0、前言1、安装 pybind11库c侧python侧 2、C引入bybind11vs增加相关依赖及设置cpp中添加头文件及导出模块cpp中添加numpy相关数据结构的接收和返回编译生成dll后改成导出模块同名文件的.pyd 3、python调用c4、C引入bybind11 0、前言 在当今的计算机视觉和机器学习领域&am…

【入门篇】1.4 redis 客户端 之 Lettuce 详解

文章目录 1. 简介1. 什么是Lettuce2. Lettuce与其他Redis客户端的比较3. Lettuce的特性和优势 2. 安装和配置3. 连接池配置1. 什么是连接池2. Lettuce的连接池使用与配置3. 连接池配置项 4. 基本操作1. 如何创建Lettuce连接2. Lettuce的基本操作如增删改查3. Lettuce的事务操作…

vue --version无法显示,只弹出vs窗口

参考连接&#xff1a; nodejs环境配置&#xff08;解压包&#xff09;安装教程_nodejs解压版安装及环境配置_tubond的博客-CSDN博客 原因&#xff1a;环境没搞好&#xff0c;没有设置全局文件夹&#xff0c;node默认放在C盘了&#xff0c;C盘有权限。因为npm -i vue/cli创建…

Vite - 配置 - 文件路径别名的配置

为什么要配置别名 别名的配置&#xff0c;主要作用是为了缩短代码中的导入路径。例如有如下的项目目录&#xff1a; project-name| -- src| -- a| --b| --c| --d| --e| -- abc.png| -- index.html| -- main.js如果想在 main.js 文件中使用 abc.png ,则使用的路径是 &#xff1…

【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;多任务系统中使用DHT11&#x1f345;关闭调度器&#x1f345;使用中断 &am…

人类智能的精髓超出了统计概率

处理不确定性好坏的程度是衡量各种智能系统高低的一个重要指标。在处理不确定性时&#xff0c;智能系统需要具备推理、学习和决策的能力&#xff0c;通常使用概率和统计等方法来建模和处理不确定性&#xff0c;以便更好地应对现实世界中的复杂问题。统计概率是基于大量观察和数…