C语言简单链表详细步骤详解

2023-05-16

                 +《链表——>小阿豪带你写链表》!!!!进入正文
1.首先,先想好自己要创建的链表格式以及最后的的显示界面!!!
2.主函数尽量放到后面写,前面写功能函数,在调用主函数之前要声明一下!!
3.先写链表主结构体,再写成员结构体,将成员结构体嵌入主结构体!!!
~4.可以给你所需要的功能创建一个菜单,用switch-case语句实现功能!!!
5.注意功能函数的放置次序,要不然会报错,必须声明!!!

干货开始!!-》》》此处为伪代码内容
例:
0.先定义好你的成员结构体和主结构体//每一步都会用到!!!!

struct student//定义学生信息系统结构体将其放到数据域中进行相应操作
{
    char name[20];
    int num;
    int math;
};
struct node {             
    struct student data;             //数据域,用来存放数据
    struct node* next;    //指针域,用来存放下一个结构体的地址
};

1.struct node开始创建一个主结构体,//一个链表结构体至少有两个域->

 //struct student data;             //数据域,用来存放数据
    //struct node* next;    //指针域,用来存放下一个结构体的地址

2.struct node* createList()//面向对象结构体类型//开始创建一个链表,创建链表前先创建一个空的指向指针节点,这是给链表节点进行初始化!!

    //该函数功能创建一个链表,给出一个链表开头空节点NULL
    //使用malloc函数去动态申请内存空间,标识符定义为newList(自己随便想一个标识符去定义,是给该链表申请一个结构体类型的内存)//struct node* newList = (struct node*)malloc(sizeof(struct node));
   //这一步不必写成员结构体,因为头空节点就是用来存放头节点的地址的,利用头插法每当插入一个元素就让头空节点去指向这个插入节点的地址(即这个新的头节点地址)!!!!
   //newList->next = NULL;//让该链表头空节点指向0地址NULL,下一次创建好链表头节点(创建链表节点,给链表第一个数据节点为NULL)后将头节点地址赋给它!!!
   //因为函数面向对象,创建完成后要return返回newList;
   //头空节点创建完成》》》》每当做完一个功能试运行调试!!!

3.创建链表的第一个数据节点,并让头空节点指向它(注意头空节点永远指向头节点地址,临时操作改变之后也一定要连接回去)!!

  //将要创建的成员结构体类型用开始结构体创建时候的标识符号名形参传入
     //同样malloc函数去申请空间(这次的内存是给成员结构体申请的!),将该函数放在循环中即可连续添加成员!!!
     struct node* newNode = (struct node*)malloc(sizeof(struct student));
     //newNode->data=data;//让链表的data成员去标识你自己定义的成员结构体(即数据域!)
     //
     //newNode->next = NULL;//指针为空//尾巴节点的next永远指向空(即前闭后开)!!//该节点用头插法插入的话等下一个节点插入与他相连接之后就没它什么事了!!
     //因为函数面向对象,插入完成之后同样return返回要放在newList里面的这个节点newnode;

4.打印函数提前写//为了调试方便》》》

 //void printfList(struct node* headNode)//把链表LIst传入该函数进行打印
   //struct node* pMove = headNode->next;定义一个主要结构体类型变量pMove把headNode(即->头空节点只不过是定义形参headNode来接收了newList)把头空节点的next(这个next里面存放的就是第一个节点的地址)赋给pMove,让他从第一个节点开始打印
   //自行设置要打印的格式,//pMove = pMove->next;将下一个节点的地址赋给当前游标pMove//放在循环里面让它一个一个成员遍历打印!!!
   //配合if语句调用主函数即可返回菜单!!!

5.插入内容

  我给你写的直观一点,插入函数和插入内容没有放在一个函数中->认真看!!!
         1.先写一个插入函数去调用链表节点创建函数createNode()插入节点
                 void charu(struct node* headNode, struct student data)
               //面向过程函数,使用形参传入要插的链表和要插入的数据
                   struct node* newNode = createNode(data);//调用创建节点函数去给要插入的数据申请一个位置来存放插入数据!!!
                // newNode->next = headNode->next; 把头空节点的next的新插入节点相连!!!
                //headNode->next = newNode;再把新节点地址放到头空节点的next里面去!!!!
         2.struct node* List = createList();//创建链表List;//在开始写添加成员函数时先定义一下你在整个过程中要用到的链表,此步调用创建链表函数来做!!!!!
           // 这步写添加成员函数,利用循环调用插入函数每当输入好一个成员信息就按回车连接到链表里面去作为新的头节点,每次缓冲区都留有一个回车符用setbuf(stdin,NULL);函数来清空缓冲区

6.删除内容!!!

  // void shanchu(struct node* headNode, int num1)//面向过程void类型,创建删除函数
       //struct node* posnode = headNode->next;/*posnode相当于一个主的临时结构体变量指针,把头节点指向指针地址给临时结构体变量让他从第一个开始循环*/
       //struct node* posnodeFront = headNode;//同时也要定义一个主的结构体类型变量指针来存放主的临时结构体变量地址;
       //先判断头空指针的next是否指向NULL,是则链表为空,否则去进入到循环遍历,找到该成员则把该节点next的值赋给它前一个结点的next,并用free();函数去释放掉要删除节点的内存
       //在循环中寻找每当遍历下一个成员时,先posnodeFront = posnode;先把当前临时节点指针地址给前一个,后posnode = posnodeFront->next;再把给过去的next里面存放的下一个结点的地址给当前临时节点指针,进而去循环!!!
       //注意指针必须赋的是地址,而不是具体的值!!!!!

7.修改内容与第六步同理只不过不释放空间不改变指针的连接,找到成员之后改掉要修改的对应成员体结构中的内容就好了!!!!!

8.主函数开始写好框架,每添加一个功能函数就放到选择函数里面去!!!!

》》》》》接下来看实例代码》》建议在codeblocks中运行,无报错!!!
代码1:学生信息管理系统——>

```cpp
#include<stdio.h>
#include<stdlib.h>
void choice();
int main();
void shanchu(struct node* headNode, int num1);
void menu()
{
    printf("\t\t\t***学生信息管理系统***\n");
    printf("\t\t\t       -》菜单《-     \n");
    printf("\t\t\t**********************\n");
    printf("\t\t\t*     1.插入内容     *\n");
    printf("\t\t\t*     2.显示内容     *\n");
    printf("\t\t\t*     3.删除内容     *\n");
    printf("\t\t\t*     4.修改内容     *\n");
    printf("\t\t\t*     5.退出系统     *\n");
    printf("\t\t\t*                    *\n");
    printf("\t\t\t*   制作人:小阿豪   *\n");
    printf("\t\t\t*    ^-^  ^-^  ^-^   *\n");
    printf("\t\t\t**********************\n\n");

}

struct student//定义学生信息系统结构体将其放到数据域中进行相应操作
{
    char name[20];
    int num;
    int math;
};
struct node {             //一个链表结构体至少有两个域
    struct student data;             //数据域,用来存放数据
    struct node* next;    //指针域,用来存放下一个结构体的地址
};

//节点初始化
struct node* createList()//面向对象结构体类型//开始创建一个链表,创建链表前先创建一个空的指向指针节点
{
    struct node* newList = (struct node*)malloc(sizeof(struct node));
   // newList->data = struct student data;
    newList->next = NULL;
    return newList;
};
//创建链表节点,给链表第一个数据节点
struct node* createNode(struct student data)//面向对象结构体类型
{
    struct node* newNode = (struct node*)malloc(sizeof(struct student));
    newNode->data=data;//迭代器???
    newNode->next = NULL;//指针为空
    return newNode;
};

//打印内容
void printfList(struct node* headNode)//面向过程void类型
{
    struct node* pMove = headNode->next;
    printf("学号\t姓名\t数学成绩\n");//制表输出
    while (pMove)
    {
        printf("%d\t%s\t%d\n",pMove->data.num, pMove->data.name, pMove->data.math);
        pMove = pMove->next;
    }
    printf("\n");
    getchar();
    printf("是否要返回菜单(Y)退出(N)\n");
    char ok;
    scanf("%c",&ok);
    if(ok=='Y'||ok=='y'){
        main();
    }
    else exit(1);
}

//插入函数
void charu(struct node* headNode, struct student data)//面向过程void类型
{
    struct node* newNode = createNode(data);
    newNode->next = headNode->next;//headNode->next存放的是第一个节点的地址,
    headNode->next = newNode;
};
struct node* List = createList();//创建链表List;
  struct student info;//定义一个struct student变量info
//插入内容
void zengjia()
{

        while(1)//给一个循环插入
        {
            printf("请输入学生的姓名 学号 数学成绩:");
            getchar();
            scanf("%s%d%d",info.name,&info.num,&info.math);
            charu(List,info);//到链表里面头插法插入一个student结构体
            printf("插入成功!\n");
            printf("是否要继续(Y),返回菜单输入M\n");
            setbuf(stdin,NULL);//清空缓冲区
            int choice=getchar();//是否要继续插入数据
            if(choice=='m'||choice=='M'){
               main();
            }
        }
}

//删除内容
void shanchu(struct node* headNode, int num1)//面向过程void类型
{
    struct node* posnode = headNode->next;/*posnode相当于一个临时结构体变量,
                                          把头节点指向指针地址给临时结构体变量让他从第一个开始循环*/
    struct node* posnodeFront = headNode;
    if (headNode->next == NULL) {          //用头指针判读链表是否为空(即headnext->是否为NULL
        printf("链表为空不能删除!\n");
    }
    else {
        while (posnode->data.num != num1) {  //循环条件是否循环到了要删除的节点
            posnodeFront = posnode;         //posnode相当于一个临时结构体变量,把挨着找的结构体地址给这个临时的结构体
            posnode = posnodeFront->next;   /*再把之前那个结构体里面的下一个结构体的地址
                                               给posnode让它成为当前结构体,好在下一轮继续循环下一个结构体变变量*/
            if (posnode == NULL) {
                printf("没有找到该学生信息!\n");
                system("pause");
                getchar();
                printf("是否要返回菜单(Y)退出(N)\n");
                char ok;
                scanf("%c",&ok);
                if(ok=='Y'||ok=='y'){
                    main();
                }
                else exit(1);
            }
        }
        posnodeFront->next = posnode->next;//让最后一个结构体指针指向NULL
        free(posnode);//释放要删除节点的内存
        printf("删除成功!\n");
    }
    printf("是否要返回菜单(Y)退出(N)\n");
    char ok;
    scanf("%c",&ok);
    if(ok=='Y'||ok=='y'){
        main();
    }
    else exit(1);
};
//修改内容
void xiugai(struct node* headNode, int num1)//面向过程void类型
{
    struct node* posnode = headNode->next;/*posnode相当于一个临时结构体变量,
                                          把头节点指向指针地址给临时结构体变量让他从第一个开始循环*/
    struct node* posnodeFront = headNode;
    if (headNode->next == NULL) {          //用头指针判读链表是否为空(即headnext->是否为NULL
        printf("链表为空不能修改!\n");
    }
    else {
        while (posnode->data.num != num1) {  //循环条件是否循环到了要删除的节点
            posnodeFront = posnode;         //posnode相当于一个临时结构体变量,把挨着找的结构体地址给这个临时的结构体
            posnode = posnodeFront->next;   /*再把之前那个结构体里面的下一个结构体的地址
                                               给posnode让它成为当前结构体,好在下一轮继续循环下一个结构体变变量*/
            if (posnode == NULL) {
                printf("没有找到该学生信息!\n");
                system("pause");
                getchar();
                printf("是否要返回菜单(Y)退出(N)\n");
                char ok;
                scanf("%c",&ok);
                if(ok=='Y'||ok=='y'){
                    main();
                }
                else exit(1);
            }
        }
    printf("该学生信息为:\t%d\t%s\t%d\n",posnode->data.num,posnode->data.name,posnode->data.math);
    printf("请输入修改之后学生的姓名 学号 数学成绩:");
    scanf("%d%s%d",&posnode->data.num,posnode->data.name,&posnode->data.math);
//        posnode->data.name=pos.name;
//        posnode->data.num=pos.num;
//        posnode->data.math=pos.math;
        printf("修改成功!\n");
        system("pause");
        main();
    }
};


//选择功能
void choice()
{
    int xuhao;
    printf("请输入你选择的序号:");
    scanf("%d",&xuhao);
    switch(xuhao)
    {
    case 1:
        zengjia();
        break;
    case 2:
         printfList(List);//打印函数打印链表
        break;
    case 3:
    printf("请输入你要删除的学生编号:");
    scanf("%d",&info.num);//直接放到了一个结构体中将数字
    shanchu(List,info.num);//删除链表里学号为num的那个人
        break;
    case 4:
    printf("请输入你要修改信息的学生编号:");
    scanf("%d",&info.num);//直接放到了一个结构体中将数字
    xiugai(List,info.num);
        break;
    case 5:
        printf("感谢您的使用!下次再见 》》》\n");
        exit(1);
        break;
    default:
        printf("没有该功能!\n");
        break;
    }
}

int main()
{

    //struct node* posnode;
    menu();
    choice();
    system("pause");//按任意键继续
    return 0;
}

```cpp
代码2:洗脚城VIP会员系统
#include<stdio.h>
#include<stdlib.h>
int main();
void meun()
{
    printf("\t\t\t              >洗脚城VIP会员系统<                \n");
    printf("\t\t\t*************************************************\n");
    printf("\t\t\t*                                               *\n");
    printf("\t\t\t*                  1.添加会员                   *\n");
    printf("\t\t\t*                  2.显示会员                   *\n");
    printf("\t\t\t*                  3.会员充值                   *\n");
    printf("\t\t\t*                  4.解除会员                   *\n");
    printf("\t\t\t*                  5.退出系统                   *\n");
    printf("\t\t\t*                              制作人:小阿豪   *\n");
    printf("\t\t\t*************************************************\n");
}

 struct member       //成员信息结构体
 {
     int num;
     char name[20];
     int money=0;
 };
 struct xjc            //洗脚城结构体
 {
     struct member data;
     struct xjc *next;  //指向下一个结构体

 };
 struct xjc *createList()//洗脚城迭代器,创建链表,给予一个头部空节点
 {
     struct xjc *newList=(struct xjc*)malloc(sizeof(struct xjc));
     newList->next=NULL;
     return newList;

 };

 struct xjc *createNode(struct member data)//会员信息迭代器,创建链表的第一个节点,将其连到空节点//信息都是存在这里面,所以要有形参接收
 {
     struct xjc *newNode=(struct xjc*)malloc(sizeof(struct xjc));
     newNode->data=data;
     newNode->next=NULL;
     return newNode;
 };
 struct xjc *List=createList();

 //打印函数
 void printfList(struct xjc *headNode)
 {
     struct xjc *_Move=headNode->next;//next存放的为第一个节点
     printf("\t会员编号\t姓名\t余额\n");
     if(_Move==NULL){
        printf("\n\t还没有添加会员信息哦!!\n");
     }else{
         while(_Move){
                printf("\t%d\t\t%s\t%d\n",_Move->data.num,_Move->data.name,_Move->data.money);
                _Move=_Move->next;
         }
     }
     printf("\n");
     getchar();
     printf("是否要返回菜单(Y)退出(N)\n");
     char ok;
     scanf("%c",&ok);
     if(ok=='Y'||ok=='y'){
        main();
    }
     else exit(1);
 }

 //插入函数

 void charu(struct xjc*headNode,struct member data)
 {
     struct xjc*newnode=createNode(data);
     newnode->next=headNode->next;
     headNode->next=newnode;
 }

 struct member info;
 //插入会员
 void zengjia()
 {
     while(1){
         printf("请输入你要添加的会员编号 姓名 金额:");
         scanf("%d%s%d",&info.num,info.name,&info.money);
         charu(List,info);
         printf("添加成功!\n");
         getchar();
         printf("是否要返回菜单(Y)继续添加(N)\n");
         char ok;
         scanf("%c",&ok);
         getchar();
         if(ok=='y'||ok=='Y'){
            main();
         }else continue;
     }


 }

//会员充值
void chongzhi(struct xjc*headNode,int tnum,int tmoney)
{
    struct xjc*posNode=headNode->next;
    struct xjc*posNodefront=posNode;
    if(posNode==NULL){
        printf("还没有添加会员!\n");
        main();
    }else{
            while(posNode->data.num!=tnum){
                posNodefront=posNode;
                posNode=posNodefront->next;
                 if (posNode == NULL) {
                    printf("没有找到该会员信息!\n");
                    system("pause");
                    getchar();
                    printf("是否要返回菜单(Y)退出(N)\n");
                    char ok;
                    scanf("%c",&ok);
                    if(ok=='Y'||ok=='y'){
                        main();
                    }
                    else exit(1);
            }
        }
            posNode->data.money=posNode->data.money+tmoney;
            printf("充值成功!\n");

        printf("是否要返回菜单(Y)退出(N)\n");
        setbuf(stdin,NULL);
        char ok;
        scanf("%c",&ok);
        if(ok=='y'||ok=='Y'){
                printf("iavdj\n");
            main();
        }else exit(1);
    }
}

//删除会员
void shanchu(struct xjc*headNode,int num)
{
    struct xjc*posnode=headNode->next;
    struct xjc*posnodefront=headNode;
    if(headNode->next==NULL){
        printf("还未添加会员,不能删除!\n");
    }else{
        while(posnode->data.num!=num){
            posnodefront=posnode;//把地址给另一个变量
            posnode=posnodefront->next;//让临时变量指向他自己里面存的下一个域的地址
            if(posnode=NULL){
                printf("没有找到该会员的信息!\n");
                system("pause");
                getchar();
                printf("是否要返回菜单(Y)退出(N)\n");
                char ok;
                scanf("%c",&ok);
                if(ok=='Y'||ok=='y'){
                    main();
                }
                else exit(1);
            }
        }
        posnodefront->next=posnode->next;
        free(posnode);
        printf("解除会员成功!\n");
    }
    printf("是否要返回菜单(Y)退出(N)\n");
    setbuf(stdin,NULL);
    char ok;
    scanf("%c",&ok);
    if(ok=='Y'||ok=='y'){
        main();
    }
    else exit(1);
}
void choice()
{
    printf("请输入你要选择的功能序号:");
    int xuhao;
    scanf("%d",&xuhao);
    switch(xuhao)
    {
    case 1:
        zengjia();
        break;
    case 2:
        printfList(List);
        break;
    case 3:
        printf("请输入你要充值的会员编号 充值金额:");
        int tmoney;
        int tnum;
        scanf("%d%d",&tnum,&tmoney);
        chongzhi(List,tnum,tmoney);
        break;
    case 4:
        int num;
        printf("请输入你要解除的会员编号:");
        scanf("%d",&num);
        shanchu(List,num);
        break;
    case 5:
        exit(1);
        break;
    default:
        printf("没有该功能!\n");
        break;
    }

}

int main()
{
    meun();
    choice();
    system("pause");
    return 0;
}

》》》》》干货到此结束》》》请多多支持与分享》》
作者:爱写代码的阿豪吖!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言简单链表详细步骤详解 的相关文章

  • Jetson nano烧录与简介

    Jetson nano 烧录教程 文章目录 Jetson nano 烧录教程 Jetson nano 简介1 Jetson Nano 接口介绍2 盒内包含3 不包含的物品 xff08 额外购入 xff09 4 Jetson nano的三种供
  • 51单片机-定时器(简易时钟的实现)

    文章目录 前言一 定时器的功能以及定时器的结构定时器的功能定时器的结构 二 定时器的控制工作模式寄存器TMOD控制寄存器TCON写代码来初始化定时器 三 定时器引发中断简易时钟主程序main c延时函数Delay c控制LCD162模块LC
  • 用于评估婴儿认知发展的IMU内嵌式玩具

    0 5岁是神经发育的敏感时期 xff0c 对身心健康至关重要的EF xff08 执行功能 Executive functions xff09 会在这个时期出现 在现代临床和研究实践中 xff0c 编码员通过手动标记视频中婴儿在使用玩具或社交
  • yolo+ocr集装箱字符识别(pytorch版本)

    前言 这个是我们 的大创项目 当我们拿到一份数据集 xff0c 首先就是要对整个项目有个较为清晰的认识 xff0c 整体的思路是什么 xff0c 难点在哪 xff0c 怎么部署和实现 1 整体的思路 xff1a 先通过目标检测网络 xff0
  • ROS话题通信实现发布接收以及vscode编译配置(五)C++版本

    在ROS中每一个功能点都是一个单独的进程 xff0c 每一个进程都是独立运行的 ROS是进程 xff08 也称为Nodes xff09 的分布式框架 因为这些进程甚至还可分布于不同主机 xff0c 不同主机协同工作 xff0c 从而分散计算
  • CMakeList

    目录 1 简介 2 常用命令 2 1 指定 cmake 的最小版本 2 2 设置项目名称 2 3 设置编译类型 2 4 指定编译包含的源文件 2 4 1 明确指定包含哪些源文件 2 4 2 搜索所有的 cpp 文件 2 4 3自定义搜索规则
  • 多旋翼飞行器设计与控制(二)—— 基本组成

    多旋翼飞行器设计与控制 xff08 二 xff09 基本组成 一 机架 1 机身 指标参数 xff1a 重量 xff1a 尽可能轻轴距 xff1a 外圈电机组成圆的直径材料 xff1a 冲碳纤维就完了布局 xff1a 2 起落架 作用 xf
  • 多旋翼飞行器设计与控制(六)—— 动态模型和参数测量

    多旋翼飞行器设计与控制 xff08 六 xff09 动态模型和参数测量 一 多旋翼控制模型 刚体运动学模型 跟质量与受力无关 xff0c 只研究位置 速度 姿态 角速度等参量 xff0c 常以质点为模型 刚体动力学模型 它与一般刚体动力学模
  • 多旋翼飞行器设计与控制(七)—— 传感器标定和测量模型

    多旋翼飞行器设计与控制 xff08 七 xff09 传感器标定和测量模型 一 三轴加速度计 三轴加速度计是一种惯性传感器 xff0c 能够测量物体的比力 xff0c 即去掉重力后的整体加速度或者单位质量上作用的非引力 当加速度计保持静止时
  • 【STM32】stm32通过地址操作寄存器

    stm32通过地址操作寄存器 0x01 stm32数据类型所占字节数0x02 如何查看寄存器地址 xff08 基地址 43 偏移地址 xff09 0x03 操作寄存器地址控制LED闪烁 xff08 代码 xff09 0x04 通过定义结构体
  • ARM裸机开发——启用SDRAM的按键中断控制灯实验

    写在前面 本文承接前文嵌入式系统学习 嵌入式系统 Linux环境搭建和LED灯闪烁实验 以S3C2440A作为开发平台 xff0c 以Linux中ARM Linux gcc交叉编译器作为编译环境进行学习 xff0c 由于本课程为单片机基础的
  • 二维vector

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s
  • 13.request-session,验证码

    使用session使得请求变成一个对象 注意登录页面隐藏的参数 爬取古诗文登录页面 span class token keyword import span requests span class token keyword from sp
  • STM32-串口通信(串口的接收和发送)

    文章目录 STM32的串口通信一 STM32里的串口通信二 串口的发送和接收串口发送串口接收 三 串口在STM32中的配置四 串口接收的两种实现方式1 需要更改的地方2 查询RXNE标志位3 使用中断 总结 STM32的串口通信 本文在于记
  • quick sort(c++)以及k选取

    include lt iostream gt include lt vector gt using rank 61 int using namespace std int dash 61 0 int swap vector lt int g
  • STLINK CONNECTION ERROR 问题的解决

    打开STLINK UTILITY 连接芯片也连接不上 在settings里面 选择这个连接模式 xff0c 按下芯片复位键的同时 xff0c 点击连接 st link的灯闪烁红蓝相间的光表示连接成功 松开芯片reset xff0c 既连接成
  • 解决ros2安装出现的问题

    Cannot locate rosdep definition for python3 pytest 解决方法是输入弹幕命令 然后输入安装功能依赖的命令 如果有占用进程问题 xff0c 就重启 http t csdn cn WwqJa
  • conda activate 出错

    问题及解决办法 1 使用conda activate出错 在cmd中使用 conda bat activate 进入环境后在进行操作 2 conda install出错 xff0c 使用pip install 3 在cmd 中使用tenso
  • 树莓派4b 安装ubuntu20.04server和图形化界面遇到的问题

    树莓派安装图形界面参考教程 树莓派4b安装Ubuntu 18 04系统及图形桌面 树莓派4B安装 ubuntu20 04 amp VNC远程桌面 amp 安装ROS noetic 树莓派4b安装Ubuntu和ROS的完整爬坑记录 2021年

随机推荐

  • 【STM32】串口接收任意字符串

    目录 前言cube配置usart h xff1a usart cmain xff1a 效果 前言 之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的 xff0c 他接收到换行符就完蛋了 花了点时间深入研究了一下hal库的串
  • 使用封装的axios发送请求

    使用封装的axios发送请求 1 src api api js 定义请求路由方法 span class token function import span URLS from span class token string 39 conf
  • STM32串口驱动

    首先了解串口通信的一些基本原理 xff1a 串口通信 xff1a 串口通信是指数据通过一条数据线 xff08 或者两条差分线 xff09 一位接着一位的传输出去 串口通信的优点是占用硬件资源少 xff0c 且传输距离较远 xff0c 缺点是
  • IIC 驱动OLED

    IIC总线可以驱动很多器件 xff0c 比较常见的有OLED EEPROM存储器 xff08 AT24C02 xff09 温度传感器 xff08 LM75A xff09 温湿度传感器 xff08 DHT11 xff09 等 有关IIC总线协
  • Stm32-使用TB6612驱动电机及编码器测速

    这里写目录标题 起因一 电机及编码器的参数二 硬件三 接线四 驱动电机1 TB6612电机驱动2 定时器的PWM模式驱动电机 五 编码器测速1 定时器的编码器接口模式2 定时器编码器模式测速的原理3 编码器模式的配置4 编码器模式相关代码5
  • CAN总线协议入门基础原理

    CAN 是 Controller Area Network 的缩写 xff08 以下称为 CAN xff09 xff0c 是 ISO 1 国际标准化的串行通信协议 CAN 通过 ISO11898 及 ISO11519 进行了标准化 xff0
  • SPI总线协议基本原理及相关配置

    单片机应用中 xff0c 最常用的通信协议主要有三个 xff0c 即USART IIC和SPI 关于前两个的介绍在之前文章学习过 xff0c 这次介绍一下第三个通信协议 SPI SPI Serial Peripheral Interface
  • 利用定时器的输出比较功能产生PWM驱动舵机

    一 定时器基本原理 首先我们来看一下ST官方给出的关于定时器的相关介绍 xff1a xff08 以STM32F103C8T6为例 xff09 STM32F103C8T6 含有 4 个 16 位定时器 xff0c 分别是一个高级定时器 TIM
  • ST-LINK固件升级

    关于st link固件升级注意的问题 在下载调试的过程中 xff0c 程序可能由于st link版本过旧而提示 command not supported 的错误 xff0c 这就要求我们升级st link固件才可以正常下载 但是在升级的过
  • 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2

    1 安装系统 按照商家给的资料安装 xff0c 将Ubuntu18 04LTS镜像拷贝到tf卡中 xff0c 插上jetson nano就可以安装了 2 系统设置 进入系统我先把系统语言设置为中文 xff0c 在右上角的设置中找到系统设置中
  • 双目摄像头(CSI-IMX219)的标定

    1 介绍 网上关于这类标定有挺多教程的 xff0c 但由于这个摄像头的特殊性 xff0c 所以不可能完全安装教程来走 目前来说有3种标定方法 xff1a ROS操作系统来标定 matlab标定 opencv标定 这三种方法我先试了用ROS来
  • 小学生学AD16(入门级别,看这篇就够了)

    1 软件安装 xff1a AD16的安装我就不多介绍了 xff0c csdn一搜一大把 要学一个软件 xff0c 那么软件安装是必经之路 xff0c 不要认为软件安装不重要 xff08 如果你的安装完之后桌面没快捷方式 xff0c 那么可以
  • Arduino串口绘图器双通道绘制

    Serial print val Serial print 34 34 Serial println muBiao 其实只用在两个变量之间加个 xff0c 就行了 参考网址 https www norwegiancreations com
  • 关于神舟笔记本TX8连副屏经常蓝屏的问题

    大概率是3060显卡驱动的问题 xff0c 可以试试重新安装显卡驱动 若还是不行就换个接口 xff0c 不要用hdim的接口 xff0c 那个是直接连3060的 换剩下两个的minidp接口其中一个 xff0c 第一个不要接 xff0c 那
  • 51单片机入门(小学生都能学会)

    序 xff1a 时隔一年 xff0c 我终于从二年级到三年级了 xff01 由于小学三年级这学期要学单片机 xff0c 故写下这篇笔记留下些什么 由于自己也是新手 xff0c 欢迎各位指出本文的各种错误 1 什么是51单片机 为什么要说这个
  • 解决使用WinScp连接Ubantu系统失败的问题---SSH无法连接

    起因 为了互通Linux系统和Windows系统的文件 xff0c 以更好的实现文件管理和资源共享 所以在查阅资料后 xff0c 使用WinScp xff0c WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端 它的
  • 小学生51系列之基础知识

    1 单片机的基本结构 说到基本结构 xff0c 就是指51单片机的硬件组成 51单片机由中央处理器CPU 储存器 定时器 I O端口 组成 其中储存器包含数据储存器 xff08 RAM xff09 和程序储存器 xff08 ROM xff0
  • ros 接入Livox Mid-70

    最近在研究3d避障激光 大疆Livox mid 70 xff0c 记录下接入过程 环境信息 xff1a Ubuntu 18 04 ros melodic 1 livox view 点云可视化 xff08 1 xff09 根据livox mi
  • ROS+opencv实践-二维码识别

    一 安装二维码识别的功能包 sudo apt span class token operator span get install ros span class token operator span melodic span class
  • C语言简单链表详细步骤详解

    43 链表 gt 小阿豪带你写链表 xff01 xff01 xff01 xff01 进入正文 span class token number 1 span 首先 xff0c 先想好自己要创建的链表格式以及最后的的显示界面 xff01 xff