数据结构——顺序表

数据结构是什么

        数据机构是计算机存储、组织数据的一种方式,他是将逻辑关系和物理关系它们的相互关系结合在一起,并利用这种关系实现在计算机上来对数据的存储和组织,并对他们做出适当的计算和做出一些优秀的算法,但最终不会改变数据的结构类型;      

        数据结构 = 结构定义 + 结构操作

        结构定义:

        结构定义分为两个物理结构和逻辑结构

        物理结构定义,在数据结构的静态部分,它定义了数据元素之间的关系和布局,以及每个元素的属性。例如这个文章中的顺序表,他的物理结构定义就是:

typedef struct Vector {int size;//顺序表的长度int len;//顺序表现有的元素个数void *data;//数据存储区
} Vector;

        而它的逻辑结构定义就是,每个元素物理结构和逻辑结构都是连续的,也就是每个元素之间的地址也是连续的;

        结构操作:

        结构操作就是在不破坏结构定义的前提下,去对定义结构里的数据进行操作,比如增删改查;例如对于顺序表的插入元素:

        

int add_element(Vector *v, int ind, int val) {//插入元素//在顺序表的ind位置插入元素valif (!v) return 0;if (ind < 0 || ind > v->len) return 0;//因为元素之间必须连续,所以插入元素位置必须在[0, v->len)区间内if (v->len == v->size) return 0;//超过了结构定义的长度,无法再插入元素,这里可以去扩容,这里你们自己实现以下,也是对自己对能力的提升for (int i = v->len; i > ind; i--) {//将ind位置和以后的位置向后移,将ind的位置空出来放valv->data[i] = v->data[i - 1];}v->data[ind] = val;(v->len)++;return 1;
} 

顺序表 

        大概讲述了以下数据结构是什么,现在来说顺序表;

        顺序表就是把它里面的元素的物理结构,逻辑结构都是连续起来的,也就是他们的地址是连续的,在我们的思想里也是连续的;

        它其实和数组是差不太多的,但是它里面存了元素,每个元素是必须连续的,而数组你可以想存在那个数组的位置就可以存在那个位置,没有结构定义的逻辑限制;所以我上面说了在对结构操作时不能去违背结构定义;不然就像你女朋友给你买了一包搽脸巾,而你拿来擦py;你破坏了结构定义,就是你违背了你女朋友的想法;

        不要想着去违背女人的想法,所以不要去违背结构定义,这样你就会很轻松的拿捏女朋友,呸,数据结构;

        顺序表的物理结构定义很简单

        1.他的总长度

        2.他现在的长度

        3.存储元素的空间(也就是数组)

        而它的逻辑结构定义就是,元素的物理结构,逻辑结构都是连续起来的;

        有了这几个条件就可以去实现顺序表了,然后我用的是C语言,因为C语言没有封装好的这些数据结构,只能通过自己去实现定义啊,操作啊这些,当你能用C语言自己来实现这些东西了,你用封装好的那不是手手到擒来;

        代码实现:

        

#include <stdio.h>
#include <time.h>
#include <stdlib.h>typedef struct Vector {int size;//顺序表的长度int len;//顺序表现有的元素个数int *data;//数据存储区
} Vector;Vector *init(int n) {//向计算机借空间,记得还回去Vector *v = (Vector *)calloc(sizeof(Vector), 1); v->data = (int *)calloc(sizeof(int), n);v->size = n;v->len = 0;return v;
}int add_element(Vector *v, int ind, int val) {if (!v) return 0;if (ind < 0 || ind > v->len) return 0;//因为元素之间必须连续,所以插入元素位置必须在[0, v->len)区间内   if (v->len == v->size) return 0;//超过了结构定义的长度,无法再插入元素,这里可以去扩容,这里你们自己实现以下,也是对自己对能力的提升    for (int i = v->len; i > ind; i--) {//讲ind位置和以后的位置向后移,讲ind的位置空出来放valv->data[i] = v->data[i - 1];}v->data[ind] = val;(v->len)++;return 1;
} int erase(Vector *v, int ind) {//删除ind位置的元素if (!v) return 0;if (ind < 0 || ind >= v->len) return 0;//删除肯定要删除区间里的元素,区间外是没有元素的for (int i = ind + 1; i < v->len; i++) {//直接从ind + 1往前覆盖,最终覆盖掉ind位置的元素v->data[i - 1] = v->data[i];}(v->len)--;return 1;
}void output(Vector *v) {if (!v) return ;printf("Vector(%d) = [", v->len);for (int i = 0; i < v->len; i++) {i && printf(",");printf("%d", v->data[i]);}printf("]\n");return ;
}void clear(Vector *v) {//你用了就要还回去,你是借的计算机的不是你的if (!v) return ;free(v->data);free(v);return ;
}int main() {//测试srand(time(0));Vector *v = init(10);int op, ind, val;for (int i = 0; i < 20; i++) {op = rand() % 4;//1/4概率删除,3/4概率添加ind = rand() % (v->len + 2) - 1;val = rand() % 100;switch (op) {case 0:case 1:case 2: {printf("%d insert in Vector %d is %d\n", val, ind, add_element(v, ind, val)); } break;case 3: {printf("erase in Vector %d is %d\n", ind, erase(v, ind));} break;}output(v);}clear(v);//最后记得释放动态开辟的空间!!数据结构基本都会动态开辟空间return 0;
}

        顺序表比较简单没有什么可以说的了,如果还是没有懂,可以评论,我会对应的回复;

如果觉得对你有帮助可以点个赞谢谢 

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

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

相关文章

Java——它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。

这是一个Java程序&#xff0c;它要求用户输入一个整数&#xff08;实际上是一个字符串&#xff09;&#xff0c;然后计算该整数的平方值&#xff0c;并将结果输出。程序的基本流程如下&#xff1a; 首先&#xff0c;声明并初始化变量data和result&#xff0c;它们的初始值都为…

扁线电机定子转子工艺及自动化装备

售&#xff1a;扁线电机 电驱对标样件 需要请联&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 新能源车电机路线大趋势&#xff0c;自动化装配产线需求迫切永磁同步电机是新能源车驱动电机的主要技术路线。目前新能源车上最广泛应用的类型为永磁同步电机&#xff0c…

W5500-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…

如何搭建智能问答FAQ的底层数据基础呢?

搭建智能问答FAQ的底层数据基础是构建一个高效和准确的问答系统的关键。在这篇文章中&#xff0c;我们将探讨如何搭建智能问答FAQ的底层数据基础&#xff0c;并介绍需要注意的几个方面。 一、了解智能问答FAQ的概念和优势 智能问答FAQ是一种基于人工智能技术的问答系统&#…

Android进阶之路 - EditText输入字体自适应

遇到这么一个需求&#xff1a;“控件宽度有限&#xff0c;随着输入内容&#xff0c;动态修改字体大小”&#xff0c;如果是你&#xff0c;只如何来实现&#xff1f;又有几种方式&#xff1f; 嗯&#xff0c;就是这么一个简单的需求&#xff0c;让我记录了俩篇blog Android进阶…

二、Oracle 数据库安装集

一、CentOS 安装 OCI下载地址 1. 启动 # 1. 登录服务器&#xff0c;切换到oracle用户&#xff0c;或者以oracle用户登录 su - oracle# 2. 打开监听服务 lsnrctl start# 3. 查看Oracle监听器运行状况 lsnrctl status# 4. 以sys用户身份登录 sqlplus /nolog# 5. 切换用户conn 用…

Git笔记--Git常用命令

目录 1--git init 2--git status 3--git add 4--git rm --cached 5--git commit 6--git reflog 7--git log 8--git reset --hard 1--git init git init git init 用于初始化本地库 2--git status git status git status 用于查看本地库状态 3--git add git add file…

防关联指纹浏览器:高效地管理你的Facebook账户

Facebook&#xff0c;作为全球最受欢迎社交平台的第一名已经成为我们日常和工作中不可或缺的一部分了。不管是用于日常分享、媒体营销、还是店铺运营&#xff0c;Facebook都占据着重要的位置。多个Facebook账户的优势非常明显&#xff0c;然而&#xff0c;当你需要同时管理他们…

如何快速从逆境脱身

近期发生的新闻热点再度引发公众对稳定情绪和心理健康的关注。有时候我们遇到的最大的敌人&#xff0c;不是运气也不是能力&#xff0c;而是失控的情绪和口无遮拦的自己。如何在工作中保持稳定的情绪&#xff1f;谈谈你的看法。 方向一&#xff1a;分享工作中让你有强烈情绪波…

ChatGPT提示与技巧分享:如何作出更好的提示2023年8月

​对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT&#xff0c;成为AI工具专家的技巧。 毫无疑问&#xff0c;ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具&#xff08;如智能对联、经典语录生…

【从零学习python 】80.线程访问全局变量与线程安全问题

文章目录 线程访问全局变量与线程安全问题摘要技术标签同步互斥锁使用互斥锁解决卖票问题 上锁过程总结 进阶案例 线程访问全局变量与线程安全问题 摘要 本篇文章探讨了线程访问全局变量及其可能引发的安全问题。在多线程编程中&#xff0c;全局变量可以方便地在不同线程之间共…

ESP32应用教程(1)— VL53L3CX距离传感器

文章目录 前言 1 产品概述 1.1 技术规格 1.2 系统框图 1.3 设备引脚分布 2 工作流程 2.1 系统功能描述 2.2 状态机描述 2.3 测距模式说明 3 控制接口 3.1 设备地址 3.2 IC写1个字节数据 3.3 IC读1个字节数据 3.4 IC写多个字节数据 3.5 IC读多个字节数据 3.6 IC…

Nacos配置管理、Feign远程调用、Gateway服务网关

1.Nacos配置管理 1.1.将配置交给Nacos管理的步骤 1.在Nacos中添加配置 Data Id服务名称-环境名称.yaml eg&#xff1a;userservice-dev.yaml 2.引入nacos-config依赖 在user-service服务中&#xff0c;引入nacos-config的客户端依赖 <!--nacos配置管理依赖--> <dep…

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构&#xff0c;以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架&#xff0c;它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础&#xff0c;架构原理可以分为以下四个部分&#xff1a;JobManager、TaskM…

Linux:LAMP架构与论坛搭建

目录 一、动态资源与语言 二、LAMP 架构的组成 三、CGI和astcgi 3.1CGI​​​​​​ 3.2fastcgi 3.3CGI和fastcgi比较 3.4 PHP 配置 3.5 Opcode语言 四、编译安装Apache http 服务 五、安装论坛 一、动态资源与语言 WEB 资源类型&#xff1a; 静态资源&#xff1a;原…

Qt串口通信学习文档

这是官方文档&#xff0c;我也在学习。 QSerialPort Class | Qt Serial Port 5.15.14https://doc.qt.io/qt-5/qserialport.html

如何将下载的安装包导入PyCharm

1. 下载安装包 这里以pyke为例。下载好之后解压缩&#xff0c;然后放入/Lib/site-packages/pyke-1.1.1 2. 打开PyCharm的终端进行安装 python setup.py install 3. 安装好之后导入即可使用 import pyke

用户端Web自动化测试_L3

目录&#xff1a; 浏览器复用Cookie 复用pageobject设计模式异常自动截图测试用例流程设计电子商务产品实战 1.浏览器复用 复用浏览器简介 为什么要学习复用浏览器&#xff1f; 自动化测试过程中&#xff0c;存在人为介入场景提高调试UI自动化测试脚本效率 复用已有浏览…

牛客网Verilog刷题 | 入门特别版本

文章目录 1、 VL1 输出12、VL2 wire连线3、 VL3 多wire连接4、VL4 反相器5、VL5 与门6、VL6 NOR 门7、VL7 XOR 门8、VL8 逻辑运算10、VL10 逻辑运算211、VL11 多位信号12、VL12 信号顺序调整13、VL13 位运算与逻辑运算14、VL14 对信号按位操作15、VL15 信号级联合并16、VL16 信…

matlab使用教程(23)—优化函数的参数

本博客向您介绍如何存储或访问向 MATLAB 复合函数&#xff08;如 fzero 或 integral&#xff09;传递的数学函数的额外参数。 MATLAB 复合函数基于某个值范围计算数学表达式。这些函数之所以称为复合函数是因为它们是接受函数句柄&#xff08;函数的指针&#xff09;作为输入…