数据结构——顺序表讲解
作者:几冬雪来
时间:2023年2月25日
内容:数据结构顺序表内容讲解
目录
前言:
顺序表:
1.线性表:
2.什么是顺序表:
3.顺序表的概念和构成:
4.顺序表的书写:
1.创建文件:
2.顺序表的静态储存:
3.动态顺序表的书写:
4.数据结构的管理:
5.顺序表添加内容:
6.尾插:
7.扩容和尾部增加:
8.尾部删除:
9.代码:
结尾:
前言:
不知不觉中,我们将数据结构算法效率的空间复杂度和时间复杂度都进行了讲解,并且通过了举例来巩固我们的知识,那么在对我们的算法效率那部分内容进行了初步的讲解之后。接下来我们就要进入到我们数据结构中的一个知识——顺序表的的讲解了。
顺序表:
在我们的日常生活中,我们的顺序表是什么不可或缺的东西,平时我们所使用的QQ和微信查找或者添加好友都与我们的顺序表有关,而为了我们以后的一些知识,现在在这里我们将先对顺序表进行一个认识。
1.线性表:
在讲解我们的顺序表之前,我们先来了解我们的线性表。那么线性表在我们的数据结构中是以什么样的形式存在的?这里我们就要知道,线性表是我们在实际中广泛使用的一种数据结构,我们常见的线性表有:顺序表,链表,栈,队列,字符串等等。
那么我们线性表的特征是什么?逻辑上来说,就是我们有n个数据,我们这n个顺序挨个挨个依次存储呈现出一条线性结构,这就是我们线性表的特征。
2.什么是顺序表:
在了解了我们线性表是什么之后,接下来我们就开始正式的讲解我们的顺序表了,那么还是我们熟悉的开头——什么是顺序表。
顺序表其实就是我们写一个结构,然后管理这个结构,而后这个结构对我们的数组进行管理。所以这里我们可以将我们的顺序表看为一个数组。
3.顺序表的概念和构成:
既然我们可以将我们的算术表当成一个数组,那么我们的顺序表的构成是怎么样的?
那么我们的顺序表的概念和构成讲解完了后,接下来我们就要开始动手书写我们的顺序表的代码了。
4.顺序表的书写:
这里我们顺序表的书写和结构和我当初写三子棋博客的结构比较相似。
1.创建文件:
首先就是我们需要创建我们的文件,也就是我们的.h文件和.c文件。相信大家如果是写过三子棋,或者是看过三子棋的博客,那么应该对我们这一步操作不会陌生。
在我们创建完了文件后,我们就要向我们的文件中书写内容。
2.顺序表的静态储存:
在我们的顺序表中我们对其进行了分类,分为了静态顺序表和动态顺序表。那么在学习我们动态顺序表怎么书写之前,我们用来试着定义一个静态顺序表。
这就是我们静态顺序表的大概书写,但是我们的这种静态顺序表在我们的实际中并不好用且不常用,为什么?因为在这里,我们的顺序表的个数是被写死的,没有办法进行扩容或者是缩小。因此在写顺序表的时候,我们经常将我们的顺序表写为动态顺序表。对比起我们的静态顺序表,我们的动态顺序表的优势就是可以按需申请。
3.动态顺序表的书写:
既然我们这里知道了对比起我们静态顺序表我们的动态顺序表有什么优势,那么接下来的操作就很简单了,那就是将我们的静态顺序表的形式改为动态顺序表。
这里我们将我们的数组换成一个指针,指针指向了我们某一块空间,而我们的这块空间又是在我们的堆区进行开辟的,为我们后来对其进行动态调整做铺垫。
这里有人就看见,对比我们的静态顺序表,我们的动态顺序表在这里再开辟了一个临时变量capacity,这是为什么呢?这是因为,在我们向后执行很多次代码之后,某个时刻我们的有效数据等于我们现阶段的空间的容量,满足这个条件这时我们就要对我们的空间进行扩容,因此我们的capacity就是指我们现阶段空间的容量,也是我们要进行扩容所要达成的条件。
4.数据结构的管理:
那么在对我们的动态顺序表进行了初步定义之后,接下来我们就要对我们这里的数据进行管理。那么我们是怎么进行管理的,这里还是以我们的QQ为例,我们数据结构管理的需求就是增删查改。
这里我们就在我们的.h文件中,创立增加和删除的函数。
接下来我们就要再在我们的SeqLish.c文件中将我们结构体中的数据进行初始化,那么怎么个初始化的方法? 这里我们有两种方式,我们先讲第一种方式。
第一种方法就是将我们,将我们所有的空间什么的都初始化为0。并且在我们的test.c中也开始书写我们增加空间的代码。
那么如果我们不想将空间都初始化为0,想一开始就给开辟一小块的空间来使用,那我们就可以改用另一种初始化的方式。那么我们这种方式是怎么书写的?
在这里我们就用到我们C语言进阶的动态内存开辟的知识了,利用我们的知识来对我们的顺序表进行一个初始化,给我们的顺序表开辟一块空间。但是如果你觉得这样写没有问题的话,那就放了一个低级错误,这里我们通过调试可以调试出来。
这里为什么我们下面进行了一系列的修改但是没有影响到上面的内容? 这里就是我们的最基本的知识,在我们的SeqInit函数中,我们进行的是传值调用。而众所周知,在进行传值调用的时候,我们的形参是实参的一份临时拷贝,形参的改变不影响实参。因此我们这里要对我们的代码进行修改。
并且在开辟空间使用之后,我们要将开辟的那块空间进行一个释放的操作,因此在代码的结尾我们要进行free,然后再将我们的所有的空间进行归还。
5.顺序表添加内容:
在我们对顺序表进行了一个基础开辟空间操作的代码的编写,接下来依旧以我们的QQ或者微信为例。假如我们建立了一个有关C语言的群,在某一天我们刚刚好遇到了一个有共同爱好的人,这个时候我们就可以把他拉到我们的群里面,而我们这个新加入群的人我们在列表的最后就能找到他。但是这里有人可能反馈每次都要拉到最后面才能找到这个人太过麻烦,我们想将这个人放在前面也是允许的。
这里的数据的插入方式就类似我们顺序表中的两种插入数据的方法,一种是从头部插入被我们简称为头插,而另一种正好相反,这种方法是从尾部插入的,也被我们简称为尾插。既然知道了这两种插入方法,那么接下来我们就应该先在代码中创建这两种插入方法的函数。那么有插入,也就有删除,插入的方法有两种,我们删除的方法也有两种,就是我们所谓的头删和尾删。
在这里我们先将函数写出来后,再对其里面的内容进行进一步的编写。首先我们就先对我们尾插数据的方式写出来。
6.尾插:
相对于顺序表头插,尾插的方式就相对比较简单一点,所以在这里我们就先将我们顺序表如何尾插写出来。
在个编程中,假设我们size的大小为5,我们capacity的大小为9。这个时候我们进行尾插程序,当我们的size作为下标的时候,size并不是我们最后一个数据的下标,所以这里我们的size是我们最后一个数据的下一个位置。
那么在这里我们应该如何尾插我们所需要的值?很简单,这里我会将我们的代码写出来并对其进行分析。
这里我们知道我们的变量a是指针所指向的一块空间,相对于我们今天顺序表中的数组,我们的size又是一个常量,因此这段代码的意思相对于是,我们将x的值赋给我们下标为size(5)的位置,在赋值结束之后对size进行后置++,使其指向我们下一个地址。
到这里我们的尾插的运行原理就基本结束了。但是在往往插入的过程中就有一些事情会发生,假如到这里程序并没有结束,我们想继续向后面插入我们的值会怎么样?
当我们插入到我们size的值和capacity的值相等的时候,这里就不能继续往后插入了,如果我们不听劝阻执意要进行插入操作,那么后面插入的值就会发生越界。 在这个时候我们就要对这块空间进行一个扩容的操作来使得我们后面的值可以继续插入。
7.扩容和尾部增加:
那什么时候要进行扩容的操作,就是当size的值和capacity的值相等的时候,我们就要对其空间扩容,因此在插入值之前我们需要对代码进行检查。
但是在对空间进行扩容的过程中,我们也可能出现扩容失败的情况。而在动态内存开辟那里可以得知,如果空间扩容失败的话就会返回一个空指针,因此我们也要对开辟失败的情况进行判断。接下来就是对代码的修改。
这里如果开辟失败程序就会报错,但是如果开辟成功了的话,我们要再在后面将我们capacity的值乘等于2,这样size的值才会和capacity的值不相等才能继续进行插入数据。
但是在这里我们的代码还是有些坑的存在。我们在这里将我们的顺序表进行打印一下。
这里我们将的代码执行一下,看看结果是什么?
可以看出来,这里输出的结果和我们预期输出的结果是一致的,那怎么说这里的代码有问题呢?是哪里出了问题?我们再在这个代码的后面再插入一个数据。
这里奇怪的事情就发生了,本应该存放3值的空间,现在却是放的一个随机值。这里通过调试我们可以查找出是在free的时候出来了问题。 而一般我们的free出现问题分为两种情况:
第一种情况就是我们free的指针是野指针,或者是我们free只是释放我们空间的一部分,并没有从起始位置释放。
接下来是第二种情况,这种情况不多。这里可能是数组指向的空间可能存在越界行为。
既然可能是越界访问,那么首先查找的就是我们的下标有没有越界,这是大家都懂的知识。可是很遗憾的是,我们这一个代码并没有下标越界的行为,而且我们本身开辟的空间也没有问题,那这里就剩下realloc对我们空间扩容的时候可能出现问题,我们这里空间开辟少了。
在上面看出来,我们一共要输入5个整形,一共需要20个字节的空间,但是这里我们的capacity的大小为4个字节的大小。但是这里realloc扩容的大小却不是20个字节,这里的realloc只是将空间从4个字节扩容到8个字节。 因此我们后面的值都属于越界访问。
这便是我们修改后的代码,这里空间的大小就为32个字节的大小,存放20个字节的数据绰绰有余。 代码修好之后再运行一次来看看结果是什么?
这个时候我们的3的位置并没有变成一个随机值,这就证明我们代码修改正确,程序可以正常运行起来。
8.尾部删除:
在上面我们学习了向我们这块空间插入一个数据的方式是如何运行的,也就是顺序表管理中的增删查改中的增。那么既然有增,那也就是有删,在顺序表中应该如何去删除数据?
这里介绍的方法是我们的尾删。我们要删除我们的数据很简单,我们将代码写出来。
在这里我们将我们下标为size-1的空间赋值为0,然后size再进行--的操作,这样就可以将我们最后的数据进行删除。
这里就可以把我们数据中后面两个值进行删除,但是这里有人就要说了:如果在进行数据删除的时候,下标是size-1的地址的值要是一开始存放的值就是0的话,这里的代码是不是就多此一举了?这一点我们不可否置,那来试试删掉了我们的代码会怎么样?
通过尝试,我们发现这段代码其实有和没有并无太大区别,即使没有这段代码都可以运行且运行之后不会报错或者有哪里出错的地方, 所以我们可以将它删去也没有关系。因为我们这里是按照size去遍历的,我们这里size就是我们的有效数据,我们从开始连续存储size个数据。
但是我们这里要注意一个点,这里删除的这块空间并不能单独使用free函数释放掉,我们在堆上申请数组,我们要释放就应该一起释放,不能一块一块的释放,这样做的话代码会报错。
写到这里我们顺序表的删除部分也就全部写完了吗?并不是的,在这个代码删除过程中,size不断的进行--的操作,不断的将空间的数据进行删除直到删空为止。
从图片来看,这里空间的所有数据均已被删除,且我们的编译器将我们的结果打印了出来?目前为止一切正常,但是如果在进行完数据的删除之后,我们又想再次插入数据,这里这么做会发生什么事情?
这里不难看出代码报错了,那么为什么会报错?这就需要我们调试一下了。
这里就能看出一个问题,我们size的值本不应该小于0的,当size等于0的时候我们这里的空间已经为空,不能再进行--的操作。 因此,在我们删除数据的函数中还要加入一个判断语句来判断我们的条件或者对size进行断言。
对代码进行修改之后,我们重新执行我们的代码看看这次输出的结果有什么不同的地方。
从图中可以看出,需要新插入的两个值成功的插入了这块空间中,并没有像第一次插入的时候报错。 如果这里将我们的判断代码换为断言代码的话,虽然无法正常的输出,但是会标识出来哪里错误。
出错的地方在我们的SeqLish.c文件中的第34行,正好也是我们断言的行数。 在这里的最后再对我们realloc函数那里进行细微的修改。
将我们这里的tmp交给我们的a指针维护,这个知识点在动态内存开辟的讲解中也有提到过,有兴趣的可以去了解一下为什么。
到这里我们一个顺序表的头插,创建,尾插,初始化都实现了。下面是我们的代码:
9.代码:
SeqLish.c文件
#include "SeqLish.h"void SLInit(SL *ps)
{ps->a = (SLDataType*)malloc(sizeof(SLDataType)*INIT_CAPACITY);if (ps->a == NULL){perror("malloc fail");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}void SLDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}void SLPrint(SL* ps)
{for (int i = 0; i < ps->size; ++i){printf("%d ", ps->a[i]);}printf("\n");
}void SLPopBack(SL* ps)
{//断言/*assert(ps->size > 0);*///判断if (ps->size == 0){return;}/*ps->a[ps->size - 1] = 0;*/ps->size--;
}void SLPushBack(SL* ps, SLDataType x)
{if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType)*ps->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity *= 2;}ps->a[ps->size] = x;ps->size++;
}
SeqLish.h文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int SLDataType;
#define N 10
#define INIT_CAPACITY 4//定义动态顺序表
typedef struct SeqLish
{SLDataType *a;//指针指向一块空间(堆区)int size;//有效数据的个数int capacity;//空间的容量
}SL;//增删查改
void SLInit(SL *ps);
void SLDestroy(SL *ps);
void SLPrint(SL* ps);
void SLPushBack(SL* ps, SLDataType x);
void SLPopBack(SL* ps);
void SLPushFront(SL* ps, SLDataType x);
void SLPopFront(SL* ps);
test.c文件
#include "SeqLish.h"void TestSeqList1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPrint(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s);SLPopBack(&s); SLPopBack(&s);SLPrint(&s);SLPushBack(&s, 10);SLPushBack(&s, 20);SLPrint(&s);SLDestroy(&s);
}int main()
{TestSeqList1();return 0;
}
这就是我们现阶段,还不成熟的顺序表的所有代码了。
结尾:
这篇博客我们实现了对我们顺序表的一部分内容的书写,比如初始化,尾插尾删等等,也讲解了一些可能出现的坑,但是正如我们所说,顺序表的内存管理是有增删查改在几种功能的,而且在本篇博客中也引入了我们另一种插入和删除方法——头插头删。这些残缺的内容,我们都将放在下一篇博客中实现,同时希望这篇顺序表的博客能为大家提供帮助。
相关文章:

数据结构——顺序表讲解
作者:几冬雪来 时间:2023年2月25日 内容:数据结构顺序表内容讲解 目录 前言: 顺序表: 1.线性表: 2.什么是顺序表: 3.顺序表的概念和构成: 4.顺序表的书写: 1…...

Redis 主从复制-服务器搭建【薪火相传/哨兵模式】
Redis 安装参考文章:Centos7 安装并启动 Redis-6.2.6 注意:本篇文章操作,不能在 静态IP地址 下操作,必须是 动态IP地址,否则最后主从服务器配置不成功! 管道符查看所有redis进程:ps -ef|grep re…...

数据库|(五)分组查询
(五)分组查询1. 介绍2. 语法3. 简单分组函数2. 添加筛选条件3. 添加复杂的筛选条件4. 分组查询特点5. 按表达式或函数分组6. 按多个字段分组7. 分组查询添加排序1. 介绍 引入:查询每个部门的平均工资 -- 以前写法:求的是总平均工…...

Orin安装ssh、vnc教程
文章目录一:ssh远程终端的配置PC的配置MobaXterm的下载二:VNC Viewer远程图形界面终端配置:PC配置:一:ssh远程 终端的配置 1.ifconfig查看终端ip地址 其中的eth是网口,我们需要看的是wlan0下的inet&#…...

Allegro如何快速删除孤立铜皮操作指导
Allegro如何快速删除孤立铜皮操作指导 在做PCB设计的时候,铺铜是常用的设计方式,在PCB设计完成之后,需要删除PCB上孤立的铜皮,即铜皮有网络但是却没有任何连接 如下图 通过Status报表也可以看到Isolated shapes 如何快速地删除孤立铜皮,具体操作如下 点击Shape...

从单管单色到单管RGB,这项MicroLED工艺不可忽视
微显示技术商Porotech,在CES 2023期间展示了最新的MicroLED显示模组。近期,AR/VR光学领域的知名博主Karl Guttag深度分析了该公司的微显示技术,并指出Porotech带来了他见过最有趣的MicroLED技术。Guttag表示:Porotech是本届CES上给…...

6-Java中新建一个文件、目录、路径
文章目录前言1-文件、目录、路径2-在当前路径下创建一个文件3-在当前路径下创建一个文件夹(目录)3.1 测试1-路径已经存在3.2 测试2-路径不存在3.2 创建不存在的路径并新建文件3.3 删除已存在的文件并新建4-总结前言 学习Java中如何新建文件、目录、路径…...

Bootstrap系列之Flex布局
文章目录Bootstrap中的Flexd-flex与d-inline-flex也存在响应式变化flex水平布局flex垂直布局flex水平与垂直也存在响应式变化内容排列(justify-content响应式变化也存在于这里sm,md,lg,xl)子元素对齐方式Align items&a…...

匈牙利算法与KM算法的区别
前记 在学习过程中,发现很多博客将匈牙利算法和KM算法混为一谈,当时只管用不管分析区别,所以现在来分析一下两个算法之间的区别。 匈牙利算法在二分图匹配的求解过程中共两个原则: 1.最大匹配数原则 2.先到先得原则 而KM算法求…...

You Only Need 90K Parameters to Adapt Light 论文阅读笔记
这是BMVC2022的论文,提出了一个轻量化的局部全局双支路的低光照图像质量增强网络,有监督。 思路是先用encoder f(⋅)f(\cdot)f(⋅)转到raw-RGB域,再用decoder gt(⋅)g_t(\cdot)gt(⋅)模拟ISP过程转到sRGB域。虽然文章好像没有明确指出&…...

【vue2小知识】实现axios的二次封装
🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:在vue2中实现axios的二次封装 目录 一、平常axios的请求发送方式 二、axios的一次封装…...

走近php的数组:数组的定义与数组函数
数组是一种数据结构,它由一组元素组成,这些元素可以是相同类型或不同类型。数组是在程序运行时动态创建的,可以根据需要增加或删除元素,因此它们是非常灵活和实用的数据结构。在大多数编程语言中,数组都有一个索引&…...

Docker 应用实践-仓库篇
目前 Docker 官方维护了一个公共仓库 Docker Hub,用于查找和与团队共享容器镜像,界上最大的容器镜像存储库,拥有一系列内容源,包括容器社区开发人员、开放源代码项目和独立软件供应商(ISV)在容器中构建和分…...

python+django篮球NBA周边商城vue
目 录 第一章 绪 论 1 1.1背景及意义 1 1.2国内外研究概况 1 1.3 研究的内容 1 第二章 关键技术的研究 3 2.1 vue技术介绍 3 myproject/ <-- 高级别的文件夹 |-- myproject/ <-- Django项目文件夹 | |-- myproje…...

抽象类与接口的区别
抽象类什么是抽象类?抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现&#…...

1904. 你完成的完整对局数
题目: 一款新的在线电子游戏在近期发布,在该电子游戏中,以 刻钟 为周期规划若干时长为 15 分钟 的游戏对局。这意味着,在 HH:00、HH:15、HH:30 和 HH:45 ,将会开始一个新的对局,其中 HH 用一个从 00 到 23…...

Vue3:自定义指令以及简单的后台管理权限封装
目录 前言: 自定义指令介绍: 局部的自定义指令: 全局自定义指令: 讲讲后台管理权限管理: 前言: 说起这个自定义指令的使用场景,我第一反应就是,后台管理的权限管理,要…...

剑指 Offer 12. 矩阵中的路径
摘要 剑指 Offer 12. 矩阵中的路径 一、回溯算法解析 本问题是典型的矩阵搜索问题,可使用 深度优先搜索(DFS) 剪枝解决。 深度优先搜索: 可以理解为暴力法遍历矩阵中所有字符串可能性。DFS 通过递归,先朝一个方向搜…...

springboot+jersey+tomcat实现跨域方式上传文件到服务器
前言 在服务器上,当我们启动了tomcat,就可以以 http://ip地址:8080/文件路径/文件名 的方式,进行访问到我们服务器上处于tomcat的webapps文件夹下的文件 于是为了可以往上面加文件,我们有两种方式,一种就是直接复制文…...

【微信小程序】-- 常用视图容器类组件介绍 -- view、scroll-view和swiper(六)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &#…...

猜数字游戏——C++
我们在有了一定的C基础了以后,简单的实现一个案例(其实只要会while循环结构就行了),我们本章内容会实现猜数字游戏,大家有什么语法疑问可以看看我写的:C快速入门_染柒_GRQ的博客-CSDN博客,该博客…...

整数对最小和
题目描述 给定两个整数数组 array1 array2。数组元素按升序排列,假设从array1 、array2中分别取出一个元素可构成一对元素,现在需要取出K个元素并对取出的所有元素求和,计算和的最小值 注意事项 两对元素如果对应于array1 array2中的两个下…...

2023-2-22 -javaagent
周三,天气晴,7度 Java Agent Java Agent也叫作java探针,可以实现动态修改java字节码,完成额外的功能。在java类编译成字节码,在jvm执行之前,它可以读取修改字节码,以来完成额外的功能。 使用…...

JavaScript BOM操作
目录 前言 window 对象 location 对象 navigator 对象 screen 对象 history 对象 前言 BOM(Browser Object Model)指的是浏览器对象模型,它是 JavaScript 和浏览器之间的接口。通过 BOM,JavaScript 可以与浏览器窗口交互&…...

【机器学习 | 强基计划】开山篇 | 机器学习介绍及其类别和概念阐述
🤵♂️ 个人主页: @计算机魔术师 👨💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 机器学习 | 强基计划系列 (一) 作者: 计算机魔术师 版本: 1.0 ( 2022.2.25) 注释:文章会不定时更新补充 文章目录 前言一、机器学习概览1.1 有监督学习和无监督学习1.1.…...

华为OD机试真题Java实现【合规数组】真题+解题思路+代码(20222023)
合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Java)真题目录汇总 ## 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满…...

BoostSearcher搜索引擎项目
BoostSearcher搜索引擎项目 1.BoostSearcher这个项目是什么? 答:一个为Boost文档建立索引的站内搜索引擎,简单的说就是一个类似于csdn站内文档搜索框。 项目展示: gitee:https://gitee.com/zxlfx/boost-search-engine-project …...

【模拟集成电路】频率综合器(Frequency Synthesizer,FS)设计
应用于无线局域网的频率综合器设计前言频率综合器简介各部分链接链接:前言 本文主要内容是对频率综合器或称为PLL 做出简单介绍,为课程设计部分章节内容,后需给出各部分的设计方案,以及测试结果。 频率综合器简介 无线收发系统中…...

实例8:机器人的空间描述和变换仿真
实例8:机器人的空间描述和变换仿真 实验目的 通过刚体与刚体的平动、转动基础知识的学习,熟悉位姿的描述通过Python编程实践,可视化学习坐标系的变换,熟悉空间变换 实验要求 通过python编程,输入一指定向量和对应的…...

网络 导航
目录内容链接网络网络参考文章:【网络】http请求 调试网络问题解决参考文章:【问题解决】网络 IP DNS解析网络问题解决参考文章:【问题解决】网络 TCP 规则 抓包网络问题解决参考文章:【问题解决】网络 Http请求 调试网络问题解决…...