顺序表的讲解与实现

顺序表的讲解与实现

  • 一、顺序表的概念及结构
  • 二、顺序表分类(C语言实现)
    • 顺序表和数组的区别
    • 顺序表分类
      • 静态顺序表
      • 动态顺序表
  • 三、动态顺序表的实现(使用VS2022)
    • 1.初始化、销毁、打印内容
    • 2.检查扩容
    • 3.尾部插入、尾部删除、头部插入、头部删除
      • 尾部插入
      • 尾部删除
      • 头部插入
      • 头部删除
    • 4.指定插入、指定删除、查找
      • 指定插入
      • 指定删除
      • 查找
  • 四、代码优化
  • 五、完整 SeqList.c 代码

一、顺序表的概念及结构

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

二、顺序表分类(C语言实现)

顺序表和数组的区别

顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。

顺序表分类

静态顺序表

概念:使用定长数组存储元素

#define N 10					// 长度恒定typedef int SeqListDataType;typedef struct SeqList
{SeqListDataType arr[N];		// 长度恒定int size;
} SeqList, *pSeqList;

静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费。

动态顺序表

概念:按需申请,避免空间进一步浪费

typedef int SeqListDataType;typedef struct SeqList
{SeqListDataType* arr;		// 指针int size;					// 当前容量int capacity;				// 总容量
} SeqList, * pSeqList;

三、动态顺序表的实现(使用VS2022)

这里以实现动态顺序表为例,开发工具为VS2022的C语言

动态顺序表常用的增删改查等接口包括:

1.初始化、销毁、打印内容

2.检查扩容

3.尾部插入、尾部删除、头部插入、头部删除

4.指定插入、指定删除、查找

在 SeqList.h 中:

#pragma once#include <stdio.h>
#include <assert.h>
#include <stdlib.h>// 初始化容量
#define INIT_CAPACITY 4// 扩容倍率
#define EXPANSION_MULTIPLE 2typedef int SeqListDataType;typedef struct SeqList
{SeqListDataType* arr;int size;int capacity;
} SeqList, * pSeqList;// 初始化、销毁、打印
void SeqListInit(pSeqList ps);void SeqListDestroy(pSeqList ps);void SeqListPrint(pSeqList ps);// 检查扩容
void CheckCapacity(pSeqList ps);// 尾插尾删、头插头删
void SeqListPushBack(pSeqList ps, SeqListDataType x);void SeqListPopBack(pSeqList ps);void SeqListPushFront(pSeqList ps, SeqListDataType x);void SeqListPopFront(pSeqList ps);// 插入、删除、查找
void SeqListInsert(pSeqList ps, int pos, SeqListDataType x);void SeqListErase(pSeqList ps, int pos);int SeqListFind(pSeqList ps, SeqListDataType x);

在 SeqList.c 中:

1.初始化、销毁、打印内容

#include "SeqList.h"// 初始化、销毁、打印
void SeqListInit(pSeqList ps)
{assert(ps);			// 防止进入空指针ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}void SeqListDestroy(pSeqList ps)
{assert(ps);free(ps->arr);ps->size = 0;ps->capacity = 0;
}void SeqListPrint(pSeqList ps)
{assert(ps);for (int i = 0; i < ps->size; ++i){printf("%d ", ps->arr[i]);}printf("\n");
}

2.检查扩容

// 检查扩容
void CheckCapacity(pSeqList ps)
{assert(ps);if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? INIT_CAPACITY : ps->capacity * EXPANSION_MULTIPLE;// ps->arr 为空时,realloc 会转为 mallocSeqListDataType* temp = (SeqListDataType*)realloc(ps->arr, newCapacity * sizeof(SeqListDataType));if (temp == NULL){perror("realloc failed");return;}// 更新ps->arr = temp;ps->capacity = newCapacity;}
}

3.尾部插入、尾部删除、头部插入、头部删除

尾部插入

void SeqListPushBack(pSeqList ps, SeqListDataType x)
{assert(ps);					CheckCapacity(ps);			// 检查容量,不足扩容ps->arr[ps->size++] = x;	// 尾插
}

尾部删除

void SeqListPopBack(pSeqList ps)
{assert(ps);assert(ps->size > 0);	// 防止为空--ps->size;				// 直接--忽略掉当前位置
}

头部插入

void SeqListPushFront(pSeqList ps, SeqListDataType x)
{assert(ps);CheckCapacity(ps);for (int end = ps->size; end > 0; --end){ps->arr[end] = ps->arr[end - 1];}ps->arr[0] = x;++ps->size;
}

在这里插入图片描述
在这里插入图片描述

头部删除

void SeqListPopFront(pSeqList ps)
{assert(ps);assert(ps->size > 0);for (int begin = 0; begin < ps->size - 1; ++begin){ps->arr[begin] = ps->arr[begin + 1];}--ps->size;
}

在这里插入图片描述
在这里插入图片描述

4.指定插入、指定删除、查找

指定插入

void SeqListInsert(pSeqList ps, int pos, SeqListDataType x)
{assert(ps);assert(0 <= pos && pos <= ps->size); // 当 pos == ps->size 可以实现尾插 CheckCapacity(ps);for (int end = ps->size; end > pos; --end){ps->arr[end] = ps->arr[end - 1];}ps->arr[pos] = x;++ps->size;
}

指定插入与头部插入同理,只需将结束位置改为 pos 指定的位置。

指定删除

void SeqListErase(pSeqList ps, int pos)
{assert(ps);assert(ps->size > 0);assert(0 <= pos && pos < ps->size);	// 尾删不可删 pos == ps->size 位置上的for (int begin = pos; begin < ps->size - 1; ++begin){ps->arr[begin] = ps->arr[begin + 1];}--ps->size;
}

指定删除与头部删除同理,只需将开始位置改为 pos 指定的位置。

查找

int SeqListFind(pSeqList ps, SeqListDataType x)
{assert(ps);assert(ps->size > 0);// 找到返回下标,反之返回 -1for (int i = 0; i < ps->size; ++i){if (ps->arr[i] == x){return i;}}return -1;
}

四、代码优化

指定插入 包含 尾插头插,指定删除 包含 尾删头删。可以复用两者,提高代码复用率

// 尾插尾删、头插头删
void SeqListPushBack(pSeqList ps, SeqListDataType x)
{SeqListInsert(ps, ps->size, x);
}void SeqListPopBack(pSeqList ps)
{SeqListErase(ps, ps->size - 1);
}void SeqListPushFront(pSeqList ps, SeqListDataType x)
{SeqListInsert(ps, 0, x);
}void SeqListPopFront(pSeqList ps)
{SeqListErase(ps, 0);
}

五、完整 SeqList.c 代码

#include "SeqList.h"// 初始化、销毁、打印
void SeqListInit(pSeqList ps)
{assert(ps);ps->arr = NULL;ps->size = 0;ps->capacity = 0;
}void SeqListDestroy(pSeqList ps)
{assert(ps);free(ps->arr);ps->size = 0;ps->capacity = 0;
}void SeqListPrint(pSeqList ps)
{assert(ps);for (int i = 0; i < ps->size; ++i){printf("%d ", ps->arr[i]);}printf("\n");
}// 检查扩容
void CheckCapacity(pSeqList ps)
{assert(ps);if (ps->size == ps->capacity){int newCapacity = ps->capacity == 0 ? INIT_CAPACITY : ps->capacity * EXPANSION_MULTIPLE;// ps->arr 为空时,realloc 会转为 mallocSeqListDataType* temp = (SeqListDataType*)realloc(ps->arr, newCapacity * sizeof(SeqListDataType));if (temp == NULL){perror("realloc failed");return;}// 更新ps->arr = temp;ps->capacity = newCapacity;}
}// 尾插尾删、头插头删
void SeqListPushBack(pSeqList ps, SeqListDataType x)
{SeqListInsert(ps, ps->size, x);
}void SeqListPopBack(pSeqList ps)
{SeqListErase(ps, ps->size - 1);
}void SeqListPushFront(pSeqList ps, SeqListDataType x)
{SeqListInsert(ps, 0, x);
}void SeqListPopFront(pSeqList ps)
{SeqListErase(ps, 0);
}// 插入、删除、查找
void SeqListInsert(pSeqList ps, int pos, SeqListDataType x)
{assert(ps);assert(0 <= pos && pos <= ps->size);CheckCapacity(ps);for (int end = ps->size; end > pos; --end){ps->arr[end] = ps->arr[end - 1];}ps->arr[pos] = x;++ps->size;
}void SeqListErase(pSeqList ps, int pos)
{assert(ps);assert(ps->size > 0);assert(0 <= pos && pos < ps->size);for (int begin = pos; begin < ps->size - 1; ++begin){ps->arr[begin] = ps->arr[begin + 1];}--ps->size;
}int SeqListFind(pSeqList ps, SeqListDataType x)
{assert(ps);assert(ps->size > 0);for (int i = 0; i < ps->size; ++i){if (ps->arr[i] == x){return i;}}return -1;
}

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

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

相关文章

【AIoT-Robot】3d hand pose

手语是聋哑人士的主要沟通工具,它是利用手部和身体的动作来传达意义。虽然手语帮助它的使用者之间互相沟通,但聋哑人士与一般人的沟通却十分困难,这个沟通障碍是源于大部分人不懂得手语。 1. 手势&&手语 手势:手的姿势 ,通常称作手势。它指的是人在运用手臂时,所…

Monaco Editor系列(六)Range详解、Uri 自动匹配语言模型、缩略图 miniMap 配置

前情回顾&#xff1a; 一鼓作气&#xff0c;再鼓&#xff0c;再鼓&#xff01;&#xff01;哈哈哈。争取早日占领 Monaco 领地。 上一篇文章讲到的三个功能分别是 Position 类型、设置 markers、指定位置插入或替换内容 涉及到的知识点&#xff1a; ⛈️ 获取光标位置&#x…

有哪些好用的ai工具,可以提升科研、学习、办公等效率?

最近&#xff0c;Sora的诞生为AI再添了一把火。 据介绍&#xff0c;这款“文生视频”的Sora可以直接输出长达60秒的视频&#xff0c;并且包含高度细致的背景、复杂的多角度镜头&#xff0c;以及富有情感的多个角色。 不仅能准确呈现细节&#xff0c;还能理解物体在物理世界中…

threadX 消息队列

1、 使用消息列的目的 在ThreadX操作系统下使用消息队列的目的主要有以下几点&#xff1a; 提高CPU利用率&#xff1a; 消息队列是RTOS&#xff08;实时操作系统&#xff09;中常用的一种数据通信方式&#xff0c;常用于任务与任务之间或是中断与任务之间的数据传递。相比裸机…

Centos 报错 One of the configured repositories failed

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用yum update更新命令就出现下面问题&#xff0c;系统是刚安装的&#xff0c;然后修改了一下IP变成手动。&#xff08;排查问题前&#xff0c;先回顾自己做了哪些操作&#xff0c;方便进一步排错&a…

PX4 ROS2 真机

如果仿真跑通了。 真机遇到问题&#xff0c;可参考此文章。 ubuntu22 px4 1.14.3 ros2 humble 硬件接线。 先找两个usb - ttl串口&#xff0c;分别接到两台主机上&#xff0c;保证串口通信正常。 图中是个六合一的。浪费一天时间&#xff0c;发现是串口设置错误&#xff…

小红书前端2轮面试期望22K,全程问低代码设计

一面&#xff08;通过&#xff09; 1、好&#xff0c;那我们开始把&#xff0c;先简单介绍一下自己的一个经历&#xff0c;以及自己有亮点的项目&#xff1f;balabala 2、你可以这样介绍&#xff1a;在这里边主要负责哪几个项目&#xff0c;哪些项目是比较有亮点的&#xff0…

如何让Google收录网站?

Google收录网站的前提条件是确保网站可以公开访问&#xff0c;并且页面加载速度需要快&#xff0c;这样Google爬虫才可以访问到你的网站&#xff0c;并且索引你网站中的内容。实现了上面的前提条件&#xff0c;可以通过优化数据结构、创建站点地图、使用Google Search Console、…

Apache Doris 基础 -- 数据表设计(表索引)

1、索引概述 索引用于帮助快速过滤或搜索数据。目前&#xff0c;Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…

Go微服务: 封装nacos-sdk-go的v2版本与应用

概述 基于前文&#xff1a;https://active.blog.csdn.net/article/details/139213323我们基于此SDK提供的API封装一个公共方法来用于生产环境 封装 nacos-sdk-go 我们封装一个 nacos.go 文件, 这个是通用的工具库 package commonimport ("fmt""github.com/nac…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 &#xff08;附加删除语句&#xff09; 5、查看&#xff08;tree .git/&#xff09; 6、增加和提交 7、打印日志 8、验证已操作工作

【机器学习】朴素贝叶斯算法及其应用探索

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 朴素贝叶斯算法及其应用探索引言1. 朴素贝叶斯基本概念1.1 贝叶斯定理回顾1.2 朴…

面试题:说一下 http 报文都有哪些东西?

面试题&#xff1a;说一下 http 报文都有哪些东西&#xff1f; HTTP 是传输超文本&#xff08;实际上除了 HTML&#xff0c;可以传输任何类型的文件&#xff0c;如视频、音频、文本等&#xff09;的协议&#xff0c;是一组用于浏览器-服务器之间数据传输的规则。 HTTP 位于 OS…

量化投资分析平台 迅投 QMT(二)

量化投资分析平台 迅投 QMT [迅投 QMT](https://www.xuntou.net/?user_code7NYs7O)我目前在使用如何获取数据上代码历史帖子 迅投 QMT 我目前在使用 两个月前&#xff08;2024年4月&#xff09;迅投和CQF有一个互动的活动&#xff0c;进行了平台的一个网上路演&#xff0c;刚…

简单小游戏制作

控制台基础设置 //隐藏光标 Console.CursorVisible false; //通过两个变量来存储舞台的大小 int w 50; int h 30; //设置舞台&#xff08;控制台&#xff09;的大小 Console.SetWindowSize(w, h); Console.SetBufferSize(w, h);多个场景 int nowSceneID 1; while (true) …

从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(三)

分布式计算原理 分布式计算的原理总结一句话就是&#xff1a;分而治之。 把数据分片&#xff0c;存在不同的机器中&#xff0c;解决数据存储的压力。客户端和服务端之间通过相关协议来自动的完成在不同的机器之间进行数据的存取&#xff0c;用户并不感知数据的物理存储结构。 用…

大模型Prompt-Tuning技术入门

Prompt-Tuning方法 1 NLP任务四种范式 目前学术界一般将NLP任务的发展分为四个阶段&#xff0c;即NLP四范式&#xff1a; 第一范式&#xff1a;基于「传统机器学习模型」的范式&#xff0c;如TF-IDF特征朴素贝叶斯等机器算法&#xff1b;第二范式&#xff1a;基于「深度学习模…

python小练习03

1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…

双指针解题

验证回文数&#xff08;验证回文数-CSDN博客&#xff09;和判断在子序列&#xff08;判断子序列-CSDN博客&#xff09;已经在之前进行了计算&#xff0c;今天有三个新的双指针问题&#xff1a; 两数之和II—输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0…

ZL-GL-4离体组织灌流系统测试在恒温条件下离体标本的肌张拉力

简单介绍&#xff1a; 离体组织灌流系统为生理实验及药理实验提供恒温环境&#xff0c;在麦氏浴皿内加养液同时能通氧&#xff0c;测试在恒温条件下离体标本的肌张拉力&#xff0c;离体组织灌流系统具有进气口,配备微调固定器,省时省力,并提高了实验效率,同时可方便串联恒温供水…