考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表

线性表的顺序存储结构 - 顺序表

1. 顺序表的定义

​ 用一组地址连续的存储单元依次存储线性表的数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻

2. 顺序表的特点

  • 随机访问: 即通过首地址和元素序号可以在O(1) 时间内找到指定元素!
  • 存储密度高: 每个节点只存储数据节点!(链表还要存储指针)
  • 不宜与插入删除与扩容: 进行这些操作需要进行大量的元素移动操作

3. 顺序表的相关代码(Dev-C++)

​ 本代码使用万能头文件,如果运行失败,请自行修改头文件!

  • 顺序表创建 - 静态分配
#include<bits/stdc++.h>
#define MAXSIZE 10 //最大长度
using namespace std;typedef struct{int data[MAXSIZE]; //静态数组存放数据元素int length;
}SeqList;//初始化顺序表
void InitSeqList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; i++ ){L.data[i] = 0;}L.length = 0;
}int main(){SeqList L;InitSeqList(L); return 0;
}
  • 顺序表创建 - 动态分配
#include<bits/stdc++.h>
#define INITSIZE 10 //初始长度
using namespace std;typedef struct{int *data; //动态分配数组的指针int length;int MAXSIZE; //最大长度
}SeqList;//初始化顺序表
void InitList(SeqList &L){L.data = (int*)malloc(INITSIZE*sizeof(int));L.length = 0;L.MAXSIZE = INITSIZE;cout << "初始化链表最大长度为:" << L.MAXSIZE << endl; 
}void IncreaseSize(SeqList &L, int len){int *p = L.data;L.data = (int *)malloc((L.MAXSIZE + len)*sizeof(int));for(int i = 0 ; i < L.length ; i ++){ //复制数据到新申请的区域L.data[i] = p[i];}L.MAXSIZE = L.MAXSIZE + len; //增加长度free(p);  //释放内存空间cout << "增加后链表最大长度为:" << L.MAXSIZE; 
}int main() {SeqList L;InitList(L);int len;cout << "现在进行动态链表长度扩充:(请输入增加长度):"; cin >> len;IncreaseSize(L,len);return 0;
}
  • 顺序表的插入

​ 顺序表插入可以分解为两个步骤:

· 从后向前遍历,将顺序表中第 i 个元素及以后的元素都向后移动一个位置。

· 将需要插入的元素 e 放入 L.data[i - 1] 的位置即可。

#include<bits/stdc++.h>
#define MAXSIZE 20
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; i++){L.data[i] = 0;}L.length = 5; //Test: L.length = 0; 这里初始化为长度为5,是为了下面输出顺序表可以看到 要不然测试的时候不会打印顺序表!cout << "初始化后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}bool ListInsert(SeqList &L, int i, int e){if(i < 1 || i > L.length + 1) return false; //检查要插入的位置是否合理if(L.length > MAXSIZE) return false; //检查长度是否允许继续插入for(int j = L.length ; j >= i ; -- j ){ //从后向前遍历,一次向后挪动一个位置L.data[j] = L.data[j - 1];}L.length ++; //记得增加表长L.data[i - 1] = e;cout << "插入元素后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int main(){SeqList L;int i, e;InitList(L);cout << "请输入要插入的位置及元素:" << endl;cin >> i >> e; ListInsert(L, i, e);return 0;	
}

时间复杂度分析:

最好情况:要在最后一个位置插入元素,那么不需要移动元素,时间复杂度为O(1)

最坏情况:要在表头插入一个元素,那么所有元素都需要向后移动一个位置,时间复杂度为O(n)。其中 n 为表长度。

平均情况:要插入的元素插入到任何一个位置的概率相同,平均时间复杂度为O(n)

  • 顺序表的删除

​ 顺序表的删除(这里指删除第 i 个位置的元素)可以分为两个步骤:

· 将第 i 个位置的元素赋值给 e。这个目的是传回,如果没必要的话其实可以不用这个步骤。

· 从 i 位置开始向后遍历,让后面的元素都向前移动,填补删除元素的位置。

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; ++ i){L.data[i] = 0;} L.length = 5; //Test: L.length = 5;cout << "初始化后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}bool ListDel(SeqList &L, int i, int &e){ //这里的e只是为了把删除的元素带回if(i < 1 || i > L.length) return false; //检查合理性if(L.length == 0) return false;e = L.data[i - 1];for(int j = i ; j < L.length ; ++ j){L.data[j - 1] = L.data[j];}L.length --; //记得减少长度cout << "删除后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; return true;
}int main(){SeqList L;int i, e;InitList(L);cout << "请输入要删除第几个元素" << endl;cin >> i;if(ListDel(L, i, e)){cout << "删除成功!删除的元素为:" << e << endl; }else{cout << "删除失败!" << endl;}return 0;
}

时间复杂度分析:

最好情况:删除表尾元素,那么不需要移动元素,时间复杂度为O(1)

最坏情况:删除表头元素,那么n - 1元素都需要向前移动一个位置,时间复杂度为O(n)。其中 n 为表长度。

平均情况:删除任何一个位置的元素概率都相同,那么平均时间复杂度为O(n)

  • 顺序表按位查找

GetElem(L, i, e) 函数,传入要查找的位号,即要查找第几个元素,e是为了带回该元素的值!

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < MAXSIZE ; ++ i){L.data[i] = i;}L.length = 5; //Test: L.length = 5;cout << "初始化后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int GetElem(SeqList &L, int i, int &e){if(i < 1 || i > L.length) return false;if(L.length == 0) return false;e = L.data[i - 1];return e;
}int main(){SeqList L;int i;int e;InitList(L);cout << "请输入查找第几个元素:" << endl; cin >> i;if(GetElem(L, i, e)){cout << "查找成功,该元素为:" << e << endl;}else{cout << "查找失败!" << endl; }return 0;
}

时间复杂度分析: O(1),因为可以直接通过索引访问元素。

  • 顺序表按值查找

LocateElem(L, e, loc) 函数,传入要查找的元素值,loc 是为了带回该元素的位序!

#include<bits/stdc++.h>
#define MAXSIZE 10
using namespace std;typedef struct{int data[MAXSIZE];int length;
}SeqList;void InitList(SeqList &L){for(int i = 0 ; i < L.length ; ++ i){L.data[i] = i;}L.length = 5; //Test: L.length = 0;cout << "初始化后的顺序表" << endl;for(int i = 0 ; i < L.length ; ++ i){cout << L.data[i] << " "; } cout << '\n'; 
}int LocateElem(SeqList &L, int e, int &loc){for(int i = 0 ; i < L.length ; ++ i){if(L.data[i] == e){loc = i + 1;return loc;}}return false;
}int main(){SeqList L;int e;int loc;InitList(L);cout << "请输入要查找的数值" << endl;cin >> e;if(LocateElem(L, e, loc)){cout << "查找成功,该元素位于第" << loc << "个位置!" << endl;}else{cout << "查找失败!" << endl; }return 0;
}

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

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

相关文章

【经验分享】SpringBoot集成WebSocket开发02 之 实现一个基本示例并Spring Bean注入的方式来组织代码

结合Spring Boot和WebSocket实现一个基本示例&#xff0c;并且使用Spring Bean注入的方式来组织代码。 1. 创建Spring Boot项目 首先&#xff0c;确保你有一个Spring Boot项目&#xff0c;并在pom.xml文件中引入了WebSocket相关的依赖。 <dependencies><!-- Spring…

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理&#xff0c;并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易&#xff0c;我们还是在开篇介绍它的原理&#xff1a; Guava Cache 通过分段&#xff08;…

2025年【广东省安全员C证第四批(专职安全生产管理人员)】考试及广东省安全员C证第四批(专职安全生产管理人员)模拟试题

安全生产是各行各业不可忽视的重要环节&#xff0c;特别是在广东省这样的经济大省&#xff0c;安全生产的重要性更是不言而喻。为了确保安全生产管理人员具备足够的专业知识和实际操作能力&#xff0c;广东省定期举办安全员C证考试。本文将详细介绍2025年广东省安全员C证第四批…

传输层自学

传输实体&#xff1a;完成传输层任务的硬件或软件 可能位于&#xff1a; 操作系统内核独立的用户进程绑定在网络应用中的链接库网络接口卡 1.功能&#xff1a; 网络层与传输层作用范围比较&#xff1f; 网络层负责把数据从源机送达到目的机 传输层负责把数据送达到具体的应…

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用&#xff1a;开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明&#xff08;游戏规则&#xff09;1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…

Spring Cloud Config - 动态配置管理与高可用治理

引言&#xff1a;为什么需要配置中心&#xff1f; 在微服务架构中&#xff0c;配置管理面临分散化、多环境、动态更新三大挑战。传统基于application.yml等配置文件的硬编码方式&#xff0c;导致以下问题&#xff1a; • 环境差异&#xff1a;开发、测试、生产环境配置混杂&a…

Git 常用命令指南

本文档旨在提供 Git 的常用命令及其使用示例&#xff0c;涵盖全局参数配置、获取本地仓库、基本概念、本地仓库操作、远程仓库操作和分支操作等内容。 1. 全局参数配置 Git 允许用户配置全局参数&#xff0c;以便在所有的仓库中共享这些设置。 <BASH> # 设置用户名 gi…

基于Python+Flask+MySQL+HTML的爬取豆瓣电影top-250数据并进行可视化的数据可视化平台

FlaskMySQLHTML 项目采用前后端分离技术&#xff0c;包含完整的前端&#xff0c;以flask作为后端 Pyecharts、jieba进行前端图表展示 通过MySQL收集格列数据 通过Pyecharts制作数据图表 这是博主b站发布的详细讲解&#xff0c;感兴趣的可以去观看&#xff1a;【Python爬虫可…

rpc grpc

RPC Remote Procedure Call&#xff0c;远程过程调用&#xff0c;是用来屏蔽分布式计算中的各种调用细节&#xff0c;使得调用远端的方法就像调用本地的一样。 客户端与服务端沟通的过程 客户端发送数据(以字节流的方式)&#xff1b;&#xff08;编码&#xff09;服务端接受…

GStreamer —— 2.15、Windows下Qt加载GStreamer库后运行 - “播放教程 1:Playbin 使用“(附:完整源码)

运行效果 介绍 我们已经使用了这个元素&#xff0c;它能够构建一个完整的播放管道&#xff0c;而无需做太多工作。 本教程介绍如何进一步自定义&#xff0c;以防其默认值不适合我们的特定需求。将学习&#xff1a; • 如何确定文件包含多少个流&#xff0c;以及如何切换 其中。…

30、Vuex 为啥可以进行缓存处理

Vuex 状态管理基础与缓存的关联 Vuex 的核心概念&#xff1a; Vuex 主要由五个部分组成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存储数据的地方&#xff0c;类似于一个全局的数据仓库。在这个菜谱 APP 的例子中&#xff0c;缓存的数…

25届数字IC验证秋招总结

一、个人概况 双非本9硕&#xff0c;2024年初开始通过白皮书蓝皮书自学验证&#xff0c;半年实习经验&#xff0c;有竞赛无专利论文&#xff0c;在秋招期间投递企业130余家&#xff0c;绝大部分投递岗位为数字验证&#xff0c;面试20家&#xff0c;收到5个offer。因为背景和相关…

【商城实战(37)】Spring Boot配置优化:解锁高效商城开发密码

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

网页制作12-html,css,javascript初认识のJavascipt脚本基础

一、JavaScript的三种基本使用方法:body|head|外部 网页效果: 运行代码: .html <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title><script> function n1(){document.getElementById(…

全面对比分析:HDMI、DP、DVI、VGA、Type-C、SDI视频接口特点详解

在当今的多媒体时代&#xff0c;视频接口的选择对于设备连接和显示效果至关重要。不同的视频接口在传输质量、兼容性、带宽等方面各有优劣。本文将全面对比分析常用的视频接口HDMI、DP、DVI、VGA、Type-C、SDI&#xff0c;帮助读者更好地理解它们的特点和适用场景。 一、HDMI&…

麒麟服务器操作系统PostgreSQL环境部署手册

软件简介 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。 ORDBMS(对象关系数据库系统)是面向对象技术与传统的关系数据库相结合的产物,查询处理是 ORDBMS 的重要组成部分,它的性能优劣将直接影响到DBMS 的性能。 软件环境 操作系统…

【蓝桥杯速成】| 4.递归

递归 题目一&#xff1a;最大公约数 问题描述 1979. 找出数组的最大公约数 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums &#xff0c;返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 解题步骤 需要…

当大模型训练遇上“双向飙车”:DeepSeek开源周 DualPipe解析指南

前言 在大模型训练中&#xff0c;传统流水线并行因单向数据流和通信延迟的限制&#xff0c;导致GPU利用率不足60%&#xff0c;成为算力瓶颈。DeepSeek团队提出的DualPipe双向流水线架构&#xff0c;通过双向计算流与计算-通信重叠的创新设计&#xff0c;将前向与反向传播拆解为…