数据结构(二)线性表

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

线性表的顺序存储

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

顺序存储基本操作

结构定义

#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,一经查实,立即删除!

相关文章

SQLite3 JDBC Java工具类

最近生产环境mysql各种无法使用&#xff0c;要求下线。有一堆小工具&#xff0c;平时因为mysql用着方便&#xff0c;配置啊&#xff0c;临时的一些比对数据存在里面。迁移很麻烦。 发现SQLite 3.47.0版本之后&#xff0c;性能大增&#xff0c;支持多线程&#xff0c;记录级锁。…

招聘和面试

本篇内容是根据2019年4月份#82 Hiring and job interviews音频录制内容的整理与翻译 小组成员 Mat Ryer、Ashley McNamara、Johnny Boursiquot 和 Carmen Andoh 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分&#xff0c;我们如何选择与谁一起工作&#xff1…

【代码随想录|回溯算法排列问题】

491.非减子序列 题目链接. - 力扣&#xff08;LeetCode&#xff09; 这里和子集问题||很像&#xff0c;但是这里要的是非递减的子序列&#xff0c;要按照给的数组的顺序来进行排序&#xff0c;就是如果我给定的数组是[4,4,3,2,1]&#xff0c;如果用子集||的做法先进行排序得到…

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…

summernote富文本批量上传音频,视频等附件

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理) JS和CSS的引入 <head><th:block th:include"include :: summernote-css" /> </head> <body><th:block th:include"include :: summernote-js" /> …

介绍一下strncpy(c基础)

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

1065 A+B and C (64bit) (20)

Given three integers A, B and C in (−2^63,2^63), you are supposed to tell whether AB>C. Input Specification: The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line conta…

【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…

10万字208道Java经典面试题总结(2024修订版)- SpringBoot篇下篇

目录 1、Spring Boot的配置文件有哪几种格式&#xff0c;它们之间有何区别&#xff1f;2、Spring Boot如何实现跨域资源共享&#xff08;CORS&#xff09;&#xff1f;3、Spring Boot中的配置文件如何进行加密&#xff1f;4、Spring Boot如何集成Spring Data JPA&#xff1f;5、…

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

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

解决前后端发版本时候,手动清除浏览器缓存

在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称&#xff1a;【文件名称.时间戳】、【文件名称.版本号.…

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

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

基于java实现选择排序和插入排序

选择排序 实现逻辑&#xff1a; 选择排序是将当前元素和剩下的元素进行比较当当前元素大于所比较的元素的时候两个元素进行交换 public class Search { // 选择排序private void Serach() {};public static <E extends Comparable <E> > void search(E[] arr…

Spring Boot教程之三:Spring Boot 与 Spring MVC 及 Spring的区别

Spring Boot 与 Spring MVC 的区别 Spring MVC&#xff1a; Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序&#xff0c;Spring 提供了 Spring MVC 框架&#xff0c;它是 Spring 的一个广泛使用的模块&#xff0c;用于创建可扩展的 Web 应用程序。Spring MVC 框架支…

深度解析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 。给你一…