数据结构之线性表
线性表
- 数据结构之线性表
- 一、基本定义
- 1、线性表的概念、定义,特点,线性表抽象数据类型定义
- 2、其他
- 二、线性表的顺序表示与实现
- 1、静态顺序表
- 2、静态表
- 三、线性表的链式表示与实现
- 1、单链表包含了指针的知识,是第一部分的重难点
- 2、特点
- 3、代码实现
数据结构之线性表
一、基本定义
1、线性表的概念、定义,特点,线性表抽象数据类型定义
1、定义:具有相同数据类型的n(n≥0)个数据元素的有限序列(线性表是逻辑结构)
2、特点:个数有限、顺序性、每个元素所占存储空间相同
2、其他
顺序表有序的时候,折半查找时间复杂度为O(log2(n))
线性表顺序存储结构是一个随机存取的存储结构(随机存取指的是读写)
二、线性表的顺序表示与实现
1、静态顺序表
#include <bits/stdc++.h>
#define MaxSize 10
#define ElemType intusing namespace std;// 静态顺序表
typedef struct {ElemType data[MaxSize];int length;
}Sqlist;// Initiate List
void InitList(Sqlist &L) {for(int i = 0; i < MaxSize; i++)L.data[i] = 0;L.length = 0;
}int main() {Sqlist L;InitList(L);
}
2、静态表
静态表是动态存储的,其实简单来讲就是动态数组,后面的栈和队列就是以此为基础的
// 动态顺序表
#include <bits/stdc++.h>
#include <stdlib.h>#define InitSize 10
#define AddSize 10
#define ElemType intusing namespace std;typedef struct {ElemType *data; int MaxSize;int length;
}SeqList;// 初始化顺序表
void InitList(SeqList &L) {L.data = (int *) malloc(InitSize * sizeof(ElemType));L.MaxSize = InitSize;L.length = 0;
}// 动态增加顺序表长度
void IncreaseSize(SeqList &L, int len) {ElemType *p = L.data;L.data = (int *) malloc((L.MaxSize + len) * sizeof(ElemType));for(int i = 0; i < L.length; i++)L.data[i] = p[i];L.MaxSize += len;free(p);
}// 增, O(n)
bool ListInsert(SeqList &L, int i, ElemType e) {if (i < 1 || i > L.length + 1)return false;if (L.length >= L.MaxSize)IncreaseSize(L, AddSize);for(int j = L.length; j >= i; j--)L.data[j] = L.data[j-1];L.data[i-1] = e;L.length++;return true;
}// 删, O(n)
bool ListDelete(SeqList &L, int i, ElemType &e) {if(i > L.length || i < 1)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;
}// 按位查找, O(1)
ElemType GetElem(SeqList L, int i) {if (i > L.length || i < 1)return 0;return L.data[i-1];
}// 按值查找, O(n)
int LocateElem(SeqList L, ElemType e) {for (int i = 0; i < L.length; i++){if (L.data[i] == e)return i + 1;}return 0; // 查找失败
} void PrintAll(SeqList L) {for (int i = 0; i < L.length; i++)cout<<L.data[i]<<" ";cout<<endl;
}// 测试信息
//int main() {
// SeqList L;
// InitList(L);
// ListInsert(L, 1, 1);
// ListInsert(L, 2, 2);
// ListInsert(L, 3, 3);
// PrintAll(L);
// int e = -1;
// ListDelete(L, 2, e);
// cout<<"删除的数为:"<<e<<endl;
// cout<<"3在第"<<LocateElem(L, 3)<<"个位置"<<endl;
// PrintAll(L);
// return 0;
//}
三、线性表的链式表示与实现
1、单链表包含了指针的知识,是第一部分的重难点
2、特点
单链表便于插入删除,但是查找需要遍历整个链表才可以
3、代码实现
#include <bits/stdc++.h>#define ElemType intusing namespace std;typedef struct LNode {ElemType data;LNode *next;
}LNode, *LinkList; 初始化:不带头指针的单链表
//bool InitList(LinkList &L) {
// L = NULL;
// return true;
//}// 初始化: 带头指针的单链表
// LinkList和LNode * 其实代指一样,只是前面强调为链表,后面强调为一个节点
bool InitList(LinkList &L) {L = (LNode *) malloc(sizeof(LNode));if (L == NULL)return false;L->next = NULL;return true;
}// 按位查找, 返回第i个元素
LNode *GetElem(LinkList L, int i) {if (i < 0)return NULL;// 如果i == 0, 返回的是头结点 LNode *p = L;int j = 0;while(p != NULL && j < i) {p = p -> next;j++;}return p;
}// 按值查找
LNode *LocateElem(LinkList L, ElemType e) {LNode *p = L -> next;while (p != NULL && p -> data != e)p = p -> next;return p;
} // 指定节点后插操作
bool InsertNextNode(LNode *p, ElemType e) {if (p == NULL)return false;LNode *s = (LNode *) malloc(sizeof(LNode));s -> data = e;s -> next = p -> next;p -> next = s;return true;
}// 指定节点的前插操作
bool InsertBeforeNode(LNode *p, ElemType e) {if (p == NULL)return false;LNode *s = (LNode *) malloc(sizeof(LNode));s -> next = p -> next;p -> next = s;// 换一下数据即可, 复杂度为O(1) s -> data = p -> data;p -> data = e;return true;
}// 按照位序插入, O(n)
bool ListInsert(LinkList &L, int i, ElemType e) {// 找到要插入位置的前一個LNode *p = GetElem(L, i - 1); if (p == NULL)return false;// 下面全部代码可以换成// return InsertNextNode(p, e); LNode *s = (LNode *) malloc(sizeof(LNode));s -> data = e;s -> next = p -> next;p -> next = s;return true;
}// 按位序删除, O(n)
bool ListDelete(LinkList &L, int i, ElemType &e) {LNode *p = GetElem(L, i - 1);if (p == NULL)return false;LNode *q = p -> next;e = q -> data;p -> next = q -> next;free(q);return true;
}// 求表的长度
int Length(LinkList L) {int len = 0;LNode *p = L;while(p -> next != NULL){p = p-> next;len++;}return len;
}// 建立单链表(尾插法)
LinkList List_TailInsert(LinkList &L) {ElemType input;L = (LinkList) malloc(sizeof(LNode));L -> next = NULL;LNode *r = L;cin>>input;while(input != -1) {LNode *s = (LNode *) malloc(sizeof(LNode));s -> data = input;s -> next = r -> next;r -> next = s;r = r -> next;cin>>input;}return L;
}// 建立单链表(头插法)
LinkList List_HeadInsert(LinkList &L) {L = (LinkList) malloc(sizeof(LNode));L -> next = NULL;ElemType input;cin>>input;while(input != -1) {LNode *s = (LNode *) malloc(sizeof(LNode));s -> data = input;s -> next = L -> next;L -> next = s;cin>>input;}return L;
}// 链表逆置
LinkList ReverseList(LinkList &L) {if(L -> next == NULL || L -> next -> next == NULL)return L;LNode *p = L -> next, *s;while(p -> next != NULL) {// 刪除了后面节点 s = p -> next;p -> next = s -> next;// 头插法s -> next = L -> next;L -> next = s;}
}// 打印所有
bool PrintAll(LinkList L) {LNode *p = L;while(p -> next != NULL) {p = p -> next;cout<<p -> data<<" ";}cout<<endl;
} // 测试用
int main() {LinkList L;int e;LNode *p;// 输入1, 2, 3, -1 List_TailInsert(L);PrintAll(L); // 1, 2, 3ListInsert(L, 3, 4);p = LocateElem(L, 2);cout<<p -> data<<endl; // 2InsertBeforeNode(p, 5);PrintAll(L); // 1, 5, 2, 4, 3ListDelete(L, 1, e);cout<<e<<endl; // 1PrintAll(L); // 5, 2, 4, 3ReverseList(L); // 3, 4, 2, 5PrintAll(L);cout<<Length(L); // 4
}相关文章:
数据结构之线性表
线性表 数据结构之线性表一、基本定义1、线性表的概念、定义,特点,线性表抽象数据类型定义2、其他 二、线性表的顺序表示与实现1、静态顺序表2、静态表 三、线性表的链式表示与实现1、单链表包含了指针的知识,是第一部分的重难点2、特点3、代…...
记录解决uniapp使用uview-plus在vue3+vite+ts项目中打包后样式不能显示问题
一、背景 从 vue2+uview1 升级到 vue3+vite+ts+uview-plus ,uview组件样式打包后不显示,升级前uview 组件是可以正常显示,升级后本地运行是可以正常显示,但是打包发布成H5后uview的组件无法正常显示,其他uniapp自己的组件可以正常显示。折腾了很久,这里记录下我是如何解决…...
三年功能测试,测试工作吐槽
概述 大家好,我是洋子。有很多粉丝朋友目前还是在做功能测试,日常会遇到很多繁琐,棘手的问题,今天分享一篇在testerhome社区的帖子《三年功能测试,测试工作吐槽》 原文链接https://testerhome.com/topics/38546 这篇文…...
0206-1-网络层
第 4 章 网络层 网络层提供的两种服务 虚电路服务 数据报服务 概要: 虚电路服务与数据报服务的对比 网际协议 IP 网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议: 地址解析协议 ARP (Address Resolution Protocol)逆地…...
以 All-in-One 模式安装 KubeSphere时避坑
环境 ubuntu 18.04 准备 安装服务插件 socat 必须 可选但建议 conntrack 必须 可选但建议 ebtables 可选但建议 可选但建议 ipset 可选但建议 可选但建议 命令 sudo apt-get install socat安装docker 建议自行安装,不用KubeSphere 自带的 处理服务器配置 1…...
Android T 远程动画显示流程其二——动画的添加流程(更新中)
前言 接着上篇文章分析 Android T 远程动画显示流程其一 切入点——处理应用的显示过渡 下面,我们以从桌面点击一个应用启动的场景来分析远程动画的流程,窗口添加的流程见Android T WMS窗口相关流程 这里我们从AppTransitionController.handleAppTran…...
Pytorch-SGD算法解析
关注B站可以观看更多实战教学视频:肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) SGD,即随机梯度下降(Stochastic Gradient Descent),是机器学习中用于优化目标函数的迭代方法,特别是在处…...
物联网土壤传感器简介
物联网土壤传感器简介 物联网土壤传感器的工作原理基于多种物理、化学和生物原理,通过感应器等组成部件将土壤中的特征数据转化为电信号,从而进行采集、处理和输出。这些传感器主要包括土壤湿度传感器、土壤温度传感器、土壤酸碱度传感器和土壤颗粒物传…...
MySQL索引面试题(高频)
文章目录 前言什么时候需要(不需要))使用索引?有哪些优化索引的方法前缀索引优化索引覆盖优化索引失效场景 总结 前言 今天来讲一讲 MySQL 索引的高频面试题。主要是针对前一篇文章 MySQL索引入门(一文搞定)进行查漏补…...
SouthLeetCode-打卡24年02月第2周
SouthLeetCode-打卡24年02月第2周 // Date : 2024/02/05 ~ 2024/02/11 039.有效的字母异位词 (1) 题目描述 039#LeetCode.242.简单题目链接#Monday2024/02/05 给定两个字符串 *s* 和 *t* ,编写一个函数来判断 *t* 是否是 *s* 的字母异位词。 **注意࿱…...
Rust CallBack的几种写法
模拟常用的几种函数调用CallBack的写法。测试调用都放在函数t6_call_back_task中。我正在学习Rust,有不对或者欠缺的地方,欢迎交流指正 type Callback std::sync::Arc<dyn Fn() Send Sync>; type CallbackReturnVal std::sync::Arc<dyn Fn…...
Redis突现拒绝连接问题处理总结
一、问题回顾 项目突然报异常 [INFO] 2024-02-20 10:09:43.116 i.l.core.protocol.ConnectionWatchdog [171]: Reconnecting, last destination was 192.168.0.231:6379 [WARN] 2024-02-20 10:09:43.120 i.l.core.protocol.ConnectionWatchdog [151]: Cannot reconnect…...
css中选择器的优先级
CSS 的优先级是由选择器的特指度(Specificity)和重要性(Importance)决定的,以下是优先级规则: 特指度: ID 选择器 (#id): 每个ID选择器计为100。 类选择器 (.class)、属性选择器 ([attr]) 和伪…...
python3字符串内建方法split()心得
python3字符串内建方法split()心得 概念 用指定分隔符(默认是任何空白字符)将字符串拆分成列表。 语法 string.split(separator.max) 参数1.split(参数2,参数3) 参数1:string 字符串,需要被拆分的字符串。 参数2&a…...
html的列表标签
列表标签 列表在html里面经常会用到的,主要使用来布局的,使其整齐好看. 无序列表 无序列表[重要]: ul ,li 示例代码1: 对应的效果: 无序列表的属性 属性值描述typedisc,square,…...
【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播
lecture04反向传播 课程网址 Pytorch深度学习实践 部分课件内容: import torchx_data [1.0,2.0,3.0] y_data [2.0,4.0,6.0] w torch.tensor([1.0]) w.requires_grad Truedef forward(x):return x*wdef loss(x,y):y_pred forward(x)return (y_pred-y)**2…...
PyTorch使用Tricks:学习率衰减 !!
文章目录 前言 1、指数衰减 2、固定步长衰减 3、多步长衰减 4、余弦退火衰减 5、自适应学习率衰减 6、自定义函数实现学习率调整:不同层不同的学习率 前言 在训练神经网络时,如果学习率过大,优化算法可能会在最优解附近震荡而无法收敛&#x…...
10MARL深度强化学习 Value Decomposition in Common-Reward Games
文章目录 前言1、价值分解的研究现状2、Individual-Global-Max Property3、Linear and Monotonic Value Decomposition3.1线性值分解3.2 单调值分解 前言 中心化价值函数能够缓解一些多智能体强化学习当中的问题,如非平稳性、局部可观测、信用分配与均衡选择等问题…...
2 Nacos适配达梦数据库实现方案
1、修改源代码方式 Nacos 原生是不支持达梦数据库的,所以就要想办法让它 “支持”,因为是开源软件,我们可以从源码入手,在流行的 1.x 、2.x 或最新版本代码的基本上进行修改。 主要涉及到以下内容的修改: com/alibaba/nacos/persistence/datasource/ExternalDataS...
【Gitea】配置 Push To Create
引 在 Git 代码管理工具使用过程中,经常需要将一个文件夹作为仓库上传到一个未创建的代码仓库。如果 Git 服务端使用的是 Gitea,通常会推送失败。 PS D:\tmp\git-test> git remote add origin http://192.1.1.1:3000/root/git-test.git PS D:\tmp\g…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
