当前位置: 首页 > news >正文

数据结构——单链表(C语言版)

文章目录

  • 一、链表的概念及结构
  • 二、单链表的实现
    • SList.h
    • 链表的打印
    • 申请新的结点
    • 链表的尾插
    • 链表的头插
    • 链表的尾删
    • 链表的头删
    • 链表的查找
    • 在指定位置之前插入数据
    • 在指定位置之后插入数据
    • 删除pos结点
    • 删除pos之后的结点
    • 销毁链表
  • 三、完整源代码
    • SList.h
    • SList.c
    • test.c

一、链表的概念及结构

概念:链表是 ⼀种物理存储结构上⾮连续、⾮顺序 的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的
链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。
⻋厢是独⽴存在的,且每节⻋厢都有⻋⻔。
想象⼀下这样的场景,假设每节⻋厢的⻋⻔都是锁上的状态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾?

最简单的做法:每节⻋厢⾥都放⼀把下⼀节⻋厢的钥匙。

在链表⾥,每节“⻋厢”是什么样的呢?
与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点”
节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。

在这里插入图片描述

图中指针变量plist保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希
望plist“指向”第⼆个节点时,只需要修改plist保存的内容为0x0012FFA0。

为什么还需要指针变量来保存下⼀个节点的位置?
链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针
变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。

结合前⾯学到的结构体知识,我们可以给出每个节点对应的结构体代码:
假设当前保存的节点为整型:

struct SListNode
{
int data; //节点数据
struct SListNode* next; //指针变量⽤保存下⼀个节点的地址
};

当我们想要保存⼀个整型数据时,实际是向操作系统申请了⼀块内存,这个内存不仅要保存整型数
据,也需要保存下⼀个节点的地址(当下⼀个节点为空时保存的地址为空)。
当我们想要从第⼀个节点⾛到最后⼀个节点时,只需要在前⼀个节点拿上下⼀个节点的地址(下⼀个
节点的钥匙)就可以了。

思考:当我们想保存的数据类型为字符型、浮点型或者其他⾃定义的类型时,该如何修改?
可以用typedef将数据类型重命名,这样方便后续修改数据类型

typedef int SLTDateType;//将int类型重命名为SLTDateType

补充说明:
1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续
2、节点⼀般是从堆上申请的
3、从堆上申请来的空间,是按照⼀定策略分配出来的,每次申请的空间可能连续,可能不连续

二、单链表的实现

SList.h      单链表头文件,声明单链表,以及需要的函数
SList.c      单链表函数实现文件
test.c       测试代码

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//单链表
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType date;struct SListNode* next;
}SLTNode;//链表的打印
void SLTPrint(SLTNode* phead);//链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);//链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);//链表的尾删
void SLTPopBack(SLTNode** pphead);//链表的头删
void SLTPopFront(SLTNode** pphead);//链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x);//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);//销毁链表
void SListDesTroy(SLTNode** pphead);

链表的打印

//打印
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->date);pcur = pcur->next;}printf("NULL\n");
}

申请新的结点

//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc fail");exit(1);}newnode->date = x;newnode->next = NULL;return newnode;
}

链表的尾插

//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//空链表和非空链表if (*pphead == NULL){*pphead = newnode;}else{//找到尾结点SLTNode* ptail = *pphead;while (ptail->next){ptail = ptail->next;}ptail->next = newnode;}
}

链表的头插

//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}

链表的尾删

//尾删
void SLTPopBack(SLTNode** pphead)
{//不能为空链表assert(pphead && *pphead);//只有一个结点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}//有多个结点else{SLTNode* prev = *pphead;SLTNode* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail->next;}free(ptail);ptail = NULL;prev->next = NULL;}
}

链表的头删

//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}

链表的查找

//查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x)
{assert(phead);SLTNode* pcur = phead;while (pcur){if (pcur->date == x){return pcur;}pcur = pcur->next;}return NULL;
}

在指定位置之前插入数据

//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{assert(pphead && *pphead);assert(pos);//在第一个结点前插入数据就是头插if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}newnode->next = pos;prev->next = newnode;}
}

在指定位置之后插入数据

//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}

删除pos结点

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);//如果是头结点if (pos == *pphead){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}

删除pos之后的结点

//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

销毁链表

//销毁链表
void SListDesTroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

三、完整源代码

SList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//单链表
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType date;struct SListNode* next;
}SLTNode;//链表的打印
void SLTPrint(SLTNode* phead);//链表的尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x);//链表的头插
void SLTPushFront(SLTNode** pphead, SLTDateType x);//链表的尾删
void SLTPopBack(SLTNode** pphead);//链表的头删
void SLTPopFront(SLTNode** pphead);//链表的查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x);//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x);//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x);//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos);//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos);//销毁链表
void SListDesTroy(SLTNode** pphead);

SList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"//打印
void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->date);pcur = pcur->next;}printf("NULL\n");
}//申请新的结点
SLTNode* SLTBuyNode(SLTDateType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));if (newnode == NULL){perror("malloc fail");exit(1);}newnode->date = x;newnode->next = NULL;return newnode;
}//尾插
void SLTPushBack(SLTNode** pphead, SLTDateType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);//空链表和非空链表if (*pphead == NULL){*pphead = newnode;}else{//找到尾结点SLTNode* ptail = *pphead;while (ptail->next){ptail = ptail->next;}ptail->next = newnode;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDateType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);newnode->next = *pphead;*pphead = newnode;
}//尾删
void SLTPopBack(SLTNode** pphead)
{//不能为空链表assert(pphead && *pphead);//只有一个结点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}//有多个结点else{SLTNode* prev = *pphead;SLTNode* ptail = *pphead;while (ptail->next){prev = ptail;ptail = ptail->next;}free(ptail);ptail = NULL;prev->next = NULL;}
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* next = (*pphead)->next;free(*pphead);*pphead = next;
}//查找
SLTNode* SLTFind(SLTNode* phead, SLTDateType x)
{assert(phead);SLTNode* pcur = phead;while (pcur){if (pcur->date == x){return pcur;}pcur = pcur->next;}return NULL;
}//在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDateType x)
{assert(pphead && *pphead);assert(pos);//在第一个结点前插入数据就是头插if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}newnode->next = pos;prev->next = newnode;}
}//在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDateType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);//如果是头结点if (pos == *pphead){SLTPopFront(pphead);}else{SLTNode* prev = *pphead;while (prev->next != pos){prev = prev->next;}prev->next = pos->next;free(pos);pos = NULL;}
}//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}//销毁链表
void SListDesTroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"
//测试代码
void test1()
{SLTNode* s1 = (SLTNode*)malloc(sizeof(SLTNode));s1->date = 1;SLTNode* s2 = (SLTNode*)malloc(sizeof(SLTNode));s2->date = 2;SLTNode* s3 = (SLTNode*)malloc(sizeof(SLTNode));s3->date = 3;SLTNode* s4 = (SLTNode*)malloc(sizeof(SLTNode));s4->date = 4;s1->next = s2;s2->next = s3;s3->next = s4;s4->next = NULL;//测试打印SLTNode* plist = s1;SLTPrint(plist);
}void test2()
{SLTNode* s = NULL;SLTPrint(s);//测试尾插SLTPushBack(&s, 2);SLTPushBack(&s, 3);SLTPushBack(&s, 4);SLTPrint(s);//测试头插/*SLTPushFront(&s, 8);SLTPushFront(&s, 7);SLTPushFront(&s, 6);SLTPrint(s);*///测试尾删/*SLTPopBack(&s);SLTPrint(s);SLTPopBack(&s);SLTPrint(s);SLTPopBack(&s);SLTPrint(s);SLTPopBack(&s);SLTPrint(s);*///测试头删/*SLTPopFront(&s);SLTPrint(s);SLTPopFront(&s);SLTPrint(s);SLTPopFront(&s);SLTPrint(s);SLTPopFront(&s);SLTPrint(s);*///测试查找/*SLTNode* find = SLTFind(s, 40);if (find != NULL){printf("找到了!\n");}else{printf("没有找到!\n");}*///测试在指定位置之前插入数据/*SLTNode* find = SLTFind(s, 3);SLTInsert(&s, find, 8);SLTPrint(s);*///测试在指定位置之后插入数据/*SLTNode* find = SLTFind(s, 2);SLTInsertAfter(find, 8);SLTPrint(s);*///删除pos结点/*SLTNode* find = SLTFind(s, 2);SLTErase(&s, find);SLTPrint(s);*///删除pos之后的结点/*SLTNode* find = SLTFind(s, 3);SLTEraseAfter(find);SLTPrint(s);*///链表的销毁SListDesTroy(&s);SLTPrint(s);
}int main()
{//test1();test2();return 0;
}

相关文章:

数据结构——单链表(C语言版)

文章目录 一、链表的概念及结构二、单链表的实现SList.h链表的打印申请新的结点链表的尾插链表的头插链表的尾删链表的头删链表的查找在指定位置之前插入数据在指定位置之后插入数据删除pos结点删除pos之后的结点销毁链表 三、完整源代码SList.hSList.ctest.c 一、链表的概念及…...

:app debug:armeabi-v7a failed to configure C/C++

报错信息 由于刚换电脑不久&#xff0c;新建native c工程时&#xff0c;出现报错如下&#xff1a; :app debug:armeabi-v7a failed to configure C/C null java.lang.NullPointerExceptionat com.android.build.gradle.tasks.CmakeQueryMetadataGenerator.getProcessBuilder(…...

计算机网络——应用层(4)DHCP和套接字编程

一、动态主机配置协议DHCP 1、关于协议配置&#xff1a; 在协议软件中&#xff0c;给协议参数赋值的动作就叫协议配置一个协议软件在使用前必须已被正确配置&#xff0c;具体的配置信息取决于协议栈连接到互联网的计算机的协议软件需要正确配置的参数包括①IP地址&#xff1b…...

TF-IDF演算法(Term Frequency - Inverse Document Frequency)最好懂筆記

前情提要 BoW (Bag of Words) 演算法 假设现在有M篇文章&#xff0c;一共使用了N个词汇&#xff08;term&#xff09;&#xff0c;我们就可以将文章转换成以下类型的矩阵&#xff0c;其中column1和row1的“10”表示“文章1”中出现了10次“词汇1”&#xff0c;“文章1”也可以…...

2024年4月最新版GPT

2024年4月最新版ChatGPT/GPT4, 附上最新的使用教程。 随着人工智能技术的不断发展&#xff0c;ChatGPT和GPT4已经成为了人们日常生活中不可或缺的助手。2024年4月,OpenAI公司推出了最新版本的GPT4,带来了更加强大的功能和更加友好的用户体验。本文将为大家带来最新版GPT4的实用…...

机器学习——模型评价

概述 在机器学习中&#xff0c;模型评价是评估和比较不同模型性能的关键步骤之一。它是通过对模型的预测结果与真实标签进行比较&#xff0c;从而量化模型的预测能力、泛化能力和稳定性。模型评价旨在选择最佳的模型&#xff0c;理解模型的行为&#xff0c;并为模型的改进提供…...

ARP代理

10.1.0.1/8 和10.2.0.1/8是在同一个网段 10.1.0.2/16 和10.2.0.2/16 不在同一个网段 10.1.0.1/8 和10.1.0.2/16 是可以ping通的 包发出来了&#xff0c;报文有发出来&#xff0c;目的地址是广播包 广播请求&#xff0c;发到路由器的接口G 0/0/0 target不是本接口&#xff0…...

手写前端控制并发任务

思路&#xff1a; 主要通过异步等待队列执行的原理。 当前执行的任务数达到最大值的时候&#xff0c;再继续执行的任务会放入等待队列里&#xff0c;直到当前任务执行结束后&#xff0c;减少一个当前任务数&#xff0c;并且判断队列中是否有任务&#xff0c;如果有则按顺序执…...

好用的Python开发工具合集

​ Python是一种功能强大且易于学习的编程语言&#xff0c;被广泛应用于数据科学、机器学习、Web开发等领域。随着Python在各个领域的应用越来越广泛&#xff0c;越来越多的Python开发工具也涌现出来。但是&#xff0c;对于新手来说&#xff0c;选择一款合适的Python开发工具可…...

近屿智能全新推出AI培训产品:AIGC大模型工程师与产品经理学习路径图

如今&#xff0c;人工智能和自然语言处理技术的发展&#xff0c;使得AI生成的内容&#xff08;AIGC&#xff0c;AI Generated Content&#xff09;领域开发出了巨大的潜力。就像业内巨头OpenAI公司&#xff0c;开发出了一系列自然语言处理模型ChatGPT&#xff0c;不仅带动了全世…...

Vue 3中的反向代理 和如何在服务器配置反向代理

如何在Vue 3项目中配置反向代理&#xff0c;让前端开发变得爽到爆&#xff01;还有个小插曲&#xff0c;Vite为我们提供了更简单的方式&#xff0c;就像找对象一样直接。 首先&#xff0c;我们来谈谈反向代理是什么。简单来说&#xff0c;反向代理就像是前端和后端之间的婚姻介…...

【机器学习】贝叶斯算法在机器学习中的应用与实例分析

贝叶斯算法在机器学习中的应用与实例分析 一、贝叶斯算法原理及重要性二、朴素贝叶斯分类器的实现三、贝叶斯网络在自然语言处理中的应用四、总结与展望 在人工智能的浪潮中&#xff0c;机器学习以其独特的魅力引领着科技领域的创新。其中&#xff0c;贝叶斯算法以其概率推理的…...

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果...

SQL SERVER的安装

目录 1.百度SQL SERVER找到图下的所显示的&#xff0c;点击进去 2.找到图下红色框起来的&#xff0c;点击立即下载 3.下载好之后点开&#xff0c;选择下载介质 4.SQLSERVER下载成功之后选择打开文件夹 6.双击后缀名是.iso的镜像文件 7.双击setup.exe进行安装 8.安装成功…...

(十一)C++自制植物大战僵尸游戏客户端更新实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/cFP3z 更新检查 游戏启动后会下载服务器中的版本号然后与本地版本号进行对比&#xff0c;如果本地版本号小于服务器版本号就会弹出更新提示。让用户选择是否更新客户端。 在弹出的更新对话框中有显示最新版本更新的内容…...

关于Qt主窗口的菜单部件

前言 在介绍主窗口的两大部件之前&#xff0c;我们要先知道关于主窗口的一些知识。 主窗口 一个主窗口可以没有菜单条、工具条、状态条&#xff0c;但必须设置中心部件。在 Q 生成的 C头文件 ui_mainwindow.h 代码中,我们可以看到以下代码: centralWidget new Qwidget(MainWi…...

rabbitmq每小时自动重启

引言 找了半天&#xff0c;最后通过系统日志发现是因为执行 systemctl restart rabbitmq-server 命令无法返回回调 systemctl 导致超时&#xff0c;自动关机。怀疑是 rabbitmq 与 systemctl 冲突&#xff0c;后 mq 升级版本已修复&#xff0c;可参考&#xff1a;https://github…...

【多线程】单例模式 | 饿汉模式 | 懒汉模式 | 指令重排序问题

文章目录 单例模式一、单例模式1.饿汉模式2.懒汉模式&#xff08;单线程&#xff09;3.懒汉模式&#xff08;多线程&#xff09;改进 4.指令重排序1.概念2.question:3.解决方法4总结&#xff1a; 单例模式 一、单例模式 单例&#xff0c;就是单个实例 在有些场景中&#xff0c…...

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…...

git报错

这里写自定义目录标题 git报错Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 有一个原因就是在github上设置对应密钥时&#xff0c;有一个key获取应该设置为…...

【R: mlr3:超参数调优】

本次分享官网教程地址 https://mlr3book.mlr-org.com/chapters/chapter4/hyperparameter_optimization.html 型调优 当你对你的模型表现不满意时&#xff0c;你可能希望调高你的模型表现&#xff0c;可通过超参数调整或者尝试一个更加适合你的模型&#xff0c;本篇将介绍这些操…...

使用Pandas实现股票交易数据可视化

一、折线图&#xff1a;展现股价走势 1.1、简单版-股价走势图 # 简洁版import pandas as pdimport matplotlib.pyplot as plt# 读取CSV文件df pd.read_csv(../数据集/格力电器.csv)data df[[high, close]].plot()plt.show() 首先通过df[[high,close]]从df中获取最高价和收盘…...

蓝桥杯刷题-乌龟棋

312. 乌龟棋 - AcWing题库 /* 状态表示&#xff1a;f[b1,b2,b3,b4]表示所有第 i种卡片使用了 bi张的走法的最大分值。状态计算&#xff1a;将 f[b1,b2,b3,b4]表示的所有走法按最后一步选择哪张卡片分成四类&#xff1a;第 i类为最后一步选择第 i种卡片。比如 i2&#xff0c;则…...

美国纽扣电池认证标准要求16 CFR 第 1700和ANSI C18.3M标准

法规背景 为了纪念瑞茜哈姆史密斯(Reese Hamsmith)美国德州一名于2020年12月因误食遥控器里的纽扣电池而不幸死亡的18个月大的女婴。 美国国会于2022年8月16日颁布了H.R.5313法案&#xff08;第117-171号公众法&#xff09;也称为瑞茜法案&#xff08;Reese’s Law&#xff09…...

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…...

【ROS2笔记六】ROS2中自定义接口

6.ROS2中自定义接口 文章目录 6.ROS2中自定义接口6.1接口常用的CLI6.2标准的接口形式6.3接口的数据类型6.4自定义接口Reference 在ROS2中接口interface是一种定义消息、服务或动作的规范&#xff0c;用于描述数据结构、字段和数据类型。ROS2中的接口可以分为以下的几种消息类型…...

设计模式-代理模式(Proxy)

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是程序设计中的一种结构型设计模式。它为一个对象提供一个代理对象&#xff0c;并由代理对象控制对该对象的访问。 2. 原理结构图 抽象角色&#xff08;Subject&#xff09;&#xff1a;这是一个接口或抽象类&#xff0…...

中伟视界:智慧矿山智能化预警平台功能详解

矿山智能预警平台是一种高度集成化的安全监控系统&#xff0c;它能够提供实时的监控和报警功能&#xff0c;帮助企业和机构有效预防和响应潜在的安全威胁。以下是矿山智能预警平台的一些关键特性介绍&#xff1a; 报警短视频生成&#xff1a; 平台能够在检测到报警时自动生成短…...

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…...

HTML段落标签、换行标签、文本格式化标签与水平线标签

目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中&#xff0c;要把文字有条理地显示出来&#xff0c;就需要将这些文字分段显示。在 HTML 标签中&#xff0c;<p>标签用于定义段落…...

wordpress web3d/新站seo优化快速上排名

如果一些函数被频繁调用&#xff0c;不断地有函数入栈(Stack),会造成栈空间的大量消耗。对应这种问题,可以使用内联函数(inline)。编译器会将内联函数的代码整段插入到调用的位置。#include <stdio.h>inline int parity(int a) {return (a % 2 > 0) ? 1 : 0; }int ma…...

济南网站建设/关键词检测工具

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include #include // 用srand、rand函数了#include // 用time函数了#define LEN 32// 产生min~max的随机数 (包含min和max)// rand函数产生0 ~ RAND_MAX 的随机数// 一般上不同编译器要求 RAND_MAX 的值(至少)为 32767#define RAN…...

网站设计编程有哪些/网络营销教案ppt

先来思考这样一个问题如果有两个变量需要互换其值&#xff0c;应该如何处理&#xff1f;答案非常简单&#xff1a;#include int main(int argc, char **args){int i 3;int j 5;int t;t i;i j;j t;printf("i %d\nj %d\n", i, j);return 0;}运行结果&#xff1a…...

建立网站加强家园沟通和联系的做法有何利弊/seo关键词排名优化费用

题目&#xff1a; 给定一个没有重复数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://…...

怎么做熊掌号网站/巨量引擎广告投放

《计算机网络-吴功宜》涉及题目 (8页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;7.9 积分计算机网络课程设计 吴功宜《计算机网络课程设计》题目有哪些1. 发送和接收TCP数据包TCP是一种面向连接的…...

公司网站做一下多少钱/b2b平台都有哪些网站

所以说&#xff0c;这写程序啊&#xff0c;一个月不写就手生。在运行 Java 程序时经常要指定一个包含各种 jar 包的目录作为类路径&#xff0c;以前我们习惯用 -Djava.ext.dirs... 来指定这个 jar 目录。但在新版的 JDK 中&#xff0c;好像是从 JDK 9 开始&#xff0c;当你还用…...