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

C语言实现单链表

一、什么是单链表

1.链表就是一种在物理存储上各个节点非连续的,随机的,元素的逻辑顺序是通过链表中的指针链接的次序而实现的。

图示:

二、单链表中节点的定义

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

typedef struct node{

        int data;//数据域

        struct node * next//指向下一个节点的指针

}Lnode,*LinkList;//Lnode 表示链表中的一个节点,二*LinkList表示整个链表,也可以表示单链表的头指针。

三、单链表的实现方式

1.带头节点的单链表:

1.头节点是一种不存数据,只存放下一个的地址的特殊节点,我们使用头节点是为了方便单链表接下来的插入与删除等操作。

2.带头节点的单链表的初始化操作

这里可以只用值传递而不用地址传递就可以完成对L头结点的空间开辟,是由于:

LinkList InitSqList(LinkList L){

        L = (Lnode*)malloc(sizeof(Lnode));

        if(L == NULL){

                printf("单链表初始化失败\n");

                return NULL;

        }

        L->data = 0;

        L->next = NULL;

        printf("单链表初始化成功\n");

        return L;

}

//在main函数里调用该函数

int main(){

        L = (Lnode*)malloc(sizeof(Lnode));

}

3.使用头插法创建单链表:

bool CreateListByHead(LinkList L){

    if(L == NULL){

        printf("链表还未初始化\n");

        return false;

    }

    int x;

    printf("请输入你要插入的值\n");

    scanf("%d",&x);

    Lnode* p = L;

    Lnode* node = NULL;

    while(x != 999){

        node = (Lnode*)malloc(sizeof(Lnode));

        node->data = x;

        node->next = p->next;

        p->next = node;

        scanf("%d",&x);

    }

    return true;

   

}

4.使用尾差法创建单链表:

开始:

/*4.2 头插法创建链表*/

bool CreateListByHead(LinkList L){

    if(L == NULL){

        printf("链表还未初始化\n");

        return false;

    }

    int x;

    printf("请输入你要插入的值\n");

    scanf("%d",&x);

    Lnode* p = L;

    Lnode* node = NULL;

    while(x != 999){

        node = (Lnode*)malloc(sizeof(Lnode));

        node->data = x;

        node->next = p->next;

        p->next = node;

        scanf("%d",&x);

    }

    return true;

   

}

5.根据指定位置插入指定元素

p节点开始指向头节点,定义一个int 类型的i变量初始值为0

我们的目标是找到插入位置的前一个节点,比如我们插入的位置为2,我们寻找的目标节点为1节点,接下来让p向后移动一个节点的位置,让i++

发现找到位置了,就让代插入节点插入1节点之后

这样就完成插入算法了。

我们再解释一下while(p != NULL && i < index - 1)循环推出条件,当满足 i < index - 1退出循环就是上面我说的情况,找到位置了,当满足的是p != NULL说明p指向空时依然没有找到你输入的位置说明你输入的位置过大。

/*2.根据指定位置插入指定元素 */

bool InsertElementByIndex(LinkList L,int index,int element){

    if(index < 1){

        printf("插入的位置不合法\n");

        return false;

    }

    Lnode* p = L;//定义一个指针指向头结点

    int i = 0;

    while(p != NULL && i < index - 1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("插入的位置过大\n");

        return false;

    }

    //创建一个新节点

    Lnode* node = (Lnode*)malloc(sizeof(Lnode));

    node->data = element;

    //插入操作

    node->next = p->next;

    p->next = node;

    printf("插入成功\n");

    return true;

}

5.删除指定位置的元素

/*删除指定位置的元素,位置为下表+1,并保存被删除的值*/

bool DeleteElementByIndex(LinkList L,int index,int *element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    if(index < 1){

        printf("删除的位置太小\n");

        return false;

    }

    //定义两个指针,p q

    Lnode* p = L;

    Lnode* q = L->next;

    int i = 1;

    while(q != NULL && i <= index-1){

        p = q;

        q = q->next;

        i++;

    }

    if(q == NULL){

        printf("你输入的位置过大\n");

        return false;

    }

    *element = q->data;

    p->next = q->next;

    free(q);

    printf("删除成功\n");

    return true;

}

6.删除链表中的元素,根据值删除元素,返回删除元素的个数

int DeleteElementByValue(LinkList L,int element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    int count = 0;//记录删除元素的个数

    Lnode* p = L->next;

    Lnode* q = L;

    Lnode* f = NULL;

    while(p != NULL){

        if(p->data == element){

            f = p;

            p = p->next;

            q->next = f->next;

            free(f);

            f = NULL;

            count++;

        }else{

            q = p;

            p = p->next;

        }

       

    }

    printf("删除成功\n");

    return count;

}

7.查找链表中的元素,根据位置index查找对应的元素的值。

/*7,查找链表中的元素,根据位置index查找对应的元素的值。*/

int SelectElementByIndex(LinkList L,int index){

    if(L->next == NULL){

        printf("链表为空\n");

        exit(-1);

    }

    if(index < 1){

        printf("查找的位置太小\n");

        exit(-1);

    }

    //定义一个Lnode类型的指针指向L的头结点后的第一个元素

    Lnode* p = L->next;

    int i = 1;

    while(p != NULL && i <= index - 1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("你输入的位置过大\n");

        exit(-1);

    }

    printf("查找成功\n");

    return p->data;

}

8.修改链表的指定位置的值

/*8.修改链表的指定位置的值*/

bool UpdateElementByIndex(LinkList L,int index,int element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    if(index < 1){

        printf("查找的位置太小\n");

        return false;

    }

    Lnode* p = L->next;

    int i = 1;

    while(p != NULL && i <= index-1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("你输入的位置过大\n");

        return false;

    }

    p->data = element;

    printf("修改成功\n");

    return true;

}

9.求表长

/*9.求表长*/

int ListLength(LinkList L){

    int len = 0;

    Lnode* p = L;

    while(p->next != NULL){

        p = p->next;

        len++;

    }

    return len;

}

10.翻转链表的内容

本题的思想是将链表的头结点与其他节点断开,在进行头插法实现链表内容的翻转。

先让指针p指向1节点,

断开头结点与1节点的链接,让头结点指向空

先让q指向p所指向的位置,再让p指向下一个节点

再让q所指向的节点使用头插法重新插入头结点后的位置

插入后再让指针q指向p,p再向后移动一个节点的位置。

再将q指向的2节点使用头插法进入左边的链表,

再将指针q指向指针p指向的节点,p再向后移动一个节点。

再使用头插法将q所指向的3节点插入左边的节点,

当p为空时,循环停止,这样就实现了链表内容的翻转。

/*10.翻转链表的内容*/

void reverseLinkList(LinkList L){

    if(L->next == NULL){

        printf("链表为空\n");

        return;

    }

    Lnode* p = L->next;

    Lnode* q = NULL;

    L->next = NULL;

    while(p != NULL){

        q = p;

        p = p->next;

        q->next = L->next;

        L->next = q;

    }

}

11.找到链表中的最大值

/*11.找到链表中的最大值*/

int FindMax(LinkList L){

    if(L->next == NULL){

        printf("链表为空\n");

        exit(-1);

    }

    Lnode* p = L->next;

    int max = p->data;

    while(p != NULL){

        if(max < p->data){

            max = p->data;

        }

        p = p->next;

    }

    return max;

}

12.整个代码实现:

#include<stdio.h>

#include<stdlib.h>

#include<stdbool.h>

typedef struct Lnode{

    int data;//单链表中的元素值

    struct Lnode* next;//单链表中指向下一个节点的指针

}Lnode,*LinkList;

/*1.初始化单链表*/

LinkList InitLinkList(LinkList L){

    //1.创建一个头结点并为其开辟空间

    L = (Lnode*)malloc(sizeof(Lnode));

    if(L == NULL){

        printf("创建失败\n");

        return NULL;

    }

    L->data = 0;

    L->next = NULL;

    printf("创建成功\n");

    return L;

}

/*2.根据指定位置插入指定元素 */

bool InsertElementByIndex(LinkList L,int index,int element){

    if(index < 1){

        printf("插入的位置不合法\n");

        return false;

    }

    Lnode* p = L;//定义一个指针指向头结点

    int i = 0;

    while(p != NULL && i < index - 1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("插入的位置过大\n");

        return false;

    }

    //创建一个新节点

    Lnode* node = (Lnode*)malloc(sizeof(Lnode));

    node->data = element;

    //插入操作

    node->next = p->next;

    p->next = node;

    printf("插入成功\n");

    return true;

}

/*3.打印链表*/

void printLinkList(LinkList L){

    if(L->next == NULL){

        printf("链表为空\n");

        return;

    }

    Lnode* p = L->next;

    while(p != NULL){

        printf("%d\t",p->data);

        p = p->next;

    }

    printf("\n");

}

/*4.头插法创建链表*/

bool InsertHead(LinkList L,int element){

    //判断链表为空

    if(L == NULL){

        printf("链表未初始化\n");

        return false;

    }

    //创建一个新节点,并插入到头节点后面

    Lnode* node = (Lnode*)malloc(sizeof(Lnode));

    node->data = element;

    node->next = L->next;

    L->next = node;

    printf("插入成功\n");

    return true;

}

/*4.2 头插法创建链表*/

bool CreateListByHead(LinkList L){

    if(L == NULL){

        printf("链表还未初始化\n");

        return false;

    }

    int x;

    printf("请输入你要插入的值\n");

    scanf("%d",&x);

    Lnode* p = L;

    Lnode* node = NULL;

    while(x != 999){

        node = (Lnode*)malloc(sizeof(Lnode));

        node->data = x;

        node->next = p->next;

        p->next = node;

        scanf("%d",&x);

    }

    return true;

   

}

/*5.尾差法创建链表*/

bool InsertTail(LinkList L,int element){

    if(L == NULL){

        printf("链表还未创建\n");

        return false;

    }

    //创建一个节点

    Lnode* node = (Lnode*)malloc(sizeof(Lnode));

    node->data = element;

    //创建一个指针指向头结点,并移动值最后一个节点。

    Lnode* p = L;

    while(p->next != NULL){

        p = p->next;

    }

    node->next = p->next;

    p->next = node;

    printf("创建成功\n");

    return true;

}

/*6.删除指定位置的元素,位置为下表,并保存被删除的值*/

bool DeleteElementByIndex(LinkList L,int index,int *element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    if(index < 1){

        printf("删除的位置太小\n");

        return false;

    }

    //定义两个指针,p q

    Lnode* p = L;

    Lnode* q = L->next;

    int i = 1;

    while(q != NULL && i <= index-1){

        p = q;

        q = q->next;

        i++;

    }

    if(q == NULL){

        printf("你输入的位置过大\n");

        return false;

    }

    *element = q->data;

    p->next = q->next;

    free(q);

    printf("删除成功\n");

    return true;

}

/*6.2删除链表中的元素,根据值删除元素,返回删除元素的个数*/

int DeleteElementByValue(LinkList L,int element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    int count = 0;//记录删除元素的个数

    Lnode* p = L->next;

    Lnode* q = L;

    Lnode* f = NULL;

    while(p != NULL){

        if(p->data == element){

            f = p;

            p = p->next;

            q->next = f->next;

            free(f);

            f = NULL;

            count++;

        }else{

            q = p;

            p = p->next;

        }

       

    }

    printf("删除成功\n");

    return count;

}

/*7,查找链表中的元素,根据位置index查找对应的元素的值。*/

int SelectElementByIndex(LinkList L,int index){

    if(L->next == NULL){

        printf("链表为空\n");

        exit(-1);

    }

    if(index < 1){

        printf("查找的位置太小\n");

        exit(-1);

    }

    //定义一个Lnode类型的指针指向L的头结点后的第一个元素

    Lnode* p = L->next;

    int i = 1;

    while(p != NULL && i <= index - 1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("你输入的位置过大\n");

        exit(-1);

    }

    printf("查找成功\n");

    return p->data;

}

/*8.修改链表的指定位置的值*/

bool UpdateElementByIndex(LinkList L,int index,int element){

    if(L->next == NULL){

        printf("链表为空\n");

        return false;

    }

    if(index < 1){

        printf("查找的位置太小\n");

        return false;

    }

    Lnode* p = L->next;

    int i = 1;

    while(p != NULL && i <= index-1){

        p = p->next;

        i++;

    }

    if(p == NULL){

        printf("你输入的位置过大\n");

        return false;

    }

    p->data = element;

    printf("修改成功\n");

    return true;

}

/*9.求表长*/

int ListLength(LinkList L){

    int len = 0;

    Lnode* p = L;

    while(p->next != NULL){

        p = p->next;

        len++;

    }

    return len;

}

/*10.翻转链表的内容*/

void reverseLinkList(LinkList L){

    if(L->next == NULL){

        printf("链表为空\n");

        return;

    }

    Lnode* p = L->next;

    Lnode* q = NULL;

    L->next = NULL;

    while(p != NULL){

        q = p;

        p = p->next;

        q->next = L->next;

        L->next = q;

    }

}

/*11.找到链表中的最大值*/

int FindMax(LinkList L){

    if(L->next == NULL){

        printf("链表为空\n");

        exit(-1);

    }

    Lnode* p = L->next;

    int max = p->data;

    while(p != NULL){

        if(max < p->data){

            max = p->data;

        }

        p = p->next;

    }

    return max;

}

int main(){

    LinkList L;

    L = InitLinkList(L);

    CreateListByHead(L);

    printLinkList(L);

    //InsertElementByIndex(L,6,100);

    reverseLinkList(L);

    printLinkList(L);

    int e = 0;

    DeleteElementByIndex(L,5,&e);

    printLinkList(L);

    //printf("最大值为%d\n",FindMax(L));

    // InsertElementByIndex(L,1,10);

    // InsertElementByIndex(L,1,20);

    // InsertElementByIndex(L,1,30);

    // InsertHead(L,10);

    // InsertHead(L,20);

    // InsertHead(L,30);

    // InsertHead(L,40);

    // InsertHead(L,50);

    // printLinkList(L);

    //printf("单链表的长度为:%d\n",ListLength(L));

    // InsertElementByIndex(L,2,1000);

    // InsertTail(L,10);

    // InsertTail(L,20);

    // InsertTail(L,10);

    // InsertTail(L,40);

    // InsertTail(L,10);

    // printLinkList(L);

    // int count = DeleteElementByValue(L,10);

    // printf("被删除的元素个数%d\n",count);

    // printLinkList(L);

    // int element;

    // DeleteElementByIndex(L,2,&element);

    // printf("删除的元素为%d\n",element);

    // printLinkList(L);

    // int e = SelectElementByIndex(L,2);

    // printf("查找的元素值为%d\n",e);

    // UpdateElementByIndex(L,0,1000);

    // printLinkList(L);

}

四、总结:

链表的实现不难,我们在写代码时最好一边写代码一边画图,这样更方便我们理解。

相关文章:

C语言实现单链表

一、什么是单链表 1.链表就是一种在物理存储上各个节点非连续的&#xff0c;随机的&#xff0c;元素的逻辑顺序是通过链表中的指针链接的次序而实现的。 图示&#xff1a; 二、单链表中节点的定义 #include<stdio.h> #include<stdlib.h> #include<string.h>…...

循环神经网络三

一.介绍 在普通的神经网络中&#xff0c;信息的传递是单向的&#xff0c;这种限制虽然使得网络变得更容易学习&#xff0c;单在一定程度上也减弱了神经网络模型的能力。特别是在现实生活中&#xff0c;网络的输出不仅和当前时刻的输入相关&#xff0c;也过去一段时间的输出相关…...

优购电商小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;留言板管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#xf…...

【ARM】v8架构programmer guide(4)_ARMv8的寄存器

目录 4.4Endianness&#xff08;端序或字节序&#xff09; 4.5 改变execution state 4.5.1 Registers at AArch32 4.5.2 PSTATE at AArch32 4.6 NEON 和浮点数寄存器 4.6.1 AArch64中浮点寄存器的组织结构 4.6.2 标量寄存器大小 4.6.3 向量寄存器大小 4.6.4 NEON在AArc…...

Java设计模式详细讲解

目录 设计模式概述 1.1 什么是设计模式1.2 设计模式的类型1.3 设计模式的历史与发展1.4 设计模式在软件开发中的重要性 创建型模式 2.1 单例模式2.2 工厂方法模式2.3 抽象工厂模式2.4 建造者模式2.5 原型模式 结构型模式 3.1 适配器模式3.2 装饰器模式3.3 代理模式3.4 外观模…...

图论------弗洛伊德(Floyd-Warshall)算法

题目描述&#xff1a; 在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的 T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的&#xff01;所以现在他们想要寻找最短的从商店到赛场的路线&#xff0c;你可以帮助…...

C#实现动画效果

在C#中&#xff0c;实现动画效果通常可以使用Windows Forms的Timer类或者使用System.Windows.Media.Animation命名空间下的类&#xff08;如果是WPF应用&#xff09;。以下是一个Windows Forms应用中使用Timer类来创建简单的动画效果的例子。 假设我们有一个窗体&#xff08;F…...

Git 对比 SVN 的区别和优势

引言 版本控制系统&#xff08;VCS&#xff09;是软件开发过程中不可或缺的一部分&#xff0c;它们用于管理代码的变更、协调开发团队的工作。Git 和 SVN&#xff08;Apache Subversion&#xff09;是目前最流行的两个版本控制系统。本文将详细分析 Git 和 SVN 的区别及各自的…...

Qt实现无边框窗口的拖动和缩放

在使用QT创建窗体的时候&#xff0c;为了使窗口美化&#xff0c;通常不使用QT自带的边框。会调用下面函数去除窗体边框。 setWindowFlags(Qt::FramelessWindowHint) 但是有个问题&#xff0c;当去除了QT自带边框后&#xff0c;窗体就变得不能移动了&#xff0c;也不能改变窗口大…...

入门岛2-python实现wordcount并进行云端debug

书生大模型学习 任务&#xff1a; 1.实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS&#xff1a;记得先去掉标点符号,然后把每个单词…...

c语言-链表1

10 链表 一、链表是什么&#xff1f; -- 数据的一种存储方式 -- 链式存储 &#xff08;1&#xff09;线性存储 -- 地址连续 -- 自动开辟&#xff0c;自动释放 -- 默认是线性存储 &#xff08;2&#xff09;链式存储 -- 地址不连续…...

你好! Git——企业级开发模型

企业级开发模型&#xff08;6&#xff09; 一、删除远程分支&#xff0c;git branch -a &#xff08;查看所有本地分支与远程分支&#xff09;还能看到已经删除的分支&#xff0c;怎么解决&#xff1f;二、企业级开发流程2.1 企业级开发流程2.2 系统开发环境 三、Git分支设计模…...

力扣面试150 查找和最小的 K 对数字 最小堆 去重

Problem: 373. 查找和最小的 K 对数字 &#x1f468;‍&#x1f3eb; 参考题解 class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {// 创建一个大小为 k 的结果列表&#xff0c;用于存储和最小的 k 个数对List<Li…...

Oceanbase 执行计划

test100 CREATE TABLE `test100` ( `GRNT_CTR_NO` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同编号, `GRNT_CTR_TYP` varchar(3) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同类型, `COLC_GRNT_IND` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL …...

精品丨模型关系介绍

PowerBI中的模型关系相信小伙伴们都不会感觉到陌生&#xff0c;因为一份优秀的报表无法离开数据模型的支撑。 对比其它BI类工具而言&#xff0c;白茶认为其建模功能才是最为突出的功能点。 模型关系类型 PowerBI中我们常用的模型关系一共包含5类&#xff1a; 一对一关系(1:1) …...

CentOS7 配置 nginx 和 php 方案

配置方案 一、安装软件二、编写配置文件&#xff0c;连接PHP三、引用文件四、测试 鉴于网上教程错综复杂&#xff0c;写下一这篇文章 本教程只需要三步即可 一、安装软件 yum install -y nginx php php-fpm二、编写配置文件&#xff0c;连接PHP 一般情况下在安装完 nginx 后…...

Promise.all全面解析:使用方法与实战技巧

Promise是JavaScript中处理异步操作的重要机制&#xff0c;它提供了一种优雅的方式来处理异步回调&#xff0c;避免了传统回调地狱的问题。而Promise.all作为Promise的一个静态方法&#xff0c;更是在处理多个异步操作时发挥着关键作用。本文将全面解析Promise.all的使用方法&a…...

NLP从零开始------9文本进阶处理之文本相似度计算

1.文本相似度计算简介 在自然语言处理中&#xff0c;经常会涉及度量两个文本相似度的问题。在诸如对话系统和信息减速等中&#xff0c;度量句子或短语之间的相似度尤为重要。在新闻学传媒中应用文本相似度可以帮助读者快速检索到想要了解的报道。 文本相似度的定义式如下所示&a…...

Electron 在 MAC 上的 build 签名应用配置

Electron 在 MAC 上的 build 签名应用配置涉及多个步骤,包括准备开发者账号、生成证书和配置文件、配置环境变量以及使用适当的工具进行签名和公证。以下是一个详细的配置流程: 一、准备开发者账号 首先,你需要在 Apple 开发者网站 注册并拥有一个开发者账号。这个账号将用…...

15 交换机命令行配置

交换机命令行配置 一、交换机命令行基本配置 &#xff08;一&#xff09;配置主机名 Switch>enable Switch#configure terminal Switch(config)#hostname S1&#xff08;二&#xff09;查看配置信息 Switch#show running-config Building configuration...Current confi…...

HGTector2:三小时掌握微生物基因转移检测的终极免费方案

HGTector2&#xff1a;三小时掌握微生物基因转移检测的终极免费方案 【免费下载链接】HGTector HGTector2: Genome-wide prediction of horizontal gene transfer based on distribution of sequence homology patterns. 项目地址: https://gitcode.com/gh_mirrors/hg/HGTect…...

Multisim新手必看:用差分放大电路课设,手把手教你搞定仿真与波形分析

Multisim新手必看&#xff1a;用差分放大电路课设&#xff0c;手把手教你搞定仿真与波形分析 第一次打开Multisim时&#xff0c;满屏的元器件和复杂的参数设置确实容易让人望而生畏。记得我大三做模电课设时&#xff0c;光是找齐差分放大电路需要的元件就花了半小时&#xff0c…...

技术赋能音频自由:qmcdump开源工具破解QQ音乐加密格式全解析

技术赋能音频自由&#xff1a;qmcdump开源工具破解QQ音乐加密格式全解析 【免费下载链接】qmcdump 一个简单的QQ音乐解码&#xff08;qmcflac/qmc0/qmc3 转 flac/mp3&#xff09;&#xff0c;仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump …...

Retinexformer Unleashed: A Deep Dive into Transformer-Based Low-Light Image Enhancement

1. Retinexformer&#xff1a;当Transformer遇见低光图像增强 深夜拍的照片总是又暗又糊&#xff1f;Retinexformer可能是目前最聪明的AI解决方案。这个将Transformer架构与Retinex理论结合的创新模型&#xff0c;在ICCV 2023上以6dB的性能优势碾压传统方法。我实测过它的增强效…...

保姆级教程:手把手教你下载SEED-VIG脑电数据集(附Gitee国内镜像地址)

从零到一&#xff1a;SEED-VIG脑电数据集的完整获取与解析指南 第一次接触SEED-VIG数据集时&#xff0c;我花了整整三天时间才搞明白如何正确下载和解析这个2.9GB的庞然大物。作为研究驾驶疲劳检测的重要资源&#xff0c;这个数据集的价值毋庸置疑&#xff0c;但获取过程却让不…...

Android购物商城APP实战:从零到一构建核心功能模块

1. 项目功能模块拆解与实现路径 一个完整的购物商城APP通常包含四大核心模块&#xff1a;用户系统、商品展示、购物车管理和订单处理。这就像搭建一个实体商店&#xff0c;需要先规划好门面&#xff08;登录注册&#xff09;、货架&#xff08;商品展示&#xff09;、购物篮&am…...

XILINX DDR3 VIVADO(二)时钟配置与调试技巧

1. DDR3时钟配置基础概念 在Xilinx Vivado中使用DDR3 IP核时&#xff0c;时钟配置是最关键也是最容易出错的环节。我刚开始接触DDR3设计时&#xff0c;经常被各种时钟信号搞得晕头转向。后来才发现&#xff0c;只要理解清楚三个核心时钟信号&#xff0c;问题就解决了一大半。 首…...

【实战指南】ComfyUI-Florence2模型加载问题疑难解决:从异常排查到稳定运行的实践指南

【实战指南】ComfyUI-Florence2模型加载问题疑难解决&#xff1a;从异常排查到稳定运行的实践指南 【免费下载链接】ComfyUI-Florence2 Inference Microsoft Florence2 VLM 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Florence2 在使用ComfyUI-Florence2视觉…...

精密五金结构件配套

一、我们能为机器人行业提供什么&#xff1f;专注机器人非核心精密五金结构件配套&#xff0c;面向&#xff1a;工业机器人&#xff5c;协作机器人&#xff5c;人形机器人&#xff5c;AGV/AMR&#xff5c;末端执行器&#xff5c;减速器 / 伺服 / 模组&#xff5c;自动化集成工作…...

FFM Arena内存管理失效引发Native OOM?深度拆解Java 22 JEP 464中Scoped Memory Model的3种安全模式切换策略

第一章&#xff1a;FFM Arena内存管理失效引发Native OOM&#xff1f;深度拆解Java 22 JEP 464中Scoped Memory Model的3种安全模式切换策略Java 22 引入的 JEP 464 — Scoped Memory Model&#xff0c;旨在为 Foreign Function & Memory API&#xff08;FFM&#xff09;提…...