初阶数据结构(C语言实现)——3顺序表和链表(1)
目录
- 【本节目标】
- 1. 线性表
- 2.顺序表
- 2.1概念及结构
- 2.2 接口实现
- 2.2.0 动态顺序表
- 2.2.1 顺序表初始化SLInit()
- 2.2.2 销毁和打印
- 2.2.3 尾插SLPushBack()
- 2.2.4 尾删SLPopBack()
- 2.2.5 头插
- 2.2.6 头删
- 2.2.7 插入
- 2.2.8 删除
- 2.2.9 查找函数
- 2.3 源代码
- 2.3.1 SeqList20250226.h
- 2.3.2 SeqList20250226.c
- 2.3.3 FileName20250226.c
【本节目标】
1.线性表
2.顺序表
3.链表
4.顺序表和链表的区别和联系
1. 线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
2.顺序表
2.1概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:
-
静态顺序表:使用定长数组存储元素。
-
动态顺序表:使用动态开辟的数组存储。
2.2 接口实现
静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。
2.2.0 动态顺序表
//seqList.h
#pragma once
#include<stdio.h>
typedef int SLDataType;
#define INIT_CAPACITY 4 //默认初始化大小
//动态顺序表——按需申请
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity;//空间容量
}SL;
2.2.1 顺序表初始化SLInit()
版本1
//seqList.c
#include"SeqList20250226.h"
//顺序表初始化1
void seqInit(SL s)
{s.a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY);if (s.a == NULL){perror("seqInit");return;}s.size = 0;s.capacity = INIT_CAPACITY;
}
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"SL s;
void TestSeqList1(SL s)
{seqInit(s);
}
int main()
{TestSeqList1(s);return 0;
}
初始化结果:单步调试
版本2(后续都使用版本2)
//顺序表初始化2
void SLInit(SL* ps)
{ps->a = ((SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY));if (ps->a == NULL){perror("SLInit");return;}ps->size = 0;ps->capacity = INIT_CAPACITY;
}
2.2.2 销毁和打印
//seqList.h
//销毁
void SLDestroy(SL* ps);
//打印
void SLPrint(SL* ps);
//seqList.c
//销毁
void SLDestroy(SL* ps)
{free(ps->a);ps->a = NULL;ps->size = ps->capacity = 0;
}
//打印
void SLPrint(SL* ps)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d", ps->a[i]);}printf("\n");
}
2.2.3 尾插SLPushBack()
seqList.h
#include<stdlib.h>
//尾插
void SLPushBack(SL* ps, SLDataType x);
seqList.c
//尾插
void SLPushBack(SL* ps, SLDataType x)
{
//扩容 这里扩容了2倍,是自己定的,是一个比较合理的值,具体需要开辟多大是要和自己的实际问题结合if (ps->size == ps->capacity){SLDataType* tem = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * ((ps->capacity) * 2));if (tem == NULL){perror("SLPushBack::realloc");return;}ps->a = tem;ps->capacity *= 2;}//ps->a[ps->size] = x;//ps->size++; 这两行可以合并为下面的1行ps->a[ps->size++] = x;
}
尾插验证
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"
void TestSeqList1()
{SL s;SLInit(&s);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);SLPushBack(&s, 5);SLPushBack(&s, 6);SLPushBack(&s, 7);SLPushBack(&s, 8);SLPushBack(&s, 9);SLPrint(&s);
}int main()
{TestSeqList1();return 0;
}
2.2.4 尾删SLPopBack()
//尾删
void SLPopBack(SL* ps)
{assert(ps);//判断是否为空if (ps->size == 0){return 0;}//不为空就直接size-1ps->size--;
}
验证插入4个元素,删掉1个元素
2.2.5 头插
头插思路
扩容函数封装
void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity)//判断目前是大小是否和容量大小一样,一样的话,就需要扩容{SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2); //扩容原来容量的两倍if (tmp == NULL){perror("SLCheckCapacity::realloc fail!"); return;}ps->a = tmp;ps->capacity *= 2;}
}
代码实现
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++;
}
头插验证
2.2.6 头删
思路
void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);//size小于0 直接断言报错。int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;}
头删验证
2.2.7 插入
思路
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos <= ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (pos < end){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}
验证
2.2.8 删除
思路
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin <ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
}
验证
2.2.9 查找函数
思路:比较简单,直接遍历即可
int SLFind(SL* ps, SLDataType x)//直接遍历即可
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("找到了");return i;}}return -1;
}
2.3 源代码
2.3.1 SeqList20250226.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>//#define N 100
//typedef int SLDataType;
// 静态顺序表 -- 开少了不够用 开多了浪费
//struct SeqList
//{
// SLDataType a[N];
// int sise;
//};typedef int SLDataType;
#define INIT_CAPACITY 4 //默认初始化大小
//动态顺序表——按需申请
typedef struct SeqList
{SLDataType* a;int size; //有效数据个数int capacity;//空间容量
}SL;//基础的增删查改函数//初始化
void seqInit(SL* ps);
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);// 顺序表在pos位置插入x
void SLInsert(SL* ps, int pos, SLDataType x);// 顺序表删除pos位置的值
void SLErase(SL* ps, int pos);//查找表中有没有某个值
int SLFind(SL* ps, SLDataType x);
2.3.2 SeqList20250226.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"//顺序表初始化1
void seqInit(SL s)
{s.a = (SLDataType*)malloc(sizeof(SLDataType)* INIT_CAPACITY);if (s.a == NULL){perror("seqInit");return;}s.size = 0;s.capacity = INIT_CAPACITY;
}
//顺序表初始化2
void SLInit(SL* ps)
{ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);if (ps->a == NULL){perror("SLInit");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)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}printf("\n");
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{//判断是否要扩容if (ps->size == ps->capacity){SLDataType* tem = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2);if (tem == NULL){perror("SLPushBack::realloc fail");return;}ps->a = tem;ps->capacity *= 2;}//ps->a[ps->size] = x;//ps->size++; //这两行可以合并为下面的1行ps->a[ps->size++] = x;
}//尾删
void SLPopBack(SL* ps)
{assert(ps);//判断是否为空if (ps->size == 0){return 0;}//不为空就直接size-1ps->size--;
}void SLCheckCapacity(SL* ps)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType) * (ps->capacity) * 2);if (tmp == NULL){perror("SLCheckCapacity::realloc fail!"); return;}ps->a = tmp;ps->capacity *= 2;}
}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++;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);//size小于0 直接断言报错。int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;}void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);int end = ps->size - 1;while (pos <= end){ps->a[end + 1] = ps->a[end];end--;}ps->a[pos] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);int begin = pos + 1;while (begin <ps->size){ps->a[begin-1] = ps->a[begin];begin++;}ps->size--;
}int SLFind(SL* ps, SLDataType x)//直接遍历即可
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("找到了");return i;}}return -1;
}
2.3.3 FileName20250226.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList20250226.h"void TestSeqList1()
{SL s;SLInit(&s);SLPushBack(&s, 0);SLPushBack(&s, 1);SLPushBack(&s, 2);SLPushBack(&s, 3);SLPushBack(&s, 4);
// SLPopBack(&s);
//
// SLPushFront(&s,5);
// SLPopFront(&s);// SLInsert(&s, 2, 20);SLErase(&s, 2);SLPrint(&s);SLDestroy(&s);
}void manu()
{printf("**************************\n");printf("****1:头插 2.尾插****\n");printf("****3.头删 4.尾删****\n");printf("****5.插入 -1.退出****\n");printf("**************************\n");
}int main()
{SL s;SLInit(&s);int input = 0;while (input != -1){manu();scanf("%d", &input);printf("请输入您的选择:\n");if (input == 1){printf("请输入您想要插入的数据,并以-1结尾\n");int x = 0;while (x != -1){scanf("%d", &x);SLPushBack(&s, x);}}else if (input == 7){SLPrint(&s);}}//TestSeqList1();return 0;
}
相关文章:
初阶数据结构(C语言实现)——3顺序表和链表(1)
目录 【本节目标】1. 线性表2.顺序表2.1概念及结构2.2 接口实现2.2.0 动态顺序表2.2.1 顺序表初始化SLInit()2.2.2 销毁和打印2.2.3 尾插SLPushBack()2.2.4 尾删SLPopBack()2.2.5 头插2.2.6 头删2.2.7 插入…...
nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析
html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG),以检测可能导致水合错误的HTML常见问题,有助于减少水合错误,检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…...
4G工业路由器在公交充电桩中的应用与优势
随着电动公交车的普及,公交充电桩的稳定运行和高效管理是交通营运部门最关心的问题。4G工业路由器凭借其卓越的数据采集和通讯能力,成为实现充电桩智能化管理的关键。 公交充电桩运维管理需求概述: 1.实时性:实时监控充电状态、剩…...
matlab 四维数据可视化(已解决)
虽然这不是传统意义上的“4维可视化”,但你可以通过在三维空间中表示两个维度来间接展示4维数据。例如,你可以使用颜色来表示第四个维度。 clc clear close all% 假设X, Y, Z为你的三维数据,C为第四维数据 X rand(100, 1); Y rand(100, 1);…...
歌曲分类和流行度预测
1. 项目介绍 本项目从kaggle平台上下载了数据集,该数据集包含了3万多首来自Spotify API 的歌曲,共有23个特征。首先对数据集进行预处理,如重复行、缺失值、标准化处理等。再对预处理后的数据进行探索性分析,观察各变量的分布情况&…...
经验分享:用一张表解决并发冲突!数据库事务锁的核心实现逻辑
背景 对于一些内部使用的管理系统来说,可能没有引入Redis,又想基于现有的基础设施处理并发问题,而数据库是每个应用都避不开的基础设施之一,因此分享个我曾经维护过的一个系统中,使用数据库表来实现事务锁的方式。 之…...
oracle decode
1. 基本语法 DECODE(expression, search1, result1, search2, result2, ..., default_result) expression :需要比较的表达式或列。search1, search2, ... :要匹配的值。result1, result2, ... :当 expression 等于 search 时返回的结果。def…...
让后台界面布局更灵活:在GrapesJS中复刻Java的五区式布局
当你想要在可视化编辑器中做一个类似Java BorderLayout 的五区布局,却发现市面上大多只能“简单拼接”而难以自由扩展时,你或许就需要一个更灵活的布局管理器来帮忙。本篇文章就从这个痛点开始,带你一步步揭秘如何用 GrapesJS 自定义并实现一…...
【网络安全 | 漏洞挖掘】分享21个基础漏洞案例
未经许可,不得转载。 文章目录 案例1:绕过500状态码案例2:修改前端实现任意文件上传案例3:Nmap扫描端口命令案例4:绕过限制实现任意文件读取案例5:删除任意目录文件案例6:锁定任意账户案例7:重置任意用户密码案例8:接管任意账户方法一方法二案例9:功能校验机制绕过案…...
期权适合什么类型的投资者交易?
财顺小编本文主要介绍期权适合什么类型的投资者交易?期权适合的投资者类型需结合其风险偏好、投资目标及市场判断能力综合评估。 期权适合什么类型的投资者交易? 1. 风险管理型投资者(稳健型) 适用场景:持有股票、大…...
浅谈C++/C命名冲突
前言 在这里我会简要地介绍产生命名冲突的原因,和C中处理命名冲突的方法,同时和C语言的解决办法进行比较。 相信你在阅读完之后一定会有收获。对于我们来说,了解编译器的编译链接过程才能更好的理解编译器是如何报错的,更能让我们…...
【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架
【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始,学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据,并将其存储到缓冲区中…...
C# OnnxRuntime部署DAMO-YOLO香烟检测
目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…...
探索Elasticsearch:索引的CRUD
在企业环境中,Elasticsearch的索引CRUD(创建Create、读取Read、更新Update、删除Delete)操作是非常基础且频繁使用的功能。这些操作对于管理和维护数据至关重要,尤其是在处理大规模数据集和需要实时搜索与分析的应用场景中。 目录…...
C++:多态与虚函数
1.虚函数,在函数前加virtual即可。有虚函数时,父类指针指向父类对象时就会使用父类的成员,指向子类对象时就可以使用子类成员,进而我们引入了多态的概念。 2.多态:父类指针指向子类的对象,通过父类指针调用…...
【Python 数据结构 2.时间复杂度和空间复杂度】
Life is a journey —— 25.2.28 一、引例:穷举法 1.单层循环 所谓穷举法,就是我们通常所说的枚举,就是把所有情况都遍历了的意思。 例:给定n(n ≤ 1000)个元素ai,求其中奇数有多少个 判断一…...
【Qt QML】QML鼠标事件(MouseArea)
QML鼠标事件全面解析 一、MouseArea基础概念 在 QML 中,鼠标事件是处理用户与界面元素交互的重要部分。QML 提供了多种方式来处理鼠标事件,MouseArea 是 QML 中用于处理鼠标事件的核心元素,它可以覆盖在其他元素之上,捕获鼠标操作并触发相应的信号。 1、基本用法 import …...
医脉云枢:中医药典籍知识图谱与非遗传承多维可视化系统
核心优势: "医脉"直击主题,"云枢"体现技术前瞻性 "非遗传承"呼应二十大文化政策 "多维"涵盖3D模型、时间轴、地图等多种可视化形式 技术栈:Vue Flask Element UI ECharts MySQL 同时参考了…...
vue 和 react 底层采用的 diff 算法的区别
Vue 3 和 React 在底层 Diff 算法上的实现确实有一些区别,主要体现在设计理念、性能优化策略以及具体实现方式上。以下是对两者 Diff 算法差异的详细分析: 1. 总体设计理念 Vue 3 的 Diff 算法 Vue 3 的虚拟 DOM Diff 算法基于“双端比较”思想ÿ…...
养老小程序方案详解居家养老小程序系统
养老小程序,上门居家养老小程序,用户端护工端小程序,管理后台。php开发语言,可源码搭建,二次开发或者定制开发。 一 用户端:小程序 核心功能模块:用户完善个人健康档案,在线选择服…...
Tauri跨平台开发问题及解决方案深度解析(React版)
Tauri跨平台开发问题及解决方案深度解析(React版) 一、环境配置与项目初始化难题(React适配) 1.1 React项目初始化 推荐模板: # 使用ReactTypeScript模板 npm create tauri-applatest -- --template react-ts# 项目…...
【OMCI实践】omci.lua脚本文件(独家分享)
引言 omci.lua文件是Wireshark的OMCI协议解析插件的核心组件。它配合BinDecHex.lua,可以解析OMCI协议的数据包,提取出消息类型、受管实体标识、受管实体属性等关键信息,并以人类可读的形式显示在Wireshark的解码视图中,方便研发人…...
React高级内容探索
flushSync确保了DOM立即更新 flushSync让你强制React同步刷新提供回调中的任何更新,这确保了DOM立即更新 flushSync是DOM更新之后的,像vue中的nextTick: import { useState,useRef} from "react" import { flushSync} from &quo…...
前端水印实现方式
一、简介 简单来说,前端水印就是在网页或应用程序的前端界面上添加的一种标记,通常是文本、图标或图案等形式。它就像给你的数字内容贴上了一个独特的 “标签”,用于标识内容的归属、防止未经授权的使用和传播。比如,一些在线图片…...
【新手入门】SQL注入之getshell(木马)
木马介绍 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 按照功能分类:远控型、破坏型、流氓软件型、盗取信…...
Git操作指南:分支合并、回退及其他重要操作
在软件开发的协作过程中,Git 作为一款强大的版本控制系统,能帮助开发者高效管理代码的各个版本和分支。本文将详细介绍 Git 中常见的分支合并、取消本地修改、回退操作等,并提供通俗易懂的解释和步骤指南。 一、分支合并 分支合并是 Git 工…...
Vue 3 引入全局状态管理 pinia
什么是全局状态管理? 所有页面全局共享的变量,而不是局限在某一个页面中。适合作为全局状态的数据: 已登录用户信息 (每个页面几乎都要用) Pinia 是一个主流的状态管理库,相比于 Vuex 来说使用更简单,可参考 入门文档 开始 | Pinia 进行引…...
SQL 中为什么参数多了not in 比 in 慢多了,怎么优化
开发工作中,我发现一个现象,比喻下面的两个语句: select * from shangpin where spdm in (1,2,3,...); select * from shangpin where spdm not in (1,2,3,...); 当参数比较少的时候还看不出来什么,但是遇到参数上了几百几千&am…...
[密码学实战]Java生成SM2根证书及用户证书
前言 在国密算法体系中,SM2是基于椭圆曲线密码(ECC)的非对称加密算法,广泛应用于数字证书、签名验签等场景。本文将结合代码实现,详细讲解如何通过Java生成SM2根证书及用户证书,并深入分析其核心原理。 一、证书验证 1.代码运行结果 2.根证书验证 3.用户证书验证 二、…...
API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南
API接口:企业名称、注册号、统一社会信用代码、企业类型、成立日期和法定代表人等数据 API 接口使用指南 本文详细介绍一种基于 Web 搜索方式实现的企业信息查询接口,适用于数据补全、企业资质验证、信息查询等场景。文章内容涵盖接口功能、请求参数、返…...
版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点
版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点 引言正文引言 必读文章 ------ 版图自动化连接算法开发 00001 ------ 直接连接两个给定的坐标点。 此处,我们对给定点的坐标进行一下限制,因为是只添加一个点,因…...
医疗行业电脑终端如何防病毒——火绒企业版杀毒软件
医疗物联网技术广泛应用,使得医院网络空间中增加了诸多新型终端设备。这些设备类型多样、型号各异,风险暴露面积大。火绒安全对医疗机构终端安全出现的问题、不足、需求等,提出整体解决方案。 医疗行业终端安全防护痛点 系统老旧 医院、区…...
【入门Web安全之前端学习的侧重点和针对性的建议】
入门Web安全之前端学习的侧重点和针对性的建议 一、HTML:理解攻击载荷的载体二、CSS:次要但需警惕点击劫持三、JavaScript:渗透测试的核心重点四、浏览器工具:渗透测试的实战武器五、学习建议与资源六、总结:渗透测试者…...
2024年中国城市统计年鉴(PDF+excel)
2024年中国城市统计年鉴(PDFexcel) 说明:包括地级县级市 格式:PDFEXCEL 《中国城市统计年鉴》是一部全面反映中国城市发展状况的官方统计出版物,包括各级城市的详细统计数据。这部年鉴自1985年开始出版,…...
详解DeepSeek模型底层原理及和ChatGPT区别点
一、DeepSeek大模型原理 架构基础 DeepSeek基于Transformer架构,Transformer架构主要由编码器和解码器组成,在自然语言处理任务中,通常使用的是Transformer的解码器部分。它的核心是自注意力机制(Self - Attention),这个机制允许模型在处理输入序列时,关注序列中不同位…...
Github 2025-03-03 开源项目周报Top14
根据Github Trendings的统计,本周(2025-03-03统计)共有14个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5TypeScript项目4Jupyter Notebook项目3Go项目2JavaScript项目2C++项目2Vue项目1Rust项目1Dify.AI: 开源的LLM应用程序开发平台 创建…...
探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码
文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…...
MAC 本地搭建部署 dify(含 github访问超时+Docker镜像源拉取超时解决方案)
目录 一、什么是 dify? 二、安装 docker 1. 什么是 docker? 2. docker下载地址 三、安装 dify 1. dify下载地址 2.可能遇到问题一: github访问超时 3.下载后完成解压 4.进入到 cmd 终端环境,执行下面三个命令 5.可能遇到…...
扫描纸质文件转pdf---少页数+手机+电脑协作
针对手机上扫描软件扫描文件转pdf要收费的问题,提供一种在页数较少时的免费替代方案 。 实现方法:手机软件的免费功能将文件扫描并保存为图片电脑端在word中将图片拼成文档word转pdf 1.借助于“扫描全能王”APP可以免费扫描文件为图片的功能࿰…...
[KEIL]单片机技巧 01
1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设…...
B站上优质的Java和SpringBoot相关视频教程
Java和SpringBoot相关视频教程 Java大师课 【Java】上部:Java Master Class大师课教程【Java】下部:Java Master Class大师课教程 Spring Boot & React 【Spring Boot & React】Spring Boot和React教程 Spring Boot 【Spring Boot】Spring…...
Spring学习笔记04:spring mvc和Spring Boot之间是什么关系?
Spring MVC 是什么? 想象你开了一家餐厅,顾客(用户)点菜、服务员传话、厨师做菜、最后服务员上菜。Spring MVC 就是规定这套流程的“餐厅管理规则”,专门用于处理网页请求(HTTP)和响应。 核心…...
【JavaEE】线程安全
【JavaEE】线程安全 一、引出线程安全二、引发线程安全的原因三、解决线程安全问题3.1 synchronized关键字(解决修改操作不是原子的)3.1.1 synchronized的特性3.1.1 synchronized的使用事例 3.2 volatile 关键字(解决内存可见性) …...
Centos7源码编译安装Sqlite最新版本
下载源码 https://www.sqlite.org/download.html 复制下载链接,然后用 wget 下载 wget https://www.sqlite.org/2025/sqlite-autoconf-3490100.tar.gz 解压缩编译安装 tar -zxf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefi…...
C++(蓝桥杯常考点)
前言:这个是针对于蓝桥杯竞赛常考的C内容,容器这些等下棋期再讲 C 在DEVC中注释和取消注释的方法:ctrl/ ASCII值(常用的): A-Z:65-90 a-z:97-122 0-9:48-57 换行/n:10科学计数法:eg:…...
java后端开发day24--阶段项目(一)
(以下内容全部来自上述课程) GUI:Graphical User Interface 图形用户接口,采取图形化的方式显示操作界面 分为两套体系:AWT包(有兼容问题)和Swing包(常用) 拼图小游戏…...
iterm2更新后主题报错
报错 .oh-my-zsh/themes/agnoster.zsh-theme:307: parse error near <<<。方法1:更新Oh My Zsh主题(以agnoster为例) 适用场景:使用Oh My Zsh自带主题(如agnoster)时出现语法错误。 备份当前主题…...
C++编程:常见内置算法
C中算法主要是由头文件<algorithm><functional><numeric>组成。 <algorithm>是所有STL头文件中最大的一个算法头文件,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等。 <numeric>体积很小,只包括几个在序列上面…...
【开源-开源C++框架boost和poco的对比】
从各个维度对 Boost 和 Poco 进行对比分析 Boost 和 Poco 的对比 1. 核心定位 Boost: 定位: 高性能、通用性、标准化。特点: 提供底层、高度灵活的模块,许多库已被纳入 C 标准。适用场景: 需要高性能、精细控制的场景(如游戏开发、高频交易、科学计算&a…...
【Web安全方向编程语言学习顺序推荐】
Web安全方向编程语言学习顺序推荐 1. HTML/CSS/JavaScript(基础层)2. Python(工具与自动化层)3. SQL(数据库交互层)4. PHP(传统Web漏洞研究层)5. Ruby(红队工具链层&…...