顺序表(1)——顺序表详解

什么是数据结构?

简单来说数据结构就是计算机储存,组织数据的方式,而数组就是最基础的数据结构。

那为什么会有数据结构的存在呢?

这需要将数据结构分成数据和结构两部分进行分析。

数据:我们在计算机屏幕上所看见的文字信息和数值,这些都是数据。

结构:当我们想要使⽤⼤量使⽤同⼀类型的数据时,通过⼿动定义⼤量的独⽴的变量对于程序来说,可读性 ⾮常差,我们可以借助数组这样的数据结构将⼤量的数据组织在⼀起,结构也可以理解为组织数据的 ⽅式。

如果数据在内存中以杂乱无章形式储存在,如图1,当我们需要得到一个数据时,会显得无从下手,计算机也会没有任何规律地寻找,这会大大降低工作效率。而数据以图2的形式储存时,计算机就可以快速地找到我们需要的数据。

图1:

图2:

总结:

1)能够存储数据(如顺序表、链表等结构);

 2)存储的数据能够⽅便查找。

顺序表是什么?

顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,我们可以将它看作一个工具来理解。

顺序表也是线性表的一种,而线性表就是具有相同特性的数据结构的集合。

线性表的物理结构不一定连续,而逻辑结构一定连续;

顺序表的物理结构和逻辑结构都是连续的。

顺序表又分为静态顺序表和动态顺序表。

静态顺序表:使用定长的数组储存元素。

静态顺序表有一个很致命的缺点,空间给多了会很浪费,给少了又会不够用,导致信息丢失,这在实际工作中会给公司带来巨大的损失。

动态顺序表也就是对静态顺序表的改良,拥有着动态增容的能力(成倍数增加,一般以二倍形式增加),完美地弥补了静态顺序表的缺陷。

 

顺序表的代码实现:

顺序表代码实现的头文件:

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>typedef int seq;//将类型名重命名,以便在使用的时候随时改变数据类型typedef struct sequce//创建顺序表结构体,并将其重命名
{seq* arr;//因为要实现动态顺序表,所以要用seq*的类型来创建数组int size;//数组中的有效数据个数int cap;//数组拥有的空间
}sl;void Sequce_set(sl* s);//初始化顺序表
void Sequce_front(sl* s, seq x);//前插
void Print(sl s);//打印顺序表
void En(sl* s);//动态内存实现
void Sequce_back(sl* s, seq x);//尾插
void Sequce_popback(sl* s);//尾删
void Sequce_popfront(sl* s);//首删
void N_ull(sl* s);//判断空指针
void Zd_set(sl* s, int n, seq x);//指定位置插入
void Zd_del(sl* s, int n);//指定位置删除
void des(sl* s);//内存销毁

实现功能的函数代码:

#define _CRT_SECURE_NO_WARNINGS 1#include "seq.h"//初始化顺序表
void Sequce_set(sl* s)
{s->arr = (seq*)malloc(sizeof(seq) * 4);s->size = 0;s->cap = 1;
}//表首插入
void Sequce_front(sl* s, seq x)
{N_ull(s);En(s);for (int i = s->size; i > 0; i--){s->arr[i] = s->arr[i - 1];}s->arr[0] = x;s->size++;
}//表尾插入
void Sequce_back(sl* s, seq x)
{N_ull(s);En(s);s->arr[s->size] = x;s->size++;
}//表首删除
void Sequce_popfront(sl* s)
{N_ull(s);if (s->size == 0){return;}for (int i = 1; i < s->size; i++){s->arr[i - 1] = s->arr[i];}s->size--;
}//表尾删除
void Sequce_popback(sl* s)
{N_ull(s);if (s->size == 0){return;}s->size--;
}//指定位置添加
void Zd_set(sl* s, int n, seq x)
{N_ull(s);En(s);if (s->size < n){return;}for (int i = s->size; i > n; i--){s->arr[i] = s->arr[i - 1];}s->arr[n] = x;s->size++;
}//指定位置删除
void Zd_del(sl* s, int n)
{if (s->size == 0){return;}N_ull(s);for (int i = n; i < s->size - 1; i++){s->arr[i] = s->arr[i + 1];}s->size--;
}//打印顺序表
void Print(sl s)
{for (int i = 0; i < s.size; i++){printf("%d ", s.arr[i]);}printf("\n");
}//判断容量
void En(sl* s)
{N_ull(s);while (s->cap <= s->size){int newcap = 2 * s->cap;seq* ps = (seq*)realloc(s->arr, sizeof(seq) * newcap);if (!ps){exit(1);}s->arr = ps;s->cap = newcap;}
}//判断空指针
void N_ull(sl* s)
{if (!s){exit(1);}
}//顺序表销毁
void des(sl* s)
{free(s->arr);s->arr = NULL;
}

用来测试功能的实现的代码:(用来测试功能函数是否正常运行)

#define _CRT_SECURE_NO_WARNINGS 1#include"seq.h"int main()
{sl s;Sequce_set(&s);//初始化顺序表Sequce_front(&s, 1);//表前插入Print(s);Sequce_front(&s, 2);//表前插入Print(s);Sequce_front(&s, 3);//表前插入Print(s);Sequce_back(&s, 1);//表尾插入Print(s);Sequce_back(&s, 2);Print(s);Sequce_back(&s, 3);Print(s);Sequce_popfront(&s);//表首删除Print(s);Sequce_popfront(&s);Print(s);Sequce_popfront(&s);Print(s);Sequce_popback(&s);//表尾删除Print(s);Sequce_popback(&s);Print(s);Sequce_popback(&s);Print(s);Zd_set(&s, 2, 99);Print(s);des(&s);return 0;
}

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

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

相关文章

【LeetCode: 572. 另一棵树的子树 + 二叉树 + dfs】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

spring事务那些事

实际工作中还会面临千奇百怪的问题&#xff0c;看下面返个例子&#xff08;注意MySql数据库测试&#xff09;&#xff1a; //1.hello1Service 调用 hello2Service Transactional(propagation Propagation.REQUIRED,rollbackFor Exception.class) public void doUpdate() {//…

深入解析:链游、DApp、公链、NFT与交易所开发的全景图

随着数字货币和区块链技术的迅速发展&#xff0c;链游开发、DApp开发、公链开发、NFT开发以及交易所开发等领域吸引了越来越多的关注。本文将以3000字的篇幅&#xff0c;对这些领域进行详细解析&#xff0c;探讨它们的意义、应用场景以及未来发展趋势。 链游开发&#xff08;Bl…

LwIP TCP/IP

LWIP 架构 LwIP 符合 TCP/IP 模型架构&#xff0c;规定了数据的格式、传输、路由和接收&#xff0c;以实现端到端的通信。 此模型包括四个抽象层&#xff0c;用于根据涉及的网络范围&#xff0c;对所有相关协议排序&#xff08;参见图 2&#xff09;。这几层从低到高依次为&am…

ctfshow web入门 php特性 web123--web139

web123 必须传CTF_SHOW&#xff0c;CTF_SHOW.COM 不能有fl0g 在php中变量名字是由数字字母和下划线组成的&#xff0c;所以不论用post还是get传入变量名的时候都将空格、、点、[转换为下划线&#xff0c;但是用一个特性是可以绕过的&#xff0c;就是当[提前出现后&#xff0c;…

机器学习模型——GBDT和Xgboost

GBDT基本概念&#xff1a; GBDT&#xff08;Gradient Boosting Decision Tree&#xff0c;简称GBDT&#xff09;梯度提升决策树&#xff0c;是Gradient Boost 框架下使用较多的一种模型&#xff0c;且在GBDT中&#xff0c;其基学习器是分类回归树也就是CART&#xff0c;且使用…

【第二十六篇】Burpsuite实现请求方式修改+请求体文件选取

有时我们想将请求包的请求方法或请求体进行修改,这些操作可以由burpsuite完成,以节省时间。 文章目录 修改请求方法请求体文件选取修改请求方法 例如,某请求包的请求方法为GET: 如果我们想将其修改为POST且传递POST参数、上传文件,可以按以下步骤: 1、修改请求方法 2…

vue2中的局部组件和全局组件

注&#xff1a;vue2中使用组件远没有vue3中简单&#xff0c;具体可以看阿耿老师的lingshi小程序 如图所示&#xff1a;

【拓扑的基】示例及详解

集合X的某拓扑的一个基是X的子集的一个族(其成员称为基元素)&#xff0c;满足条件&#xff1a; 1. 2. 由基生成拓扑 由生成的拓扑(满足以上两个条件&#xff09; 等价描述&#xff1a; 由所有可表示为的某些成员的井的那些集合组成 例1: 证明&#xff1a;由生成的族确实是拓扑…

springboot-admin使用及原理剖析

服务端 依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>de.codecentric</groupId><art…

提高网站安全性,漏洞扫描能带来什么帮助

随着互联网的蓬勃发展&#xff0c;网站已经成为人们获取信息、交流思想、开展业务的重要平台。然而&#xff0c;与之伴随的是日益严重的网络安全问题&#xff0c;包括恶意攻击、数据泄露、隐私侵犯等。 为了保障网站的安全性&#xff0c;提前做好网站的安全检测非常有必要&…

2024年 CS2最佳游戏启动项

引言&#xff1a; Counter-Strike 2&#xff08;CS 2&#xff09;是一款备受瞩目的游戏&#xff0c;而启动选项则是影响游戏性能和体验的关键因素之一。然而&#xff0c;有关所有选项都应该强制使用的说法并不正确。事实上&#xff0c;大多数选项可能对某些计算机并不适用&…

Cali Linux上的PoshC2安装和使用

一、安装PoshC2 curl -sSL https://raw.githubusercontent.com/nettitude/PoshC2/master/Install-for-Docker.sh | sudo bash二、创建工程 posh-project -n test三、修改配置文件 posh-config将图中的baidu.com改为自己要攻击的域名或者IP地址 四、执行 posh-server 显示没…

YOLOV8注意力改进方法: Dual-ViT(Dual Vision Transformer) (附改进代码)

原论文地址&#xff1a;原论文下载网址 论文相关内容介绍 将自注意力过程分解为区域和局部特征提取过程&#xff0c;每个过程产生的计算复杂度要小得多。然而&#xff0c;区域信息通常仅以由于下采样而丢失的不希望的信息为代价。在本文中&#xff0c;作者提出了一种旨在缓解…

基于Leaflet.js的Marker闪烁特效的实现-模拟预警

目录 前言 一、闪烁组件 1、关于leaflet-icon-pulse 2、 使用leaflet-icon-pulse 3、方法及参数简介 二、闪烁实例开发 1、创建网页 2、Marker闪烁设置 3、实际效果 三、总结 前言 在一些地质灾害或者应急情况当中&#xff0c;或者热门预测当中。我们需要基于时空位置来…

C++练级之路——类和对象(上)

1、类的定义 class 类名{//成员函数 //成员变量}; class为定义的关键字&#xff0c;{ }内是类的主体&#xff0c;注意后面的 ; 不要忘了 类体中的内容成为类的成员&#xff0c;类中的变量为成员变量或类的属性&#xff0c;类中的函数为成员函数或类的方法&#xff0c; 类的两种…

通过Golang获取公网IP地址

在Go语言中&#xff0c;获取当前的外网&#xff08;公网&#xff09;IP地址可以通过多种方法实现。其中一种常见的方法是通过访问外部服务来获取。这些服务可以返回访问者的公网IP地址&#xff0c;例如 httpbin.org/ip 或 ipify.org。下面是一个简单的例子&#xff0c;展示了如…

免费云服务器汇总,最长永久免费使用

随着云计算技术的快速发展&#xff0c;越来越多的企业和个人开始将业务迁移到云端。云服务器作为云计算的重要组成部分&#xff0c;以其灵活、高效、可扩展等特点受到广泛关注。然而&#xff0c;许多人在初次接触云服务器时&#xff0c;可能会对高昂的价格望而却步。为了帮助大…

GEE:绘制和对比不同地物的光谱曲线

作者:CSDN @ _养乐多_ 光谱曲线是指在不同波长范围内物体或地表特征对电磁辐射的反射、吸收或发射的表现。这些曲线展示了物体或地表在可见光、红外线、微波等电磁波段上的光谱特征。光谱曲线的形状和特征能够提供关于物体或地表的信息,可以利用光谱曲线来识别和分类不同的地…

Java设计模式—策略模式(商场打折)

策略这个词应该怎么理解&#xff0c;打个比方说&#xff0c;我们出门的时候会选择不同的出行方式&#xff0c;比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等&#xff0c;这些出行方式&#xff0c;每一种都是一个策略。 再比如我们去逛商场&#xff0c;商场现在正在搞活动&…