数据结构——单链表

在这里插入图片描述

无头单向非循环链表的建立

  • 前言——什么链表
    • 链表形象图
    • 链表分类
  • 一、Single_linked_list.h头文件的建立
  • 二、Single_linked_list.c功能函数的定义
  • Single_linked_list_test.c主函数的定义
  • 四、代码运行测试
  • 五、Single_linked_list完整代码演示:
  • 总结


前言——什么链表

链表的概念及结构概念:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

链表形象图

链表具体表现是怎么样的呢?让我们通过下面的图片来了解一下!

在这里插入图片描述

形象一点形容呢,那就像一个车厢相互链接的火车,这样好记住多了吧!
在这里插入图片描述

注意:
. 从上图可看出,链式结构在逻辑上是连续的,但在物理上不一定连续
. 现实中的结点一般是都是从堆上申请来的
. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续

链表分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向或者双向
    在这里插入图片描述

  2. 带头或者不带头
    在这里插入图片描述

  3. 循环或者非循环
    在这里插入图片描述

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:
无头单向非循环链表
在这里插入图片描述

带头双向循环链表
在这里插入图片描述


今天我们要实现的是无头单向非循环链表,让我们跟随下面的步骤来建立单链表吧

一、Single_linked_list.h头文件的建立

1.头文件的声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

2.单链表的接口实现

typedef int SLTDataType;//类型重命名
//单链表接口定义
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;

3.打印函数以及创建结点函数的声明

//打印
void SLTPrint(SLTNode* phead);
//创建结点
SLTNode* BuySListNode(SLTDataType x);

4.尾插、头插函数的声明

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);

在这里插入图片描述

在这里插入图片描述

5.尾删头删函数的声明

//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);

在这里插入图片描述
在这里插入图片描述

6.查找函数的声明

SLTNode* SLTFind(SLTNode* phead, SLTDataType x);

7.定点pos前后插入函数的声明

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x);

在这里插入图片描述
在这里插入图片描述

8.定点删除pos或删除pos后一位结点的函数的声明

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);
// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);

在这里插入图片描述
在这里插入图片描述

二、Single_linked_list.c功能函数的定义

1.头文件的声明

#include "Single_linked_list.h"

2.打印函数以及创建结点函数的定义

//打印
void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur)//cur!=NULL为真{printf("%d ", cur->data);cur = cur->next;}printf("NULL\n");//打印尾结点的next结点NULL
}//创建结点
SLTNode* BuySListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//创建一个新结点if (newnode == NULL)//创建失败返回错误结束程序{perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//将新结点的next结点置为NULLreturn newnode;
}

3.尾插、头插函数的定义

//尾插
//传入结构体指针,用二级指针接收
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);//调用函数创建新结点//两种情况 头结点为空时和头结点不为空时if (*pphead == NULL){// 改变的结构体的指针,所以要用二级指针*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail->next != NULL)//遍历链表到尾结点{tail = tail->next;}// 改变的结构体,用结构体的指针即可tail->next = newnode;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;// 改变的结构体的指针,所以要用二级指针*pphead = newnode;
}

4.尾删头删函数的定义

//尾删
void SLTPopBack(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空//一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else//一个以上节点{SLTNode* tail = *pphead;while (tail->next->next)//遍历链表到尾结点{tail = tail->next;}free(tail->next);tail->next = NULL;}
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}

当然,尾删不只一种方法,另一种方法就是:

void SLTPopBack(SLTNode** pphead)
{assert(*pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* tailPrev = NULL;//设置一个前驱结点,方便置空SLTNode* tail = *pphead;while (tail->next){tailPrev = tail;tail = tail->next;}free(tail);tailPrev->next = NULL;}
}

5.查找函数的定义

SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {SLTNode* cur = phead;while (cur != NULL&&cur->data != x ) {cur = cur->next;}if (cur == NULL) {printf("未查找到有效结点\n");exit(-1);}return cur;
}

6.定点pos前后插入函数的定义

// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(curPrev,pos->data);if (curPrev == cur) {newnode->next = *pphead;*pphead = newnode;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}newnode->next = cur;curPrev->next = newnode;}
}// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);newnode->next = cur->next;cur->next = newnode;
}

7.定点删除pos或删除pos后一位结点的函数的定义

// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (curPrev == cur) {temp = cur->next;free(cur);cur = temp;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}curPrev->next = cur->next;free(cur);cur = NULL;}
}// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (cur->next == NULL) {return;}else {temp = cur->next;cur->next = temp->next;free(temp);temp = NULL;}
}

Single_linked_list_test.c主函数的定义

1.头文件的声明

#include "Single_linked_list.h"

2.测试调用函数的定义

void TestSList() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 10);SLTPushFront(&plist, 20);SLTPushFront(&plist, 30);SLTPushFront(&plist, 40);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}

3.主函数的定义

int main()
{TestSList();return 0;
}

四、代码运行测试

示例一:

void TestSList2()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPushFront(&plist, 10);SLTPushFront(&plist, 20);SLTPushFront(&plist, 30);SLTPushFront(&plist, 40);SLTPrint(plist);
}

运行结果:
在这里插入图片描述
示例二:

void TestSList3()
{SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);SLTPopBack(&plist);SLTPrint(plist);}

运行结果:
在这里插入图片描述
示例三:

void TestSList5() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}

运行结果:
在这里插入图片描述

五、Single_linked_list完整代码演示:

Single_linked_list.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLTDataType;//类型重命名
//单链表接口定义
typedef struct SListNode
{SLTDataType data;struct SListNode* next;
}SLTNode;//打印
void SLTPrint(SLTNode* phead);
//创建结点
SLTNode* BuySListNode(SLTDataType x);//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x);
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x);//尾删
void SLTPopBack(SLTNode** pphead);
//头删
void SLTPopFront(SLTNode** pphead);//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x);// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x);// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos);// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos);

Single_linked_list.c

#include "Single_linked_list.h"//打印
void SLTPrint(SLTNode* phead)
{SLTNode* cur = phead;while (cur)//cur!=NULL为真{printf("%d ", cur->data);cur = cur->next;}printf("NULL\n");//打印尾结点的next结点NULL
}//创建结点
SLTNode* BuySListNode(SLTDataType x)
{SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));//创建一个新结点if (newnode == NULL)//创建失败返回错误结束程序{perror("malloc fail");exit(-1);}newnode->data = x;newnode->next = NULL;//将新结点的next结点置为NULLreturn newnode;
}//尾插
//传入结构体指针,用二级指针接收
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);//调用函数创建新结点//两种情况 头结点为空时和头结点不为空时if (*pphead == NULL){// 改变的结构体的指针,所以要用二级指针*pphead = newnode;}else{SLTNode* tail = *pphead;while (tail->next != NULL)//遍历链表到尾结点{tail = tail->next;}// 改变的结构体,用结构体的指针即可tail->next = newnode;}
}//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuySListNode(x);newnode->next = *pphead;// 改变的结构体的指针,所以要用二级指针*pphead = newnode;
}//尾删
void SLTPopBack(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空//一个节点if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else//一个以上节点{SLTNode* tail = *pphead;while (tail->next->next)//遍历链表到尾结点{tail = tail->next;}free(tail->next);tail->next = NULL;}
}//头删
void SLTPopFront(SLTNode** pphead)
{assert(*pphead);//判断*pphead是否为空SLTNode* newhead = (*pphead)->next;free(*pphead);*pphead = newhead;
}//查找
SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {SLTNode* cur = phead;while (cur != NULL&&cur->data != x ) {cur = cur->next;}if (cur == NULL) {printf("未查找到有效结点\n");exit(-1);}return cur;
}// 在pos之前插入x
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(curPrev,pos->data);if (curPrev == cur) {newnode->next = *pphead;*pphead = newnode;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}newnode->next = cur;curPrev->next = newnode;}
}// 在pos以后插入x
void SLTInsertAfter(SLTNode** pphead,SLTNode* pos, SLTDataType x) {SLTNode* newnode = BuySListNode(x);SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);newnode->next = cur->next;cur->next = newnode;
}// 删除pos位置
void SLTErase(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* curPrev = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (curPrev == cur) {temp = cur->next;free(cur);cur = temp;}else {while (curPrev->next != cur) {curPrev = curPrev->next;}curPrev->next = cur->next;free(cur);cur = NULL;}
}// 删除pos的后一个位置
void SLTEraseAfter(SLTNode** pphead, SLTNode* pos) {SLTNode* temp = *pphead;SLTNode* cur = SLTFind(temp, pos->data);if (cur->next == NULL) {return;}else {temp = cur->next;cur->next = temp->next;free(temp);temp = NULL;}
}

Single_linked_list_test.c

void TestSList() {SLTNode* plist = NULL;SLTPushBack(&plist, 1);SLTPushBack(&plist, 2);SLTPushBack(&plist, 3);SLTPushBack(&plist, 4);SLTPushBack(&plist, 5);SLTPrint(plist);SLTNode* pos = BuySListNode(3);SLTInsert(&plist,pos, 6);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTInsertAfter(&plist, pos, 7);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(6);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(7);SLTErase(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(3);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);pos = BuySListNode(1);SLTEraseAfter(&plist, pos);free(pos);pos = NULL;SLTPrint(plist);
}int main()
{TestSList();return 0;
}

总结

无头单项非循环链表是链表的初始内容!
有点难度,但是不多,记住指针与多级指针之间的关系!
我相信大家也一定可以写出比我更好的代码!

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

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

相关文章

一条自由游动的鲸鱼

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>鲸鱼</title><style>#canvas-container {width: 100%;height: 100vh;overflow: hidden;}&l…

HTML之表单标签

目录 表单标签 Form表单 定义&#xff1a; 基本语法结构&#xff1a; form属性&#xff1a; enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

太魔幻了!计算机就业哀鸿遍野,而高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(gitee\github)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

Mac电脑目录

System&#xff08;系统&#xff09;Applications&#xff08;应用程序&#xff09;应用程序目录&#xff0c;默认所有的GUI应用程序都安装在这里User&#xff08;用户&#xff09;存放用户的个人资料和配置。每个用户有自己的单独目录Library&#xff08;资料库&#xff09;系…

Android的Handler消息通信详解

目录 背景 1. Handler基本使用 2. Handler的Looper源码分析 3. Handler的Message以及消息池、MessageQueue 4. Handler的Native实现 4.1 MessageQueue 4.2 Native结构体和类 4.2.1 Message结构体 4.2.2 消息处理类 4.2.3 回调类 4.2.5 ALooper类 5. 总结&…

基于fpga_EP4CE6F17C8_秒表计数器

文章目录 前言实验手册一、实验目的二、实验原理1&#xff0e;理论原理2&#xff0e;硬件原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表dig_driver(数码管驱动模块)key(按键消抖模块)top(顶层模块) 2&#xff0e;状态转移图3&#xff0e;时序图五、仿真波形…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

7.物联网操作系统互斥信号量

1.使用互斥信号量解决信号量导致的优先级反转&#xff0c; 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用&#xff0c;使用递归互斥信号量&#xff0c;但要注意每个信号量的使用要对应一个释放 优先级翻转问题 优先级翻转功能需…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…

网络安全知识点整理(作业2)

目录 一、js函数声明->function 第一种 第二种 第三种 二、this关键字 this使用场合 1.全局环境 2.构造函数 3.对象的方法 避免多层this 三、js的同步与异步 定时器 setTimeout和setInterval 同步与异步的例子 四、宏任务与微任务 分辨宏任务与微任务 一、js…

深入解析项目管理中的用户流程图

介绍用户流程图 用户流程图的定义 用户流程图(User Flow Diagram)是一种可视化工具&#xff0c;它描绘了用户在应用或网站上完成任务的过程。这些任务可以是购物、注册账户、查找信息等&#xff0c;任何需要用户交互的动作都可以在用户流程图中找到。 用户流程图的重要性 用…

我对排序算法的理解

排序算法一直是一个很困惑我的问题&#xff0c;早在刚开始接触 数据结构的时候&#xff0c;这个地方就很让我不解。就是那种&#xff0c;总是感觉少了些什么的感觉。一开始&#xff0c;重新来过&#xff0c;认真来学习这一部分&#xff0c;也总是学着学着就把概念记住了。过了一…

案例|会展大数据服务系统 智能服务体系建设实践

根据相关的市场调查发现在国内进行的2000多个会展项目中&#xff0c;仅有15%的项目能够提供相关主题网站基本业务和服务&#xff0c;且提供的服务并不能够满足会展各方的应用&#xff0c;剩余的大部门会展项目信息系统构建的不够完善、技术性差、应用复杂等&#xff0c;甚至提供…

三、JVM-如何判断对象已死问题

内存模型以及如何判定对象已死问题 体验与验证 2.4.5.1 使用visualvm visualgc插件下载链接 &#xff1a;https://visualvm.github.io/pluginscenters.html 选择对应JDK版本链接—>Tools—>Visual GC 若上述链接找不到合适的&#xff0c;大家也可以自己在网上下载对应…

服务器的shell脚本

shell脚本语句可以执行linux的操作语句。 linux相当于网页&#xff0c;shell相当于java。可以解释编写执行逻辑。 shell的开头以&#xff1a;#!bin/sh 定义解析方式&#xff0c;不同的linuxe内核解释方式不同。大多数内核支持sh&#xff08;bash&#xff09;方式。 执行sh文件可…

输入筛选框搜索

文章目录 输入筛选框实现效果图需求前端工具版本添加依赖main.js导入依赖 代码 后端代码对应 sql对应 mapper.xml 文件的动态 sql 输入筛选框实现 效果图 需求 通过筛选框&#xff0c;选择公司&#xff0c;传入后端&#xff0c;后端根据公司名称去文章的内容中进行模糊查询 …

照片回收站是什么?恢复照片就靠这3招!

“我电脑里本来保存了很多照片&#xff0c;但我不小心给删除了&#xff0c;还能恢复吗&#xff1f;由于本人是个电脑新手&#xff0c;求一些简单的方法。感谢&#xff01;” 在照片拍摄后&#xff0c;很多朋友可能会选择在电脑上对照片进行保存。但是由于各种原因&#xff0c;电…

Simulink仿真模块-Signal Builder

目录 说明 实例 Signal Builder是创建和生成可交替的具有分段线性波形的信号组。 在仿真库中的位置为:Simulink / Sources说明 Signal Builder 模块允许创建可交替的分段线性信号源组,并在模型中使用。可以快速将信号组切换入模型或切换出模型,以便于测试。在 Signal Buil…

Linux【网络编程】之深入理解TCP协议

Linux【网络编程】之深入理解TCP协议 TCP协议TCP协议段格式4位首部长度---TCP报头长度信息 TCP可靠性&#xff08;确认应答&#xff09;&& 提高传输效率确认应答(ACK)机制32位序号与32为确认序号 16位窗口大小---自己接收缓冲区剩余空间的大小16位紧急指针---紧急数据处…