顺序表的基本操作

1顺序表的基本操作有

  • 用于初始化顺序表,并为动态数组分配初始内存。
  • SLDestroy: 用于销毁顺序表,释放动态数组占用的内存。
  • SLPrint: 打印顺序表中的所有元素,通常用于调试。
  • SLPushBack: 在顺序表的尾部插入一个元素。
  • SLPushFront: 在顺序表的头部插入一个元素。
  • SLPopBack: 删除顺序表的尾部元素。
  • SLPopFront: 删除顺序表的头部元素。
  • SLInsert: 在顺序表的指定位置插入一个元素。
  • SLErase: 删除顺序表中指定位置的元素。
  • SLFind: 在顺序表中查找某个元素,如果找到返回其下标,否则返回 -1
  • 我将具体可以实现的代码分为三部分

1下面的头文件代码定义了一个动态顺序表(SeqList)及其相关操作函数。动态顺序表使用动态内存分配来存储数据。

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>// 定义顺序表中存储的数据类型
typedef int SLDataType;// 动态顺序表的结构定义
typedef struct SeqList
{SLDataType* arr;   // 指向动态数组的首地址int size;          // 顺序表中有效数据的个数int capacity;       // 顺序表的容量(总共可以容纳的元素个数)
} SL;// 顺序表的初始化函数,用于为顺序表分配初始内存
void SLInit(SL* ps);// 顺序表的销毁函数,用于释放顺序表占用的内存
void SLDestroy(SL* ps);// 打印顺序表中的元素(调试用)
void SLPrint(SL s);// 头部插入和尾部插入元素
void SLPushBack(SL* ps, SLDataType x);  // 在顺序表的尾部插入元素
void SLPushFront(SL* ps, SLDataType x);  // 在顺序表的头部插入元素// 头部删除和尾部删除元素
void SLPopBack(SL* ps);  // 删除顺序表的尾部元素
void SLPopFront(SL* ps);  // 删除顺序表的头部元素// 在指定位置插入或删除元素
void SLInsert(SL* ps, int pos, SLDataType x);  // 在指定位置之前插入元素
void SLErase(SL* ps, int pos);                 // 删除指定位置的元素// 查找某个元素,返回其下标,如果找不到返回-1
int SLFind(SL* ps, SLDataType x);

2下面代码实现了一个动态顺序表的基本操作,包括初始化、销毁、插入、删除、查找等功能。是上面各项操作的函数的具体实现过程

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"// 顺序表的初始化函数,用于初始化顺序表
void SLInit(SL* ps)
{ps->arr = NULL;          // 将数组指针初始化为NULLps->size = ps->capacity = 0; // 将有效数据个数和容量都初始化为0
}// 顺序表的销毁函数,用于释放顺序表占用的内存
void SLDestroy(SL* ps)
{if (ps->arr) // 如果数组指针不为空{free(ps->arr); // 释放数组占用的内存}ps->arr = NULL; // 将数组指针置为NULLps->size = ps->capacity = 0; // 将有效数据个数和容量都置为0
}// 检查并扩容顺序表,确保有足够的空间存储新数据
void SLCheckCapacity(SL* ps)
{// 如果当前容量等于有效数据个数,说明空间已满,需要扩容if (ps->capacity == ps->size){// 计算新的容量大小,如果是第一次扩容则设置为4,否则扩容为当前容量的2倍int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;// 使用realloc函数重新分配内存SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));if (tmp == NULL) // 如果内存分配失败{perror("realloc fail!"); // 输出错误信息exit(1); // 直接退出程序}// 内存分配成功,更新数组指针和容量ps->arr = tmp;ps->capacity = newCapacity;}
}// 尾插函数,在顺序表的尾部插入一个元素
void SLPushBack(SL* ps, SLDataType x)
{assert(ps); // 断言ps不为空SLCheckCapacity(ps); // 检查并扩容ps->arr[ps->size++] = x; // 在尾部插入元素,并将size加1
}// 头插函数,在顺序表的头部插入一个元素
void SLPushFront(SL* ps, SLDataType x)
{assert(ps); // 断言ps不为空SLCheckCapacity(ps); // 检查并扩容// 将已有数据整体向后移动一位,为新元素腾出空间for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[0] = x; // 在头部插入新元素ps->size++; // 增加有效数据个数
}// 打印顺序表中的元素
void SLPrint(SL s)
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]); // 打印每个元素}printf("\n"); // 换行
}// 尾删函数,删除顺序表的尾部元素
void SLPopBack(SL* ps)
{assert(ps); // 断言ps不为空assert(ps->size); // 断言顺序表不为空--ps->size; // 直接将size减1,相当于删除了最后一个元素
}// 头删函数,删除顺序表的头部元素
void SLPopFront(SL* ps)
{assert(ps); // 断言ps不为空assert(ps->size); // 断言顺序表不为空// 将已有数据整体向前移动一位,覆盖掉第一个元素for (int i = 0; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--; // 减少有效数据个数
}// 在指定位置插入一个元素
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps); // 断言ps不为空assert(pos >= 0 && pos <= ps->size); // 断言插入位置合法SLCheckCapacity(ps); // 检查并扩容// 将pos及之后的数据整体向后移动一位,为新元素腾出空间for (int i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x; // 在指定位置插入新元素ps->size++; // 增加有效数据个数
}// 删除指定位置的元素
void SLErase(SL* ps, int pos)
{assert(ps); // 断言ps不为空assert(pos >= 0 && pos <= ps->size); // 断言删除位置合法// 将pos之后的数据整体向前移动一位,覆盖掉指定位置的元素for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];}ps->size--; // 减少有效数据个数
}// 查找指定元素,返回其下标,如果找不到返回-1
int SLFind(SL* ps, SLDataType x)
{assert(ps); // 断言ps不为空for (int i = 0; i < ps->size; i++){if (ps->arr[i] == x) // 如果找到元素{return i; // 返回元素下标}}return -1; // 没有找到元素,返回-1
}

3输入具体数值调用函数的过程

#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"// 测试顺序表的基本操作
void SLtest01() {SL sl; // 定义一个顺序表SLInit(&sl); // 初始化顺序表// 在顺序表尾部插入元素SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPrint(sl); // 输出当前顺序表: 1 2 3 4// 在顺序表头部插入元素SLPushFront(&sl, 6);SLPushFront(&sl, 7);SLPrint(sl); // 输出当前顺序表: 7 6 1 2 3 4// 从尾部删除元素SLPopBack(&sl);SLPrint(sl); // 输出当前顺序表: 7 6 1 2 3// 从头部删除元素SLPopFront(&sl);SLPrint(sl); // 输出当前顺序表: 6 1 2 3
}// 测试顺序表的其他操作
void SLTest02() {SL sl; // 定义一个顺序表SLInit(&sl); // 初始化顺序表// 在顺序表尾部插入元素SLPushBack(&sl, 1);SLPushBack(&sl, 2);SLPushBack(&sl, 3);SLPushBack(&sl, 4);SLPrint(sl); // 输出当前顺序表: 1 2 3 4// 测试在指定位置之前插入数据SLInsert(&sl, 1, 99); // 在下标1的位置前插入99SLInsert(&sl, sl.size, 88); // 在顺序表最后插入88SLPrint(sl); // 输出当前顺序表: 99 1 2 3 4 88// 测试删除指定位置的数据SLErase(&sl, 0); // 删除下标为0的元素SLPrint(sl); // 输出当前顺序表: 1 2 3 4 88// 测试顺序表的查找int find = SLFind(&sl, 4); // 查找元素4的位置if (find < 0) {printf("没有找到!\n"); // 如果未找到,输出提示} else {printf("找到了!下标为%d\n", find); // 找到时输出下标}// 释放顺序表占用的资源SLDestroy(&sl);
}int main() {SLtest01(); SLTest02(); return 0; 
}

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

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

相关文章

程序员:数字时代的先锋

随着科技的不断进步&#xff0c;程序员这一职业群体逐渐成为社会中不可或缺的一部分。他们以智慧和汗水为世界带来更多的便捷与创新。今天&#xff0c;我们将庆祝1024程序员节&#xff0c;这是一个向全球程序员们表达敬意和感激的节日。让我们一同走进程序员的内心世界&#xf…

Unity 实现音频(mp3)可控制进度条

目录 前言 一、拼UI 二、上代码 前言 效果如图&#xff1a;&#xff08;因为是GIF格式&#xff0c;录不上音频&#xff09; 一、拼UI 1.新建空物体添加AudioSource&#xff0c;给AudioSource添加音频文件&#xff0c;取消勾选PlayOnAwake&#xff0c;勾选上Loop 2.创建Slid…

VMware虚拟机中centos磁盘扩容(非VG分区挂载方案)

目录 1、虚拟机磁盘扩容2、查看磁盘分区3、编辑磁盘分区4、调整文件系统大小 搭建dify的时候发现虚拟机的磁盘空间不够了&#xff1b;搜索了很多教程都是用的vg分区去扩展的&#xff1b;没有part类型直接扩容的教程&#xff1b;然后自己摸索了下&#xff1b;特此记录分享 1、虚…

docker-compose-lnmp-wordpress

使用 docker-compose 在 CentOS 7 上编写并部署 LNMP (Linux, Nginx, MySQL, PHP) 环境的 YAML 文章目录 部署步骤&#xff1a;1. 安装 Docker 和 Docker Compose1.1安装 Docker&#xff1a;1.2安装 Docker Compose&#xff1a; 2.创建目录结构3.编写docker-compose.yml4.ngin…

K8S调度不平衡问题分析过程和解决方案

不平衡问题排查 问题描述&#xff1a; 1、业务部署大量pod(据反馈&#xff0c;基本为任务型进程)过程中&#xff0c;k8s node内存使用率表现不均衡&#xff0c;范围从80%到百分之几&#xff1b; 2、单个node内存使用率超过95%&#xff0c;仍未发生pod驱逐&#xff0c;存在node…

LabVIEW提高开发效率技巧----离线调试

离线调试是LabVIEW开发中一项重要的技巧&#xff0c;通过使用Simulate Signal Express VI生成虚拟数据&#xff0c;开发者能够有效减少对实际硬件的依赖&#xff0c;加速开发过程。这种方法不仅可以提高开发效率&#xff0c;还能降低成本&#xff0c;增强系统的灵活性。 ​ 离…

不同企业规模,外贸财务系统如何灵活应对

ZohoBooks外贸财务系统适用于不同规模企业。小型企业注重成本和易用性&#xff0c;中型企业追求性价比&#xff0c;大型企业看重全面性、数据安全和集成性。企业选择时需考虑实际需求和成本&#xff0c;建议先试用再决定。 一、小型外贸企业 小型外贸企业通常业务规模相对较小…

使用Airtest自动化某云音乐爬取歌曲名称

简介 本文将介绍如何使用Airtest自动化工具来模拟用户操作&#xff0c;从某云音乐中爬取与特定关键词相关的歌曲名称。我们将以搜索“文字”相关的歌曲为例&#xff0c;并将结果保存到本地文件。 准备工作 安装Airtest并配置好Android设备或模拟器。确保你的设备上已安装某云…

项目管理新趋势!2024年,Jira与禅道你更倾向谁?

一、 项目管理软件新趋势概述 2024 年&#xff0c;项目管理软件呈现出诸多新趋势&#xff0c;这些趋势对于项目管理的重要性日益凸显。 在数字化转型方面&#xff0c;项目管理软件成为企业实现数字化转型的关键工具。越来越多的企业认识到&#xff0c;通过项目管理软件可以实…

【T+】畅捷通T+软件更新补丁提示当前系统中没有安装T+产品

【问题描述】 在更新畅捷通T软件补丁的时候&#xff0c; 提示&#xff1a;当前系统中没有安装T产品。但是本机电脑上还能正常打开软件操作使用。 【解决方法】 首先查看控制面板程序中没有T产品&#xff0c;即下图没有T产品信息。 原因是因为控制面板注册表中没有T产品信息。…

机器学习-树结构2-随机森林

上一篇的链接&#xff1a; 机器学习 - 树结构1 - 随机森林-CSDN博客 随机森林的改进方向1&#xff1a; 现有的随机森林中不同决策树中特征的选取是随机的&#xff0c;即先用哪个特征对样本进行分类&#xff0c;再用哪个特征对样本进行分类&#xff0c;特征的选取是随机的&…

[Python学习日记-54] 软件开发目录设计规范

[Python学习日记-54] 软件开发目录设计规范 简介 为什么要设计好目录结构&#xff1f; 目录组织方式 关于 README 的内容 关于 setup.py 和 requirements.txt 关于配置文件的使用方法 简介 我们在浏览一些开源项目或者是一些安装后的软件的时候会发现&#xff0c;不同的两…

解决:IntelliJ IDEA 项目中代码文件不能运行的问题(即:J 标文件的问题)

1、问题描述&#xff1a; 其一、需求为&#xff1a; 想要通过 IntelliJ IDEA 软件打开原 Eclipse 项目文件或新 Java 项目&#xff0c;能正常运行 .java 文件中的代码; 其二、问题描述为&#xff1a; A、通过 IntelliJ IDEA 打开 java 项目&#xff0c;并在打开具体的 .jav…

记nvm管理node

前言 解决来回切换node版本适应不同项目 一、nvm是什么&#xff1f; nvm是用于管理多个 nodejs 的版本控制工具 二、使用步骤 1.卸载nodeJs 若是本地原先有nodeJs版本的话需要先卸载&#xff0c;若是没有则跳过这一步&#xff0c;可以通过命令行来确定是否存在node node…

【C++11】右值引用和移动语义

1 右值引用和移动语义 C98的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;C11之后我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 1.1 左值和右值 左值是⼀个表示数据的表达式(如变量名或解引用…

HbuilderX 连接 Genymotion 模拟器

最近在琢磨 uni-app 开发 app 应用&#xff0c;并且想要基于模拟器调试&#xff1b;但模拟器安装好以后&#xff0c;Hbuilder 始终识别不了&#xff08;识别成功了也运行不了代码&#xff09; 模拟器&#xff1a;Genymotion &#xff1b;这款模拟器用于开发调试是比较流畅的。当…

如何禁止上班期间浏览无关网站?

禁止员工在上班期间浏览无关网页主要是为了提升工作效率和生产力&#xff0c;确保员工能够专注于工作任务。同时&#xff0c;这种做法有助于降低网络安全风险&#xff0c;防止恶意软件和钓鱼攻击&#xff0c;减少数据泄露和法律风险&#xff0c;维护公司的专业形象&#xff0c;…

【系统配置】命令行修改统信UOS的grub启动延时

往期好文&#xff1a;【命令操作】Linux中多种关机和重启的命令介绍 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何通过命令行配置统信UOS系统的启动延时的文章。在某些场景中&#xff0c;调整系统的启动延时可以帮助用户在系统启动过…

实践OpenVINO™ GenAI

前言 随着 ChatGPT 等聊天机器人的风暴席卷全球&#xff0c;生成式预训练 Transformers &#xff08;GPT&#xff09; 在开发者中正在成为家喻户晓的新名字。生成式 AI&#xff08;GenAI&#xff09; 的发展&#xff0c;尤其是大语言模型和聊天机器人的进步很快、变化不断&…

短剧AI突围战,百度跑偏了

“ 百度短剧的Agent对话功能并不属于颠覆性创新&#xff0c;只是新插件&#xff0c;对短剧行业市场格局影响不大&#xff0c;最多只能算用户痒点。 ” 转载&#xff1a;科技新知 原创 作者丨晓伊 编辑丨蕨影 你是否有过这样的体验&#xff1f; 刷短剧时&#xff0c;因剧情曲…