当前位置: 首页 > news >正文

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录😋

任务描述

 相关知识

一、线性表的基本概念

二、初始化线性表

三、销毁线性表

四、判定是否为空表

五、求线性表的长度

六、输出线性表

七、求线性表中某个数据元素值

八、按元素值查找

九、插入数据元素

十、删除数据元素

测试说明

通关代码

测试结果


任务描述

本关任务:实现顺序表的基本运算

 相关知识

为了完成本关任务,你需要掌握:

  1. 线性表的基本概念
  2. 初始化线性表
  3. 销毁线性表
  4. 判定是否为空表
  5. 求线性表的长度
  6. 输出线性表
  7. 求线性表中某个数据元素值
  8. 按元素值查找
  9. 插入数据元素
  10. 删除数据元素

一、线性表的基本概念

线性表是一种基本的数据结构,它是由 n(n ≥ 0)个具有相同类型的数据元素组成的有限序列。可以将线性表想象成一个队伍,队伍中的每个人(数据元素)都有自己的位置,并且他们的类型是相同的(比如都是学生)。常见的线性表有顺序表和链表

二、初始化线性表

  1. 顺序表初始化(以 C++ 为例)
    顺序表通常是用数组来实现的。初始化时,需要定义数组的大小,并且可以将线性表的长度(当前存储的元素个数)初始化为 0。
    示例代码:

    #define MAX_SIZE 100  // 假设顺序表最大容量为100
    template <typename T>
    class SeqList {
    public:T data[MAX_SIZE];int length;SeqList() {length = 0;}
    };
  2. 链表初始化(以单链表为例)
    单链表由节点组成,每个节点包含数据域和指针域。初始化时,头节点(如果有)的指针通常设为 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++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…...

Linux C/C++编程-获得套接字地址、主机名称和主机信息

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (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(“…...

力扣 跳跃游戏

每次更新目标位置时&#xff0c;实际上是在做一个局部的最优选择&#xff0c;选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时&#xff0c;都是基于当前能跳跃到的最远位置&#xff0c;因此最终的结果是全局最优的。 题目 从前往后遍历&#xff0c;更新可以到…...

使用npm 插件[mmdc]将.mmd时序图转换为图片

使用npm 插件[mmdc]将.mmd时序图转换为图片 1. 安装 mmdc2. 转换为图片 可以使用 mmdc &#xff08;Mermaid CLI&#xff09;这个工具来将 .mmd 时序图&#xff08;Mermaid语法描述的时序图&#xff09;转换为图片&#xff0c;以下是使用步骤&#xff1a; 1. 安装 mmdc 确保…...

ffmpeg 常用命令

更详细请参考ffmpeg手册&#xff0c;下载ffmpegrelease版后在doc中就有&#xff0c;主页面。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函数&#xff08;从新手角度逐步升级改进&#xff09;1. 基础版本&#xff08;利用循环计数&#xff09;2. 改进版本&#xff08;利用指针相减&#xff09;3. 递归版本&#xff08;利用递归思…...

npm install --global windows-build-tools --save 失败

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

十种基础排序算法(C语言实现,带源码)(有具体排序例子,适合学习理解)

学习了十种常见的排序方法&#xff0c;此文章针对所学的排序方法进行整理&#xff08;通过C语言完成排序&#xff09;。 参考内容&#xff1a; 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是一种革命性的 全双工通信协议 &#xff0c;构建在TCP之上&#xff0c;旨在简化客户端与服务器之间的数据交换过程。通过单次握手建立持久连接&#xff0c;WebSocket实现了真正的双向实时通信&#xff0c;显著提高了交互效率。这一特性…...

ComfyUI节点安装笔记

AI高速发展&#xff0c;版本更新相当快&#xff08;11月25日才安装的版本v.0.3.4&#xff0c;27日版本就已经更新到v.0.3.5了&#xff09;&#xff0c;在遇到问题&#xff0c;找到问题原因所在的过程中&#xff0c;ComfyUI版本、python版本、节点对环境版本的依赖&#xff0c;本…...

深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题

在训练过程中&#xff0c;训练集的准确率稳步上升&#xff0c;但是验证集的准确率一直在40%左右徘徊&#xff0c;从网上搜索可能的原因有&#xff1a; 1、学习率太小&#xff0c;陷入局部最优。 2、数据量太小&#xff08;4000多条数据&#xff0c;应该还可以吧&#xff09; …...

【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、switch 结构基本语法 2、示例代码及解释 3、使用注意事项 4、判断闰年的条件 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写程序实现&#xff1a;从键盘上输入一个年月日&#xff08;以空格或回车…...

Lumos学习王佩丰Excel二十四讲系列完结

“Lumos学习王佩丰Excel二十四讲系列”是一套完整的Excel教程&#xff0c;涵盖了从基础到高级的各种知识和技能。是我亲自一个个码出来的教程哇&#xff01;&#xff01;&#xff01; 一、课程概览 该教程共分为24讲&#xff0c;每一讲都围绕Excel的一个核心主题进行深入讲解…...

前后端规约

文章目录 引言I 【强制】前后端交互的 API请求内容响应体响应码II 【推荐】MVC响应体III【参考】IV 其他引言 服务器内部重定向必须使用 forward;外部重定向地址必须使用 URL 统一代理模块生成,否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”,并且还会带来 URL 维护…...

【数据可视化】数据可视化看板需求梳理模板(含示例)

一、模板 设计一个数据可视化看板需要从多个方面梳理需求&#xff0c;以确保看板能够有效地传达信息并满足用户的需求。以下是一些关键方面&#xff1a; 1.目标和受众 ● 明确目标&#xff1a;确定看板的主要目的&#xff0c;例如监控业务指标、分析市场趋势、展示项目进度等…...

CArray原理是什么,通过示例来展示如何使用?

CArray是MFC&#xff08;Microsoft Foundation Class&#xff09;库中的一个模板类&#xff0c;用于实现动态数组的功能。它类似于C语言中的数组&#xff0c;但具有自动增长和缩小的能力&#xff0c;从而方便管理动态数据。以下是对CArray原理的解析以及一个使用示例。 CArray…...

更换WordPress主题的基础知识及注意事项

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

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…...

03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达

深度学习中的损失函数(Cost Function)用于量化模型预测与真实数据的差距,是优化神经网络的核心指标。以下是常见类型及数学表达: 核心原理 逻辑回归通过sigmoid函数将线性预测结果转换为概率: y ^ ( i ) \hat{y}^{(i)}...

FineReport模板认证找不到模板

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

有意向往gis开发靠,如何规划学习?

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

2025年渗透测试面试题总结-ali 春招内推电话1面(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 ali 春招内推电话1面 一、Web安全核心理解 二、熟悉漏洞及防御方案 三、UDF提权原理与防御 四、XSS Fuzz…...

基于springboot的校园社团信息系统的设计与实现

其他源码获取可以看首页&#xff1a;代码老y 个人简介&#xff1a;专注于毕业设计项目定制开发&#xff1a;springbootvue系统&#xff0c;Java微信小程序&#xff0c;javaSSM系统等技术开发&#xff0c;并提供远程调试部署、代码讲解、文档指导、ppt制作等技术指导。源码获取&…...

从零到一:Maven 快速入门教程

目录 Maven 简介Maven 是什么为什么使用 Maven&#xff1f; 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …...

【LC实战派】小智固件编译

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

数字化时代养老机构运营实训室建设方案:养老机构运营沙盘实训模块设计

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

深度学习N2周:构建词典

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a;使用N1周的.txt文件构建词典&#xff0c;停用词请自定义 1.导入数据 from torchtext.vocab import build_vocab_from_iterator from co…...

java学习笔记——数组和二维数组

​​一、一维数组​​ ​​1. 定义数组​​ ​​语法​​: // 动态初始化(指定长度) 数据类型[] 数组名 = new 数据类型[长度]; // 示例: int[] arr1 = new int[5]; // 默认值:0// 静态初始化(直接赋值) 数据类型[] 数组名 = {元素1, 元素2, ...}; // 示例: String[]…...