【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
目录😋
任务描述
相关知识
一、线性表的基本概念
二、初始化线性表
三、销毁线性表
四、判定是否为空表
五、求线性表的长度
六、输出线性表
七、求线性表中某个数据元素值
八、按元素值查找
九、插入数据元素
十、删除数据元素
测试说明
通关代码
测试结果
任务描述
本关任务:实现顺序表的基本运算
相关知识
为了完成本关任务,你需要掌握:
- 线性表的基本概念
- 初始化线性表
- 销毁线性表
- 判定是否为空表
- 求线性表的长度
- 输出线性表
- 求线性表中某个数据元素值
- 按元素值查找
- 插入数据元素
- 删除数据元素
一、线性表的基本概念
线性表是一种基本的数据结构,它是由 n(n ≥ 0)个具有相同类型的数据元素组成的有限序列。可以将线性表想象成一个队伍,队伍中的每个人(数据元素)都有自己的位置,并且他们的类型是相同的(比如都是学生)。常见的线性表有顺序表和链表
二、初始化线性表
顺序表初始化(以 C++ 为例)
顺序表通常是用数组来实现的。初始化时,需要定义数组的大小,并且可以将线性表的长度(当前存储的元素个数)初始化为 0。
示例代码:#define MAX_SIZE 100 // 假设顺序表最大容量为100 template <typename T> class SeqList { public:T data[MAX_SIZE];int length;SeqList() {length = 0;} };
链表初始化(以单链表为例)
单链表由节点组成,每个节点包含数据域和指针域。初始化时,头节点(如果有)的指针通常设为 NULL,表示链表为空。
示例代码:template <typename T> struct ListNode {T data;ListNode<T> *next;ListNode(T x) : data(x), next(NULL) {} }; // 初始化一个空链表,只需要定义头节点并将其next指针设为NULL ListNode<int> *head = new ListNode<int>(0); head->next = NULL;
三、销毁线性表
- 顺序表销毁
- 对于顺序表,如果是静态分配的数组(如上述示例),在程序结束时自动销毁。如果是动态分配的数组,需要使用
delete[]
来释放内存。不过一般简单的顺序表在程序结束时会自动回收内存,不需要手动销毁。- 链表销毁
- 对于链表,需要遍历链表,逐个释放节点占用的内存。从链表的头节点开始,先保存下一个节点的指针,然后释放当前节点,再将指针指向下一个节点,直到链表为空。
示例代码:
template <typename T> void destroyList(ListNode<T> *head) {ListNode<T> *current = head;ListNode<T> *next;while (current!= NULL) {next = current->next;delete current;current = next;} }
四、判定是否为空表
- 顺序表判定
- 只需检查线性表的长度是否为 0。如果
length == 0
,则顺序表为空。示例代码:
template <typename T> bool isEmpty(SeqList<T> list) {return list.length == 0; }
- 链表判定
- 对于链表,检查头节点的下一个节点是否为 NULL。如果
head->next == NULL
,则链表为空。示例代码:
template <typename T> bool isEmpty(ListNode<T> *head) {return head->next == NULL; }
五、求线性表的长度
- 顺序表求长度
- 直接返回顺序表中记录长度的变量的值,如
return length;
。- 链表求长度
- 需要遍历链表,从链表头节点开始(不计算头节点本身,如果有头节点的话),每经过一个节点,长度加 1,直到链表结束。
示例代码:
template <typename T> int length(ListNode<T> *head) {int len = 0;ListNode<T> *current = head->next;while (current!= NULL) {len++;current = current->next;}return len; }
六、输出线性表
- 顺序表输出
- 遍历顺序表数组中从 0 到
length - 1
的元素,逐个输出元素。示例代码:
template <typename T> void printSeqList(SeqList<T> list) {for (int i = 0; i < list.length; i++) {std::cout << list.data[i] << " ";}std::cout << std::endl; }
- 链表输出
- 从链表头节点的下一个节点(如果有头节点)开始,遍历链表,输出每个节点的数据域内容,直到链表结束。
示例代码:
template <typename T> void printList(ListNode<T> *head) {ListNode<T> *current = head->next;while (current!= NULL) {std::cout << current->data << " ";current = current->next;}std::cout << std::endl; }
七、求线性表中某个数据元素值
- 顺序表求元素值
- 给定元素的位置(索引)
i
,如果0 <= i < length
,则返回data[i]
,否则可能需要根据具体情况返回错误信息(如抛出异常或者返回一个特殊值表示位置无效)。- 链表求元素值
- 首先遍历链表,当遍历到第
i
个节点(假设链表头节点不算在内,从 0 开始计数)时,返回该节点的数据域的值。这可能需要一个计数器来记录当前遍历到的节点位置。
八、按元素值查找
- 顺序表按元素值查找
- 遍历顺序表数组,从 0 到
length - 1
,比较每个元素和目标元素的值。如果找到相等的元素,返回该元素的索引;如果遍历完整个顺序表都没有找到,可能返回一个特殊值(如 - 1)表示未找到。示例代码:
template <typename T> int findElement(SeqList<T> list, T target) {for (int i = 0; i < list.length; i++) {if (list.data[i] == target) {return i;}}return -1; }
- 链表按元素值查找
- 从链表头节点的下一个节点开始遍历链表,比较每个节点的数据域和目标元素的值。如果找到相等的元素,返回该节点(或者返回节点的索引,这取决于具体要求);如果遍历完整个链表都没有找到,返回一个表示未找到的特殊值。
九、插入数据元素
- 顺序表插入元素
- 如果是在位置
i
插入元素,需要先判断i
的合法性(如0 <= i <= length
)。如果i
合法,将i
及以后的元素向后移动一位(从最后一个元素开始移动),然后将新元素插入到i
位置,最后长度加 1。示例代码:
template <typename T> void insertElement(SeqList<T> &list, T element, int i) {if (i < 0 || i > list.length) {std::cout << "插入位置无效" << std::endl;return;}if (list.length == MAX_SIZE) {std::cout << "顺序表已满" << std::endl;return;}for (int j = list.length; j > i; j--) {list.data[j] = list.data[j - 1];}list.data[i] = element;list.length++; }
- 链表插入元素
- 插入位置分为在头节点后插入、在中间节点插入和在尾节点插入。如果是在头节点后插入,只需修改新节点的指针和头节点的指针;在中间节点插入,需要先找到插入位置的前一个节点,然后修改指针来插入新节点;在尾节点插入,找到链表的最后一个节点,将新节点插入到最后一个节点之后。
十、删除数据元素
- 顺序表删除元素
- 给定要删除元素的位置
i
,先判断i
的合法性(如0 <= i < length
)。如果i
合法,将i + 1
位置的元素向前移动到i
位置,直到最后一个元素,然后长度减 1。示例代码:
template <typename T> void deleteElement(SeqList<T> &list, int i) {if (i < 0 || i >= list.length) {std::cout << "删除位置无效" << std::endl;return;}for (int j = i; j < list.length - 1; j++) {list.data[j] = list.data[j + 1];}list.length--; }
- 链表删除元素
- 同样需要先找到要删除的节点。如果是删除头节点后的节点,修改头节点的指针;如果是删除中间节点,找到要删除节点的前一个节点,修改指针跳过要删除的节点;如果是删除尾节点,找到倒数第二个节点,将其指针设为 NULL。
测试说明
平台会对你编写的代码进行测试:
测试输入:
3 4
预期输出:
(1)初始化顺序表L (2)依次插入a,b,c,d,e元素 (3)输出顺序表L:a b c d e (4)顺序表L长度:5 (5)顺序表L为非空 (6)顺序表L的第3个元素:c (7)元素a的位置:1 (8)在第4个元素位置上插入f元素 (9)输出顺序表L:a b c f d e (10)删除L的第3个元素 (11)输出顺序表L:a b f d e (12)释放顺序表L
开始你的任务吧,祝你成功!
通关代码
// 请在Begin-End之间添加你的代码,
//实现顺序表的如下基本运算,假设顺序表的元素类型为char//
//(1)初始化顺序表L//
//(2)依次插入a,b,c,d,e元素//
//(3)输出顺序表L//
//(4)输出顺序表L的长度//
//(5)判断顺序表L是否为空,输出判断结果//
//(6)输出顺序表L的第m个元素,m由用户输入//
//(7)输出元素a的位置//
//(8)在第n个元素位置上插入f元素,n由用户输入//
//(9)输出顺序表L//
//(10)删除顺序表L的第m个元素,延用第(6)的m//
//(11)输出顺序表L//
//(12)释放顺序表L//
/********** Begin *********/
#include <iostream>
#include <string>using namespace std;#define MAX_SIZE 100typedef char ElemType;typedef struct {ElemType data[MAX_SIZE];int length;
} SeqList;void InitList(SeqList &L) { L.length = 0; }void PrintList(SeqList L) {for (int i = 0; i < L.length; i++) {cout << L.data[i] << " ";}cout << endl;
}
int InsertList(SeqList *L, int i, ElemType e) {if (i < 1 || i > L->length + 1 || L->length >= MAX_SIZE)return 0;for (int j = L->length; j >= i; j--) {L->data[j] = L->data[j - 1];}L->data[i - 1] = e;L->length++;return 1;
}bool GetElem(SeqList L, int i, ElemType &e) {if (i < 1 || i > L.length)return false;e = L.data[i - 1];return true;
}int LocateElem(SeqList L, ElemType e) {for (int i = 0; i < L.length; i++) {if (L.data[i] == e)return i + 1;}return 0;
}bool ListInsert(SeqList &L, int i, ElemType e) {if (i < 1 || i > L.length + 1)return false;for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1];}L.data[i - 1] = e;L.length++;return true;
}bool ListDelete(SeqList &L, int i, ElemType &e) {if (i < 1 || i > L.length)return false;e = L.data[i - 1];for (int j = i; j < L.length; j++) {L.data[j - 1] = L.data[j];}L.length--;return true;
}int main() {SeqList L;InitList(L);int pos1, pos2;cin >> pos1 >> pos2;cout << "(1)初始化顺序表L" << endl;char elements[] = {'a', 'b', 'c', 'd', 'e'};for (int i = 0; i < 5; i++) {InsertList(&L, i + 1, elements[i]);}cout << "(2)依次插入a,b,c,d,e元素" << endl;cout << "(3)输出顺序表L:";PrintList(L);cout << "(4)顺序表L长度:" << L.length << endl;cout << "(5)顺序表L为非空" << endl;ElemType e;if (GetElem(L, pos1, e)) {cout << "(6)顺序表L的第" << pos1 << "个元素:" << e << endl;}int pos = LocateElem(L, 'a');cout << "(7)元素a的位置:" << pos << endl;ListInsert(L, pos2, 'f');cout << "(8)在第" << pos2 << "个元素位置上插入f元素" << endl;cout << "(9)输出顺序表L:";PrintList(L);ListDelete(L, pos1, e);cout << "(10)删除L的第" << pos1 << "个元素" << endl;cout << "(11)输出顺序表L:";PrintList(L);cout << "(12)释放顺序表L";return 0;
}
/********** End **********/
测试结果
相关文章:

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...

Linux C/C++编程-获得套接字地址、主机名称和主机信息
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com…...
USB kbtab linux 驱动代码
#include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> #include <asm/unaligned.h> /* Pressure-threshold modules param code from */MODULE_AUTHOR(“xxx”); MODULE_DESCRIPTION(“…...

力扣 跳跃游戏
每次更新目标位置时,实际上是在做一个局部的最优选择,选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时,都是基于当前能跳跃到的最远位置,因此最终的结果是全局最优的。 题目 从前往后遍历,更新可以到…...
使用npm 插件[mmdc]将.mmd时序图转换为图片
使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc (Mermaid CLI)这个工具来将 .mmd 时序图(Mermaid语法描述的时序图)转换为图片,以下是使用步骤: 1. 安装 mmdc 确保…...

ffmpeg 常用命令
更详细请参考ffmpeg手册,下载ffmpegrelease版后在doc中就有,主页面。video filter 参考ffmpeg-filters.html -version -formats -demuxers -protocols -muxers -filters -devices —pix_fmts -codecs -sample_fmts -decoders -layouts -encoders -colors…...
从入门到实战:C 语言 strlen 函数通关指南
文章目录 一、strlen函数简介1. 函数构成2. 参数说明3. 使用示例 二、模拟实现strlen函数(从新手角度逐步升级改进)1. 基础版本(利用循环计数)2. 改进版本(利用指针相减)3. 递归版本(利用递归思…...

npm install --global windows-build-tools --save 失败
注意以下点 为啥下载windows-build-tools,是因为node-sass4.14.1 一直下载不成功,提示python2 没有安装,最终要安装这个,但是安装这个又失败,主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …...

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)
学习了十种常见的排序方法,此文章针对所学的排序方法进行整理(通过C语言完成排序)。 参考内容: https://blog.csdn.net/mwj327720862/article/details/80498455 https://www.runoob.com/w3cnote/ten-sorting-algorithm.html 1. 冒…...

基于fMRI数据计算脑脊液(CSF)与全脑BOLD信号的时间耦合分析
一、前言 笔者之前的文章《基于Dpabi和spm12的脑脊液(csf)分割和提取笔记》,介绍了如何从普通的fMRI数据中提取CSF信号。首先是基础的预处理,包括时间层校正、头动校正,再加上0.01-0.1Hz的带通滤波。接着用SPM12分割出CSF区域,设置一个比较严格的0.9阈值,确保提取的真是…...

实现websocket心跳检测,断线重连机制
WebSocket基础 WebSocket概念 WebSocket是一种革命性的 全双工通信协议 ,构建在TCP之上,旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接,WebSocket实现了真正的双向实时通信,显著提高了交互效率。这一特性…...

ComfyUI节点安装笔记
AI高速发展,版本更新相当快(11月25日才安装的版本v.0.3.4,27日版本就已经更新到v.0.3.5了),在遇到问题,找到问题原因所在的过程中,ComfyUI版本、python版本、节点对环境版本的依赖,本…...
深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题
在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …...

【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:编写程序实现:从键盘上输入一个年月日(以空格或回车…...
Lumos学习王佩丰Excel二十四讲系列完结
“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程,涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇!!! 一、课程概览 该教程共分为24讲,每一讲都围绕Excel的一个核心主题进行深入讲解…...

前后端规约
文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...
【数据可视化】数据可视化看板需求梳理模板(含示例)
一、模板 设计一个数据可视化看板需要从多个方面梳理需求,以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面: 1.目标和受众 ● 明确目标:确定看板的主要目的,例如监控业务指标、分析市场趋势、展示项目进度等…...
CArray原理是什么,通过示例来展示如何使用?
CArray是MFC(Microsoft Foundation Class)库中的一个模板类,用于实现动态数组的功能。它类似于C语言中的数组,但具有自动增长和缩小的能力,从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...

更换WordPress主题的基础知识及注意事项
更换WordPress主题是优化和升级网站的重要步骤,不仅能够增强网站的视觉效果,还能改进用户体验并提高网站性能。然而,在进行该操作时,必须格外谨慎,避免数据丢失或功能失调的风险。本文将介绍在更换主题前需要采取的基本…...

springcloud篇3-docker需熟练掌握的知识点
docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充:配置镜像源 注意: yum安装是在线联网下载安装,而很多的资源…...
03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达
深度学习中的损失函数(Cost Function)用于量化模型预测与真实数据的差距,是优化神经网络的核心指标。以下是常见类型及数学表达: 核心原理 逻辑回归通过sigmoid函数将线性预测结果转换为概率: y ^ ( i ) \hat{y}^{(i)}...

FineReport模板认证找不到模板
水善利万物而不争,处众人之所恶,故几于道💦 文章目录 1.现象及排查过程2. 解决办法 1.现象及排查过程 FR模板认证下面找不到模板 由于是集群部署的FR,所以后台查看了sftp服务器,测试连接,连接成功。 但是…...

有意向往gis开发靠,如何规划学习?
听说GIS开发工资不错、还不像互联网那么卷?心动了?但一看那些“WebGL”、“空间分析”、“OGC规范”的词儿就头大?别急! 今天咱就聊聊零基础/转行选手,咋规划学习GIS开发这条路。不整高大上,就讲实在的&am…...

2025年渗透测试面试题总结-ali 春招内推电话1面(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 ali 春招内推电话1面 一、Web安全核心理解 二、熟悉漏洞及防御方案 三、UDF提权原理与防御 四、XSS Fuzz…...
基于springboot的校园社团信息系统的设计与实现
其他源码获取可以看首页:代码老y 个人简介:专注于毕业设计项目定制开发:springbootvue系统,Java微信小程序,javaSSM系统等技术开发,并提供远程调试部署、代码讲解、文档指导、ppt制作等技术指导。源码获取&…...

从零到一:Maven 快速入门教程
目录 Maven 简介Maven 是什么为什么使用 Maven? 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …...

【LC实战派】小智固件编译
这篇写给立创吴总,是节前答应他配合git代码的说明;也给所有对小智感兴趣的小伙伴。 请多提意见,让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中实际的…...

数字化时代养老机构运营实训室建设方案:养老机构运营沙盘实训模块设计
在数字化浪潮席卷各行各业的当下,养老机构运营实训室建设方案中的养老机构运营沙盘实训模块设计,已成为培养专业养老运营人才的关键环节,它需紧密贴合时代需求,构建兼具前瞻性与实用性的实训体系。点击获取实训室建设方案 一、养…...

深度学习N2周:构建词典
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 本周任务:使用N1周的.txt文件构建词典,停用词请自定义 1.导入数据 from torchtext.vocab import build_vocab_from_iterator from co…...
java学习笔记——数组和二维数组
一、一维数组 1. 定义数组 语法: // 动态初始化(指定长度) 数据类型[] 数组名 = new 数据类型[长度]; // 示例: int[] arr1 = new int[5]; // 默认值:0// 静态初始化(直接赋值) 数据类型[] 数组名 = {元素1, 元素2, ...}; // 示例: String[]…...