数据结构(二)线性表

线性表,也称为线性结构,是数据结构中的一种基本类型,其特点是数据元素之间存在一对一的线性关系。线性表通常可以用数组(顺序存储)或链表(链式存储)来实现。线性表的特点是数据元素的排列呈现线性,即元素之间是有序的,并且每个元素(除了第一个和最后一个)都有一个前驱和一个后继。

线性表的顺序存储

线性表的顺序存储是指使用一段连续的存储单元依次存储线性表的数据元素,这种存储方式通常通过数组来实现。在顺序存储结构中,线性表的元素按照逻辑顺序在物理位置上也是连续的,即每个元素都有一个唯一的序号,称为其在表中的位置或索引。

顺序存储基本操作

结构定义

#define MAX_SIZE 100  // 定义最大长度
typedef struct {int data[MAX_SIZE];  // 存储数据元素的数组int length;          // 线性表的当前长度
} SequentialList;

初始化线性表

void initList(SequentialList *list) {list->length = 0;  // 初始化线性表长度为0
}

插入元素

在顺序存储的线性表中插入元素需要移动元素

int insertElement(SequentialList *list, int position, int element) {if (list->length == MAX_SIZE || position < 1 || position > list->length + 1)return 0;  // 插入失败for (int i = list->length; i >= position; i--) {list->data[i] = list->data[i - 1];  // 向后移动元素}list->data[position - 1] = element;  // 插入新元素list->length++;  // 长度增加return 1;  // 插入成功
}

删除元素

int deleteElement(SequentialList *list, int position) {if (position < 1 || position > list->length)return 0;  // 删除失败for (int i = position; i < list->length; i++) {list->data[i - 1] = list->data[i];  // 向前移动元素}list->length--;  // 长度减少return 1;  // 删除成功
}

访问元素

int getElement(const SequentialList *list, int position) {if (position < 1 || position > list->length)return -1;  // 位置不合法return list->data[position - 1];  // 返回元素
}

获取线性表的长度

int getListLength(const SequentialList *list) {return list->length;  // 返回线性表长度
}

 查找元素

int findElement(const SequentialList *list, int element) {for (int i = 0; i < list->length; i++) {if (list->data[i] == element) {return i + 1;  // 返回元素的位置}}return 0;  // 元素不存在
}

线性表的链式存储

使用一组任意的存储单元来存储线性表的数据元素,这些存储单元可以是连续的,也可以是不连续的。在链式存储结构中,数据元素的逻辑顺序是通过每个节点中的指针来实现的,而不是通过它们在内存中的物理位置。链式存储结构通常通过链表来实现,链表中的每个元素称为节点,包含数据域和指针域。

链式存储基本操作

结构定义

typedef struct Node {int data;                 // 数据域,存储节点的数据struct Node* next;        // 指针域,指向下一个节点的指针
} Node;

初始化线性表

初始化线性表是创建一个空的线性表,设置头指针为NULL

Node* initList() {return NULL;  // 返回一个空链表的头指针
}

创建节点

创建一个新节点,通常需要提供数据。

Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));if (newNode != NULL) {newNode->data = data;newNode->next = NULL;}return newNode;
}

插入元素

在链式存储的线性表中插入元素,需要更新节点的指针。

void insertAtHead(Node** head, int data) {Node* newNode = createNode(data);newNode->next = *head;*head = newNode;
}

删除元素

删除元素需要更新节点的指针。

void deleteNode(Node** head, Node* delNode) {if (*head == delNode) {*head = (*head)->next;free(delNode);} else {Node* temp = *head;while (temp->next != NULL && temp->next != delNode) {temp = temp->next;}if (temp->next == delNode) {temp->next = delNode->next;free(delNode);}}
}

访问元素

访问元素需要从头节点开始遍历链表。

int getElement(Node* head, int position) {Node* current = head;int index = 1;while (current != NULL && index < position) {current = current->next;index++;}if (current == NULL || index > position) {return -1;  // 位置不合法或元素不存在}return current->data;
}

获取线性表的长度

获取线性表的长度需要遍历链表。

int getListLength(Node* head) {int length = 0;Node* current = head;while (current != NULL) {length++;current = current->next;}return length;
}

清空线性表

清空线性表需要释放所有节点。

void clearList(Node** head) {Node* current = *head;while (current != NULL) {Node* temp = current;current = current->next;free(temp);}*head = NULL;
}

查找元素

查找元素涉及遍历链表以查找具有特定值的元素。

Node* findElement(Node* head, int element) {Node* current = head;while (current != NULL) {if (current->data == element) {return current;}current = current->next;}return NULL;  // 元素不存在
}

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

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

相关文章

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

Axure PR 9 穿梭框 设计交互

​大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将深入探讨Axure中穿梭筛选宽元件设计与交互技巧。 穿梭筛选框元件 创建穿梭筛选框所需的元件 左穿梭筛选框 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.现在画布上创建一个背景&#xff0c;在元件库中…

【东莞石碣】戴尔R740服务器维修raid硬盘问题

1&#xff1a;石碣某塑料工厂下午报修一台戴尔R740服务器硬盘故障&#xff0c;催的还比较着急。 2&#xff1a;工程师经过跟用户确认故障的问题以及故障服务器型号和故障硬盘型号&#xff0c;产品和配件确认好后&#xff0c;公司仓库确认有该款硬盘现货&#xff0c;DELL 12T S…

介绍一下strncpy(c基础)

strncpy是strcpy的进阶版&#xff0c;都是把一个字符串赋值给另一个字符串。但不同的是strncpy可以选择复制几个字符&#xff08;可以完全替代strcpy&#xff09; 链接介绍一下strcpy函数&#xff08;c基础&#xff09;-CSDN博客 格式 #include<string.h> strncpy(ar…

【Pythonr入门第二讲】你好,世界

"Hello, World!" 是一种传统的编程入门示例&#xff0c;通常是程序员学习一门新编程语言时编写的第一个程序。这个程序的目标非常简单&#xff1a;在屏幕上输出 "Hello, World!" 这个字符串。尽管它非常简单&#xff0c;但具有重要的象征意义和实际价值。 …

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

Windows 服务常用工具及 nssm 使用示例

Windows 将某个应用程序设为服务运行&#xff0c;确保它在后台稳定运行&#xff0c;并且在系统重启后自动启动。 常见的工具包括 Windows 自带的服务管理器、sc 命令、srvany 和第三方工具 nssm。 1.常用 Windows 服务工具 Windows 服务管理器&#xff1a;通过图形化界面&am…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

头歌——vlan基本配置第二关

任务描述 本关任务&#xff1a;根据前面的实验&#xff0c;完成相应的题目测试。

深度解析FastDFS:构建高效分布式文件存储的实战指南(上)

文章目录 一、FastDFS简介1.1 概述1.2 特性 二、FastDFS原理架构2.1 FastDFS角色2.2 存储策略2.3 上传过程2.4 文件同步2.5 下载过程 三、FastDFS适用场景四、同类中间件对比4.1 FastDFS和集中存储方式对比4.2 FastDFS与其他文件系统的对比 五、FastDFS部署5.1 单机部署5.1.1 使…

LeetCode 3249.统计好节点的数目:深度优先搜索(DFS)

【LetMeFly】3249.统计好节点的数目&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-good-nodes/ 现有一棵 无向 树&#xff0c;树中包含 n 个节点&#xff0c;按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一…

中国省级金融发展水平指数(金融机构存款余额、贷款余额、GDP)2020-2023年

数据范围&#xff1a; 包含的数据内容如下&#xff1a; 分省份金融机构存款余额、分省份金融机构贷款余额、分省份金融机构存贷款余额、分省份GDP、分省份金融发展指数 西藏自治区、贵州省、黑龙江省2023年数据暂未公布&#xff0c;计算至2022年&#xff0c;其他省份数据无缺失…

大模型(LLMs)RAG 版面分析——表格识别方法篇

大模型&#xff08;LLMs&#xff09;RAG 版面分析——表格识别方法篇 一、为什么需要识别表格&#xff1f; 表格的尺寸、类型和样式展现出多样化的特征&#xff0c;如背景填充的差异性、行列合并方法的多样性以及内容文本类型的不一致性等。同时&#xff0c;现有的文档资料不…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

【python系列】python数据类型的分类和比较

一、数据类型的定义 在程序设计的类型系统中,数据类型(英语:Data type),又称资料型态、资料型别,是用来约束数据的解释。——Wikipedia 从定义我们可以看出来,数字类型的理解最主要的是约束数据的解释,每个类型都有他们自己所使用得场景,这个就是数字类型的分类,分类…

【JavaSE】【多线程】阻塞队列

目录 一、阻塞队列1.1 生产者消费者模型1.2 Java提供的阻塞队列1.3 实现一个简单生产者消费者模型 二、自己实现阻塞队列2.1 成员变量2.2 构造方法2.3 put方法2.4 take方法2.5 最终代码 一、阻塞队列 阻塞队列&#xff1a;是一种特殊的队列&#xff0c;也有先进先出的特性。它…

【pytest】pytest注解使用指南

前言&#xff1a;在 pytest 测试框架中&#xff0c;注解&#xff08;通常称为装饰器&#xff09;用于为测试函数、类或方法提供额外的信息或元数据。这些装饰器可以影响测试的执行方式、报告方式以及测试的组织结构。pytest 提供了多种内置的装饰器&#xff0c;以及通过插件扩展…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…

OpenAI模型whisper 音频转文本

最近有一个音频转文本的需求&#xff0c;了解到了OpenAI的whisper模型可以实现。 Whisper 是 OpenAI 提供的一个通用语音识别模型&#xff0c;支持多语言的音频转文本功能&#xff0c;并具有较高的准确性。它的主要用途包括自动语音识别 (ASR)、语言翻译&#xff08;将音频直接…

ubuntu下连接了192.168.1.x和192.168.2.x两个网络段,如何让这个两个网段互相通信?

在 Ubuntu 上连接两个网络段&#xff08;如 个人终端A 192.168.1.10 和 个人终端B 192.168.2.10&#xff09;&#xff0c;需要配置路由和网络转发功能&#xff0c;使这两个网段能够相互通信。以下是实现方法&#xff1a; 步骤 1&#xff1a;确认网络配置 1. 确保 Ubuntu 机器…