C语言顺序表
文章目录
- 前言
- 线性表
- 顺序表
- 静态顺序表
- 动态顺序表
- 接口实现
前言
我们先补一下上篇博客落下的知识点:
首先说一下斐波那契的时间复杂度和空间复杂度:
long long Fac(size_t N)
{if(0 == N)return 1;return Fac(N-1)*N;
}
还是说一下size_t代表的类型是unsigned int,这里我们画个图来计算其时间复杂度:
如上图为斐波那契数列每一层递归的时间复杂度,我们需要把他们加在一起求出最后的时间复杂度。所以最终答案用大O法表达为为O(2^N)。
而其空间复杂度是O(N)。
这里要说一下时间是累积的,一去不复返,而空间是可以重复利用的,通过上图我们可以看到Fib(N-1)之后创造的Fib(N-2)所用的空间其实是Fib(N)创造的,如下图所示:
而时间算完之后就流失了,不可重复利用,所以其时间复杂度为O(2^N),空间复杂度为
O(N)。
线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使
用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。
(以上了解就好)
下图为顺序表和链表的模型。
顺序表
这里我们先说顺序表,其实顺序表大家了解就好,博主觉得数据结构最重要的地方是链表,顺序表当做对链表的铺垫就好,学好链表对后面学习栈和队列的帮助很大,但顺序表学好了貌似没多大作用(仅代表个人观点)。
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
而顺序表又分为静态顺序表和动态顺序表。
静态顺序表
#define N 10000
typedef int SLDataType;
typedef struct SeqList
{SLDataType a[N];int size; // 记录存储多少个有效数据
}SL;
这里再说一下,在学习数据结构的阶段,我们一般会对各种类型使用typedef来声明新的类型名。如上代码所示,我们对int重命名为SLDataType,将struct SeqList重命名为SL。还有就是我们在构建各个函数(接口)时,尽量用英文,这样显得比较正式,例如SeqList表示顺序表,不要写成struct shunxubiao(顺序表),这样在面试时会给面试官一个很不好的印象。
动态顺序表
本章我们主要说动态顺序表,代码案例也会以动态顺序表为主。
typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;int size; // 记录存储多少个有效数据int capacity; // 空间容量大小
}SL;
上述代码为动态顺序表的结构。
其与静态表的区别在于,静态表的空间由数组确定,而动态表的空间需要编写函数(接口来动态分配)。
接口实现
首先我们要构建一个动态顺序表:
typedef int SLDataType;
typedef struct SeqList
{SLDataType* a;int size; // 记录存储多少个有效数据int capacity; // 空间容量大小
}SL;
之后对其初始化,将其的容量,有效数据个数置为0,指针指向空。
这里还要注意,传参一定要传地址,否则函数函数内部对其操作无效。
void SLInit(SL* ps)
{assert(ps);//assert断言ps->a = NULL;ps->size = 0;ps->capacity = 0;
}
这里在回忆一个知识点,assert断言,其作用是如果它的条件返回错误,则终止程序。
之后我们若要将数据放入表内,则需要构建一个插入数据的接口(函数)。
void SLPushBack(SL* ps, SLDataType x)
{assert(ps);if (ps->size == ps->capacity)//检查容量为0或顺序表是否是满数据{int newCapacity = (ps->capacity == 0 ? 4 : ps->capacity * 2);//这里首先判断其容量是否为0,若为0则先对其容量赋值,不为0则扩容SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));//扩容if (tmp == NULL){perror("realloc fail");exit(-1);}ps->a = tmp;//将扩容空间赋值给动态顺序表ps->capacity = newCapacity;//表内容量更新}ps->a[ps->size] = x;//将值赋给顺序表ps->size++;//表内有效数据加1
}
上述代码为将数据放入顺序表的函数(在本章函数和接口是一个意思)。这种方法其实又叫尾插法。
假如顺序表中某个数据无用,我们将其删除,也需要构建函数。
void SLPopBack(SL* ps)
{assert(ps);// 温柔的检查/*if (ps->size == 0){return;}*/// 暴力的检查assert(ps->size > 0);//ps->a[ps->size - 1] = 0;ps->size--;
}
这里在对数据删减前要先判断表是否为空,判断其是否为空也有两种检查方法,一种是比较温柔的,即顺序表若为空则会结束函数,不会报错,而另一种则是稍微暴力的,用assert来判断若表为空表则会报错,并终止程序,这个判断方式根据个人喜好来设置,还有就是删减数据后不必使其变为0,也许要删减的数据本身就是0也说不准。
而我们也有可能想删除整个顺序表,那么就要销毁其空间:
void SLDestroy(SL* ps)
{assert(ps);if (ps->a){free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;}
}
若其空间不为空那么则free掉,并使其指向NULL,其容量与有效数据个数归0。
我们可以看到,上述代码的命名都是以英文命名如销毁顺序表:SLDestroy,初始化顺序表:SLInit。
下面说一下头插法,代码如下
void SLPushFront(SL* ps,SLDataType x)
{assert(ps);SLCheckCapacity(ps);//检查容量是否已满//挪动数据int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end]; end--;}ps->a[0] = x;ps->size++;
}
这里SLCheckCapacity函数为检查顺序表是否还有容量,在本章博客未作实现(因为不是什么太难函数,在一个顺序表这里稍作了解就好。)end首先赋值为顺序表最后的元素下标,然后将顺序表元素一直后移,最后将要插入数据赋值给首元素。
再说一下中间插入:
void SLInsert(SL* ps, int pos,SLDataType x) {assert(ps);assert(pos >= 0);assert(pos <= ps->size);SLCheckcapacity(ps);int end = ps->size - 1;while (end >= pos){ps->a[end + 1] = ps->a[end]; end--;}ps->a[pos] = x; ps->size++;
}
其原理与头插法相似。都是先让end为末尾元素下标,之后不断后移,将数据插入中间(这里的pos表示要将元素x插入的那个位置)。
最后为从中间删除:
void SLErase(SL* ps, int pos) {assert(ps);assert(pos >= 0);assert(pos < ps->size);//assert(ps->size > 0);//挪动数据覆盖int begin = pos + 1;while (begin < ps->size) {ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}
还是先判断顺序表是否为空,pos的值是不是有效值。
之后将begin赋值为要删除元素后一个元素的下标,之后不断的前移达到覆盖要删除元素的目的。
最后期待你的三连,若有错误欢迎私信指正。
相关文章:
C语言顺序表
文章目录 前言线性表顺序表静态顺序表动态顺序表 接口实现 前言 我们先补一下上篇博客落下的知识点: 首先说一下斐波那契的时间复杂度和空间复杂度: long long Fac(size_t N) {if(0 N)return 1;return Fac(N-1)*N; }还是说一下size_t代表的类型是unsi…...
滑动窗口详解
滑动窗口本质其实也是一种双指针算法,只是因为它维护的区间随着遍历的进行在不停变化,所以形象地称为“滑动窗口” 一、⻓度最⼩的⼦数组 题目要求找到满足条件的长度最小的子数组,我们先来想想暴力的做法,再来想想能不能优化&am…...
JAVA -华为真题-分奖金
需求: 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么…...
第二章:25+ Python 数据操作教程(第十八节如何使用 Matplotlib 库在 python 中执行绘图和数据可视化)持续更新中
本教程概述了如何使用 Matplotlib 库在 python 中执行绘图和数据可视化。这篇文章的目的是让您熟悉该库的基础知识和高级绘图功能。它包含几个示例,将为您提供使用 Python 生成绘图的实践经验。 目录 什么是 Matplotlib? Matplotlib 基础知识<...
XShell7 + Xftp7 + IDEA 打包MapReduce程序到集群运行
参考博客 【MapReduce打包成jar上传到集群运行】http://t.csdn.cn/2gK1d 【Xshell7/Xftp7 解决强制更新问题】http://t.csdn.cn/rxiBG IDEA打包MapReduce程序 这里的打包是打包整个项目,后期等学会怎么打包单个指定的mapreduce程序再来更新博客。 1、编译打包 …...
微软D365 入门文章汇总以及各项认证介绍(持续跟新.....)
介绍 希望入门D365的同学们,需要具备的知识点,涉及C#,WebApi,前端知识,Power Platform等知识,以及Azure的知识点等,需要有了解。 实施Microsoft Dynamics 365 CE (12章)…...
vscode搭建Django自带后台管理系统
文章目录 一、django自带的后台管理系统1. 建表2. 后台管理系统2.1 创建账号2.2 运行后台2.3 登录 二、模版渲染1. 直接将数据渲染到页面2. 数据传递给js 三、数据库1. 查看当前数据库2. 创建UserInfo数据表3. Django rest framework配置 四、vue前端搭建1. 在Django项目的根目…...
Verilog零基础入门(边看边练与测试仿真)-时序逻辑-笔记(4-6讲)
文章目录 第四讲第五讲第六讲 第四讲 1、计数器 代码: //计数器 timescale 1ns/10ps module counter(clk,res,y); input clk; input res; output[7:0] y;reg[7:0] y; wire[7:0] sum;//1运算的结果(1࿰…...
2023-09-12力扣每日一题
链接: 1462. 课程表 IV 题意 一个pair<int,int>表示a是b的前置 进行n次查询,查询q是否是p的前置(可以不是直接前置) 解: 就是要把01、12、13这种能转换出02、03,弗洛伊德即可 无环无负权 实际…...
leetcode面试题:交换和(三种方法实现)
交换和: 给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。 返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元…...
前端可视化界面开发技术:实战与优化
引言 在当今的互联网时代,数据可视化已经成为信息展示和交互的重要方式。特别是在前端开发领域,可视化界面的应用越来越广泛,涉及到数据监控、分析和决策等多种场景。本文将深入探讨前端可视化界面开发的关键技术,通过实例解析提…...
Python实现机器学习(下)— 数据预处理、模型训练和模型评估
前言:Hello大家好,我是小哥谈。本门课程将介绍人工智能相关概念,重点讲解机器学习原理机器基本算法(监督学习及非监督学习)。使用python,结合sklearn、Pycharm进行编程,介绍iris(鸢尾…...
树结构处理,list和tree互转
1、实体类 package com.iot.common.test.entity;import lombok.Data;import java.util.List;/*** description:* author:zilong* date:2023/9/8*/ Data public class Node {//idprivate String id;//父节点idprivate String pId;//名称private String name;//编码private Stri…...
可视化大屏设计模板 | 主题皮肤(报表UI设计)
下载使用可视化大屏设计模板,减少重复性操作,提高报表制作效率的同时也确保了报表风格一致,凸显关键数据信息。 软件:奥威BI系统,又称奥威BI数据可视化工具 所属功能板块:主题皮肤上传下载(数…...
Spring Boot + Vue的网上商城之客服系统实现
Spring Boot Vue的网上商城之客服系统实现 在网上商城中,客服系统是非常重要的一部分,它能够为用户提供及时的咨询和解答问题的服务。本文将介绍如何使用Spring Boot和Vue.js构建一个简单的网上商城客服系统。 思路 在本教程中,我们学习了…...
RabbitMQ: return机制
1. Return机制 Confirm只能保证消息到达exchange,无法保证消息可以被exchange分发到指定queue。 而且exchange是不能持久化消息的,queue是可以持久化消息。 采用Return机制来监听消息是否从exchange送到了指定的queue中 2.Java的实现方式 1.导入依赖 &l…...
记录一些奇怪的报错
错误:AttributeError: module distutils has no attribute version 解决方案: 第一步:pip uninstall setuptools 第二步:conda install setuptools58.0.4 错误:ModuleNotFoundError: No module named _distutils_hac…...
Ubuntu 安装redis数据库,并设置开机自启动
1、下载安装包 wget http://download.redis.io/releases/redis-7.0.9.tar.gz 2、解压 tar -zxvf redis-7.0.9.tar.gz 3、复制到解压缩的包移动到/usr/local/ sudo mv ./redis-7.0.9 /usr/local/ 4、编译 cd /usr/local/redis-7.0.9 sudo make 5、测试: 时间会比较长࿰…...
基于开源模型搭建实时人脸识别系统(五):人脸跟踪
继续填坑,之前已经讲了人脸检测,人脸识别实战之基于开源模型搭建实时人脸识别系统(二):人脸检测概览与模型选型_开源人脸识别模型_CodingInCV的博客-CSDN博客,人脸检测是定位出画面中人脸的位置,…...
VUE | 配置环境变量
本篇目录 1. 创建开发环境配置文件2. 创建正式环境配置文件3. 在代码中访问环境变量4. 加载环境变量 在 Vue 项目中是使用 .env 文件来定义和使用不同的环境变量,这些文件在 Vue 项目根目录下创建。推荐有几种环境就创建几个 .env 文件,下面就开发环境和…...
Dynamic-TP入门初探
背景 在使用线程池的过程中,会出现一些痛点: 代码中创建了一个线程池,但是不知道那几个核心参数设置多少比较合适。凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,非常麻烦。线程池相对开发人…...
Git的基本操作:远程操作
7 Git的远程操作 远程操作主要是指,在不同的仓库之间进行提交和代码更改。是一个明显的对等的分布式系统。其中本地个仓库与远程仓库,不同的远程仓库之间都可以建立这种关系。这种关系之间的操作主要有pull和push。 远程仓库 创建SSH key远程仓库和本…...
【IOC,AOP】spring的基础概念
IOC 控制反转 对象的创建控制权转交给外部实体,就是控制反转。外部实体便是IOC容器。其实就是以前创建java对象都是我们new一下,现在我们可以把这个new交给IOC容器来做,new出来的对象也会交由IOC容器来管理。这个new出来的对象则称为Bean。 …...
安全实战 | 怎么用零信任防范弱密码?
防范弱密码,不仅需要提升安全性,更需要提升用户体验。 比如在登录各类业务系统时,我们希望员工登录不同系统不再频繁切换账号密码,不再需要3-5个月更换一次密码,也不再需要频繁的输入、记录、找回密码。 员工所有的办…...
1-4 AUTOSAR方法论
总目录——AUTOSAR入门详解AUTOSAR入门详解目录汇总:待续中。。。https://xianfan.blog.csdn.net/article/details/132818463 目录 一、前言 二、方法论 三、单个ECU开发流程 一、前言 汽车生产供应链上有以下角色:OEM、TIER1、TIER2,其主…...
MFC C++ 数据结构及相互转化 CString char * char[] byte PCSTR DWORE unsigned
CString: char * char [] BYTE BYTE [] unsigned char DWORD CHAR:单字节字符8bit WCHAR为Unicode字符:typedef unsigned short wchar_t TCHAR : 如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,…...
多版本CUDA安装切换
系统中默认的安装CUDA为12.0,现在需要在个人用户下安装CUDA11.7。 CUDA 下载 CUDA官网下载 安装 Log file not open.Segmentation fault (core dumped)错误 将/tmp/cuda-installer.log删除即可。重新安装,去掉驱动的安装,设置Toolkit的安装…...
sqlserver union和union all 的区别
1.首先在数据库编辑1-40数字; 2.查询Num<30的数据,查询Num>20 and Num<40的数据,使用union all合并; 发现30-20的数字重复了,可见union all 不去重; 3.查询Num<30的数据,查询Num…...
Matlab 如何计算正弦信号的幅值和初始相角
Matlab 如何计算正弦信号的幅值和初始相角 1、概述 如果已知一个正弦信号的幅值,在FFT后频域上该信号谱线的幅值与设置值不同,而是大了许多;如果不知道某一正弦信号的幅値,又如何通FFT后在頻域上求出该正弦信号的幅值呢? 2、…...
华为hcie认证培训报班培训好?还是自学好
华为HCIE认证培训报班培训和自学各有优势。 培训的优势: 系统性学习:培训课程通常会系统地涵盖HCIE认证所需的各个知识点,帮助你建立全面的理论体系。指导与互动:培训中,能够与资深讲师互动,及时解答疑惑…...
如何用模板做网站/google下载安卓版
摘要:下文讲述MySQL数据库中系统函数ORD(str)的功能简介说明,如下所示;ORD函数功能说明:如果字符串最左边是一个多字节字符,则返回第一个字符所对应的ASCII码,此时ORD函数同ASCII函数具有相同的功能。ORD函数举例说明:mysql> select ord(m…...
广告设计有哪些/苏州网站优化排名推广
目录 一.什么是红黑树? 二. 红黑树的基本概念 三.红黑树的插入 红黑树节点的构造 红黑树的插入 1.parent是黑色 2.parent是红色 四.右单旋 五. 左单旋 一.什么是红黑树? 在学红黑树之前,我们需要回顾二叉树的知识,二叉树…...
wordpress函数表/百度手机助手苹果版
点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源简介: 表引擎在ClickHouse中的作用十分关键,直接决定了数据如何存储和读取、是否支持并发读写、是否支持index、支持的query种类、是否支持主备复制等。引言表引擎在ClickHouse中的…...
什么网站容易做/seo精华网站
转自:http://blog.chinaunix.net/u1/51538/showart.php?id418572 //算法1,查表法,典型的空间换时间,在现代的CPU上,这种算法具有最快的速度。 unsigned char reverse1(unsigned char c) { static unsigned ch…...
做网站排名软件/太原整站优化排名外包
java类中的argument list 若为 "Object...args" 如 public StringResult isValid(Object... args) 意为有不定数目的Object 类型 的argument转载于:https://www.cnblogs.com/weeky/archive/2012/10/14/2723448.html...
海口seo关键词优化/网站推广seo优化
近期开始接触到在校学生、高校实习生和毕业生,在此说一下笔者对这些徘徊在职场门口的学生一些建议,希望能给这些初学者进入软件开发行业带来一些帮助,使得毕业生能更顺利的进入软件开发公司开始职场生涯,人生来一个完美的转弯。 -----------------------…...