无头+单向+非循环链表的实现

news2025/1/13 11:53:42

这里写目录标题

  • 1. 链表
    • 1.1 链表的概念及结构
    • 1.2 链表的分类
  • 2. 接口实现
  • 3. 链表的实现
    • 3.1 打印链表
    • 3.2 头插
    • 3.3 尾插
    • 3.4 头删
    • 3.5 尾删
    • 3.6 单链表查找
    • 3.7 在pos之前插入
    • 3.8 在pos之后插入
    • 3.9 删除pos位置的值
    • 3.10 删除pos位置之后的值
    • 3.11 链表的释放
    • 3.12 动态申请一个节点
  • 4. 链表的测试
    • 4.1 尾插测试
    • 4.2 空链表头插
    • 4.3 尾删测试
    • 4.4 查找修改测试
    • 4.5 pos前插和后插以及删除pos位置的值
  • 5. 整体代码
    • 5.1 test.c 文件
    • 5.2 SList.h 文件
    • 5.3 SList.c 文件

1. 链表

1.1 链表的概念及结构

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

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

1.2 链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
在这里插入图片描述

在这里插入图片描述

  1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。

2. 接口实现

接口就是函数定义

#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);

//头插
void SLPushFront(SLTNode** pphead, SLTDataType x);

//尾插
void SLPushBack(SLTNode** pphead, SLTDataType x);

//头删
void SLPopFront(SLTNode** pphead);

//尾删
void SLPopBack(SLTNode** pphead);

//单链表查找
SLTNode* STFind(SLTNode* phead, SLTDataType x);

//在pos之前插入
void SLInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);

//在pos之后插入
void SLInsertAfter(SLTNode* pos, SLTDataType x);

//删除pos位置的值
void SLErase(SLTNode** pphead, SLTNode* pos);

//删除pos位置之后的值
void SLEraseAfter(SLTNode* pos);

//链表的释放
void SLDestroy(SLTNode** pphead);

3. 链表的实现

3.1 打印链表

//打印链表
void SLTPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;//找结构体下一个指针,循环才能走起来
	}
	printf("NULL\n");
}

3.2 头插

//头插
void SLPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	//assert(*pphead);//不能断言,链表为空,也需要插入
	SLTNode* newnode = BuyLTNode(x);

	newnode->next = *pphead;
	*pphead = newnode;
}

3.3 尾插

//尾插
void SLPushBack(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	//assert(*pphead);//链表为空,可以插入
	SLTNode* newnode = BuyLTNode(x);
	//空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	//非空链表
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		SLTNode* newnode = BuyLTNode(x);
		tail->next = newnode;
	}
	
}

3.4 头删

//头删
void SLPopFront(SLTNode** pphead)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	assert(*pphead);//空链表,不能头删

	一个节点
	//if (((*pphead)->next) == NULL)
	//{
	//	free(*pphead);
	//	*pphead = NULL;
	//}
	多个节点
	//else
	//{
	//	SLTNode* head = *pphead;
	//	*pphead = head->next;
	//	free(head);
	//}

	SLTNode* del = *pphead;
	*pphead = del->next;
	free(del);
}

3.5 尾删

//尾删
void SLPopBack(SLTNode** pphead)
{
	//没有节点(空链表)
	//暴力检查
	assert(*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;
	}
}

3.6 单链表查找

//单链表查找
SLTNode* STFind(SLTNode* phead, SLTDataType x)
{
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}

		cur = cur->next;
	}
	return NULL;
}

3.7 在pos之前插入

//在pos之前插入
void SLInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SLPushFront(pphead, x);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		SLTNode* newnode = BuyLTNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}

3.8 在pos之后插入

//在pos之后插入
void SLInsertAfter(SLTNode* pos, SLTDataType x)
{
	SLTNode* newnode = BuyLTNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

3.9 删除pos位置的值

//删除pos位置的值
void SLErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SLPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		prev->next = pos->next;
		free(pos);
	}
}

3.10 删除pos位置之后的值

//删除pos位置之后的值
void SLEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);

	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
}

3.11 链表的释放

//链表的释放
void SLDestroy(SLTNode** pphead)
{
	assert(pphead);

	SLTNode* cur = *pphead;
	while (cur)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}

	*pphead = NULL;
}

3.12 动态申请一个节点

//动态开辟一个newnode结构体,不free不释放
SLTNode* BuyLTNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("BuyLTNode");
		return NULL;
	}

	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}

4. 链表的测试

4.1 尾插测试

//尾插测试
void TestSLish1()
{
	SLTNode* plist = NULL;
	SLPushFront(&plist, 1);
	SLPushFront(&plist, 2);
	SLPushFront(&plist, 3);
	SLPushFront(&plist, 4);

	SLTPrint(plist);
	SLPushBack(&plist, 5);
	SLTPrint(plist);
}

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

运行演示:
在这里插入图片描述

4.2 空链表头插

//空链表头插
void TestSLish2()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);
}

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

运行演示:
在这里插入图片描述

4.3 尾删测试

//尾删测试
void TestSLish3()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	
	SLPopBack(&plist);
	SLTPrint(plist);
	SLPopBack(&plist);
	SLTPrint(plist);
	SLPopBack(&plist);
	SLTPrint(plist);
}

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

运行演示:
在这里插入图片描述

4.4 查找修改测试

//查找修改测试
void TestSLish4()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);

	SLTNode* pos = STFind(plist, 3);
	if (pos)
	pos->data = 30;
	SLTPrint(plist);
}

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

运行演示:
在这里插入图片描述

4.5 pos前插和后插以及删除pos位置的值

//pos前插和后插,测试
//删除pos位置的值
void TestSLish5()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);

	SLTNode* pos = STFind(plist, 3);
	if (pos)
	{
		SLInsert(&plist, pos, 30);
	}
	SLTPrint(plist);

	pos = STFind(plist, 2);
	if (pos)
	{
		SLInsertAfter(pos, 20);
	}
	SLTPrint(plist);

    pos = STFind(plist, 2);
	if (pos)
	{
		SLErase(&plist, pos);
	}
	SLTPrint(plist);

	SLDestroy(&plist);
}

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

运行演示:
在这里插入图片描述

5. 整体代码

5.1 test.c 文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

//尾插测试
void TestSLish1()
{
	SLTNode* plist = NULL;
	SLPushFront(&plist, 1);
	SLPushFront(&plist, 2);
	SLPushFront(&plist, 3);
	SLPushFront(&plist, 4);

	SLTPrint(plist);
	SLPushBack(&plist, 5);
	SLTPrint(plist);
}

//空链表头插
void TestSLish2()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);
}

//尾删测试
void TestSLish3()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	
	SLPopBack(&plist);
	SLTPrint(plist);
	SLPopBack(&plist);
	SLTPrint(plist);
	SLPopBack(&plist);
	SLTPrint(plist);
}

//查找修改测试
void TestSLish4()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);

	SLTNode* pos = STFind(plist, 3);
	if (pos)
	pos->data = 30;
	SLTPrint(plist);
}

//pos前插和后插,测试
//删除pos位置的值
void TestSLish5()
{
	SLTNode* plist = NULL;
	SLPushBack(&plist, 1);
	SLPushBack(&plist, 2);
	SLPushBack(&plist, 3);
	SLPushBack(&plist, 4);
	SLPushBack(&plist, 5);
	SLTPrint(plist);

	SLTNode* pos = STFind(plist, 3);
	if (pos)
	{
		SLInsert(&plist, pos, 30);
	}
	SLTPrint(plist);

	pos = STFind(plist, 2);
	if (pos)
	{
		SLInsertAfter(pos, 20);
	}
	SLTPrint(plist);

    pos = STFind(plist, 2);
	if (pos)
	{
		SLErase(&plist, pos);
	}
	SLTPrint(plist);

	SLDestroy(&plist);
}



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

5.2 SList.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);

//头插
void SLPushFront(SLTNode** pphead, SLTDataType x);

//尾插
void SLPushBack(SLTNode** pphead, SLTDataType x);

//头删
void SLPopFront(SLTNode** pphead);

//尾删
void SLPopBack(SLTNode** pphead);

//单链表查找
SLTNode* STFind(SLTNode* phead, SLTDataType x);

//在pos之前插入
void SLInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);

//在pos之后插入
void SLInsertAfter(SLTNode* pos, SLTDataType x);

//删除pos位置的值
void SLErase(SLTNode** pphead, SLTNode* pos);

//删除pos位置之后的值
void SLEraseAfter(SLTNode* pos);

//链表的释放
void SLDestroy(SLTNode** pphead);

5.3 SList.c 文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

//打印链表
void SLTPrint(SLTNode* phead)
{
	SLTNode* cur = phead;
	while (cur)
	{
		printf("%d->", cur->data);
		cur = cur->next;//找结构体下一个指针,循环才能走起来
	}
	printf("NULL\n");
}

//动态开辟一个newnode结构体,不free不释放
SLTNode* BuyLTNode(SLTDataType x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("BuyLTNode");
		return NULL;
	}

	newnode->data = x;
	newnode->next = NULL;

	return newnode;
}

//头插
void SLPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	//assert(*pphead);//不能断言,链表为空,也需要插入
	SLTNode* newnode = BuyLTNode(x);

	newnode->next = *pphead;
	*pphead = newnode;
}

//尾插
void SLPushBack(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	//assert(*pphead);//链表为空,可以插入
	SLTNode* newnode = BuyLTNode(x);
	//空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	//非空链表
	else
	{
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		SLTNode* newnode = BuyLTNode(x);
		tail->next = newnode;
	}
	
}

//头删
void SLPopFront(SLTNode** pphead)
{
	assert(pphead);//链表为空,pphead也不为空,因为它是头指针plist的地址
	assert(*pphead);//空链表,不能头删

	一个节点
	//if (((*pphead)->next) == NULL)
	//{
	//	free(*pphead);
	//	*pphead = NULL;
	//}
	多个节点
	//else
	//{
	//	SLTNode* head = *pphead;
	//	*pphead = head->next;
	//	free(head);
	//}

	SLTNode* del = *pphead;
	*pphead = del->next;
	free(del);
}

//尾删
void SLPopBack(SLTNode** pphead)
{
	//没有节点(空链表)
	//暴力检查
	assert(*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;
	}
}

//单链表查找
SLTNode* STFind(SLTNode* phead, SLTDataType x)
{
	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}

		cur = cur->next;
	}
	return NULL;
}

//在pos之前插入
void SLInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SLPushFront(pphead, x);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		SLTNode* newnode = BuyLTNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}

//在pos之后插入
void SLInsertAfter(SLTNode* pos, SLTDataType x)
{
	SLTNode* newnode = BuyLTNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

//删除pos位置的值
void SLErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead);
	assert(pos);

	if (*pphead == pos)
	{
		SLPopFront(pphead);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		prev->next = pos->next;
		free(pos);
	}
}

//删除pos位置之后的值
void SLEraseAfter(SLTNode* pos)
{
	assert(pos);
	assert(pos->next);

	SLTNode* next = pos->next;
	pos->next = next->next;
	free(next);
}

//链表的释放
void SLDestroy(SLTNode** pphead)
{
	assert(pphead);

	SLTNode* cur = *pphead;
	while (cur)
	{
		SLTNode* next = cur->next;
		free(cur);
		cur = next;
	}

	*pphead = NULL;
}

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

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

相关文章

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…

【Java 百“练”成钢】Java 基础:带参数的方法

Java 基础&#xff1a;带参数的方法 01.求和02.字符串输出03.寻找最大值04.寻找最小值05.字符串拼接06.求平均值07.数组排序08.累乘09.存在的字符串10.长整型求和11.寻找字符串索引12.字符串拼接&#xff08;StringBuilder&#xff09; 01.求和 public class SumCalculator {s…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机&#xff08;PMDC&#xff09;、永磁同步电机&#xff08;PMSM&#xff09;、无刷直流电机&#xff08;BLDC&#xff09;以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动&#xff08;如二合一、三合一驱动芯片&#xff09;的原因主要…

python 多任务之多线程

多线程 线程是程序执行的最小单位&#xff0c;实际上进程只负责分配资源&#xff0c;而利用这些资源执行程序的是线程&#xff0c;也就是说进程是线程的容器&#xff0c;一个进程中最少有一个线程来负责执行程序&#xff0c;它可以与同属一个进程的其它线程共享进程所拥有的全…

前端使用轮播图的方法有哪些

前端使用轮播图的方法可以使用swiper:Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 这是swiper官网,在官网里面可以找到很多轮播图的实际案例: 我们挑选可用的案例或者修改的案例,打开后打开源码,就可以获取到当前的源码了,加以调试就可以获得我们需要的结果, 例如: 上图…

openai 前员工释放出关于AGI的前世今生和未来发展趋势的详细报告

目录 1.引言2.AGI的临近3.投资与工业动员4.国家安全与AI竞赛5.技术挑战与机遇6.项目与政策7.结语8.原文PDF链接PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 1.引言 2024年&#xff0c;我们站在了一个全新的科技前沿。在这篇文…

LabVIEW电机槽楔松动声测系统

LabVIEW电机槽楔松动声测系统 开发了一种利用LabVIEW软件和硬件平台&#xff0c;为大型电机设计的槽楔松动声测系统。该系统通过声波检测技术&#xff0c;实现了对电机槽楔是否松动的快速准确判断&#xff0c;极大地提高了检测效率和安全性。 项目背景 大型电机在运行过程中…

python-微分方程计算

首先导入数据 import numpy as np from scipy.integrate import odeint from scipy.optimize import minimize import matplotlib.pyplot as pltdata np.array([[30, 4],[47.2, 6.1],[70.2, 9.8],[77.4, 35.2],[36.3, 59.4],[20.6, 41.7],[18.1, 19],[21.4, 13],[22, 8.3],[2…

字符串形成树形

字符串形成树形 有的时候我们形成树形不是以ID的关系进行匹配的而是以字符串进行形成 数据 CREATE TABLE `contract_main_org_info` (`id` bigint(20) NOT NULL COMMENT 组织单位id,`parent_id` int(11) NULL DEFAULT NULL COMMENT 父组织单位id,`org_name` varchar(255) CHA…

什么是pump?pump跟单机器人是什么?

区块链pump&#xff08;拉盘&#xff09;是一种市场操纵策略&#xff0c;通常指在短时间内人为抬高某种加密货币的价格&#xff0c;从而吸引其他投资者购买&#xff0c;随后通过快速出售&#xff08;dump&#xff09;获利。这种策略通常由一群协调好的投资者或交易团体执行&…

学习使用 Frida 过程中出现的问题

一、adb shell命令报错&#xff1a;error: no devices found 目前该问题解决方法仅供参考&#xff0c;可先看看再选择试试&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 查看此电脑也会发现没有出现手机型号文件夹。 第一步&#xff1a; 检查一下手机开了u…

适用于电脑的 5 大嗨格式数据恢复替代方案

嗨格式数据恢复是有一定知名度的 Windows 和 Mac 恢复程序&#xff0c;旨在恢复格式化、删除和丢失的图片、视频和音频。该应用程序支持多种文件格式以及相机 RAW 图像。最好的部分&#xff1f;它的预览功能可以在恢复照片和其他媒体文件之前检查和验证它​​们——这可以节省大…

Golang | Leetcode Golang题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…

简单的基于threejs和BVH第一人称视角和第三人称视角控制器

渲染框架是基于THREE,碰撞检测是基于BVH。本来用的是three自带的octree结构做碰撞发现性能不太好 核心代码&#xff1a; import * as THREE from three import { RoundedBoxGeometry } from three/examples/jsm/geometries/RoundedBoxGeometry.js; import { MeshBVH, MeshBVHHe…

C++做题

我们可以将0——9看成一个一维数组&#xff1a;a[11] #include<cstdio> int a[11],n; int x,p; int main(){scanf("%d",&n);for(int i1;i<n;i){pi;while(p!0){xp%10;a[x];//让下标x每次出现时增加1(描述不清楚)p/10;}}for(int i0;i<9;i){printf(&qu…

Linux—小小内核升级

本篇主要是讲述下关于内核的一些基本常识&#xff0c;并记录下内核升级和编译的过程&#xff0c;若有遗漏/有误之处&#xff0c;望各位大佬们指出。 Ⅰ 基本内核常识 常见内核安装包 内核(kernel)&#xff1a;这是Linux操作系统的核心部分&#xff0c;它负责管理系统的硬件和…

拉格朗日乘子将不等式约束转化为等式约束例子

拉格朗日乘子将不等式约束转化为等式约束例子 在优化问题中,常常需要将不等式约束转化为等式约束。使用拉格朗日乘子法,可以通过引入松弛变量将不等式约束转换为等式约束,然后构造拉格朗日函数进行求解。 拉格朗日乘子法简介 拉格朗日乘子法是求解带约束优化问题的一种方…

局域网测速

对于网管来说&#xff0c;企业局域网络的速度是知道的&#xff0c;因为网管清楚企业局域网络的拓扑结构、网络链路、网络设备以及实际到桌面的情况。 有时候即使千兆到桌面实际因为影响的因素多&#xff0c;实际的网络速度可能会打一定的折扣&#xff0c;那么就需要清楚实际的网…

数据挖掘分析的一点进步分享

import pandas as pd import matplotlib.pyplot as plt import numpy as npdata pd.read_csv(heros.csv,encoding"gbk") data.head() 导入数据集 进行分析 df_datadata.copy() df_data.describe()df_data.info() df_data.drop(英雄,axis1,inplaceTrue) df_data[最…

[图解]建模相关的基础知识-06

1 00:00:00,790 --> 00:00:03,480 下一个概念&#xff0c;就是基数的概念 2 00:00:04,390 --> 00:00:11,560 cardinality&#xff0c;表示有限集合中元素的数量 3 00:00:12,200 --> 00:00:14,790 我们可以用一个井号 4 00:00:14,800 --> 00:00:18,320 在前面表示…