0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

应用开发中结构体和链表的关系是怎样的

玩转单片机 来源:玩转单片机 作者:玩转单片机 2022-12-12 10:57 次阅读

不知道各位读者是怎么理解链表的,还有就是链表和结构体的关系?最近开发的项目资源不是很紧凑,就用了面向对象编写,就大量的使用到结构体,有时还会配合共同体嵌套使用,顺便回顾了一些结构体的使用,这里主要简单回顾结构体和链表的关系;

链表在RTOS上比较常见,这里会把复杂的东西简单化,这也是为啥有些推文的文字很少的原因,码农的产出就是代码,核心就是看相关代码;链表分单链表和双链表,核心都差不多的,就用单链表做展示;

| 定义节点

链表的最小单位就是节点,节点的定义就是链表的基础,下面展示一些定义的小案例:

//正确定义方式之一
struct node
{
    unsigned char data;
    struct node *next;
};


//错误定义方式之一
typrder struct node
{
    unsigned char data;
    node_t *next;
}node_t;

代码都是一行一行执行的,如果没有提前声明调用的话,代码编译阶段就会报错,同样的,类型定义比类型调用使用晚也会报错;有些初学者会对结构体使用同名结构体会有疑问,其实把同名的结构体换个思路,上面的第二行是不是定义了一个struct node类型的数据,结构体成员是不是变量类型+变量名,是不是符合结构体的基本使用,所有这样的用法是合法的;

| 链接成表

链表的最小单位就是节点,那么多定义几个节点,然后就让它们链接起来,那么就形成了链表,那么这条“链”是啥呢,有时怎么把它们关联起来的呢?学过链表的同学就很清楚,就是节点中的同名结构体指针,这个指针就像电话号码,直接通过电话号码就能找到对应的人,同理也可以通过指针找到对应的节点;

申请内存的坑,申请的内存一定要强制转换类型,不强制转换默认是返回一个任意类型的指针(void *),不强制转换类型编译也会出错:

int main()
{
inttemp=10;
// 没有强制转换类型,编译报错
  int *p = malloc(siezof(temp))
}

列个完整的小程序,看完基本就学会了链表:

#include "stdio.h"
#include "stdlib.h"


typedef struct node
{
    unsigned char data;
    struct node *next;
}node_t;


int main()
{
  // 创建几个节点
  node_t* node1=(node_t*)malloc(sizeof(node_t));
  node_t* node2=(node_t*)malloc(sizeof(node_t));
  node_t* node3=(node_t*)malloc(sizeof(node_t));
  
  // 初始数据
  node1->data = 1;
  node2->data = 2;
  node3->data = 3;
  
  // 链接成表
  node1->next =  node2;
  node2->next =  node3;
  node3->next =  node1;
  
  // 打印数据
  printf("data:%d
", node1->data);          // 节点1的数据 
  printf("data:%d
", node1->next->data);        // 节点2的数据
  printf("data:%d
", node1->next->next->data);    // 节点3的数据
  printf("data:%d
", node1->next->next->next->data);  // 节点1的数据
  
  // 释放内存 
  free(node1); 
  free(node2);
  free(node3);
}

链表的增删改查本质就是对节点中的指针操作,以及节点的创建和释放,基本不是什么大问题;看到这应该对链表基础知识没有疑问了吧,觉得有收获的同学动动小手指点个赞吧,我是Noah,我们下篇推文再见!

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118798
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66800

原文标题:通俗|结构体与链表

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面存在一些显著的差异。本文将详细探讨这些差异以及它们的
    的头像 发表于 02-21 11:30 266次阅读

    数据结构:删除有序链表的重复节点

    给定一个有序单链表(从小到大有序)的头结点head(该结点有值),删除链表中的重复元素,使链表中的所有元素都只出现一次。如当输入 {1,1,2} 时,经删除后,原链表变为 {1,2},
    的头像 发表于 12-05 15:46 334次阅读
    数据<b class='flag-5'>结构</b>:删除有序<b class='flag-5'>链表</b>的重复节点

    数据结构:判断链表回文结构

    给定一个链表,判断该链表是否为回文结构。回文是指该字符串正序逆序完全一致。如当输入链表 {1,2,3,2,1} 时,断定是回文结构,输出Tr
    的头像 发表于 12-01 13:26 352次阅读
    数据<b class='flag-5'>结构</b>:判断<b class='flag-5'>链表</b>回文<b class='flag-5'>结构</b>

    数据结构:单链表的排序

    给定一个单链表的头结点head(该结点有值),长度为n的无序单链表,对其按升序排序后,返回新链表。如当输入链表 {3,1,4,5,2} 时,经升序排列后,原
    的头像 发表于 11-30 13:56 441次阅读
    数据<b class='flag-5'>结构</b>:单<b class='flag-5'>链表</b>的排序

    请问链表是怎么用的?

    链表是怎么用的?好像单片机很少用到这种数据结构,平时应用在在哪里比较多
    发表于 11-08 06:41

    如何在DEBUG的时候实时观察SYSTICK结构的数据?

    在DEBUG这个delay函数的时候,想要观察SysTick指向的结构数据变化,但是添加了SysTick到Watch1,观察不了。 目前是定义了一个u32 temp采用了将SysTick
    发表于 10-18 06:29

    结构在FLASH的存放,数据地址是连续的吗?

    结构在FLASH的存放,数据地址是连续的吗
    发表于 10-12 06:06

    单片机可以使用链表结构存储数据吗?

    单片机可以使用链表结构存储数据吗
    发表于 09-20 07:56

    C语言链表知识点(2)

    C语言链表知识点(2)
    发表于 08-22 10:38 181次阅读
    C语言<b class='flag-5'>链表</b>知识点(2)

    如何判断链表是否有环

    如何判断链表是否有环?
    发表于 08-10 17:07 472次阅读
    如何判断<b class='flag-5'>链表</b>是否有环

    链表和双链表的区别在哪里

    链表和双链表的区别 单链表的每一个节点中只有指向下一个结点的指针,不能进行回溯。 双链表的每一个节点给中既有指向下一个结点的指针,也有指向上一个结点的指针,可以快速的找到当前节点的前
    的头像 发表于 07-27 11:20 1110次阅读
    单<b class='flag-5'>链表</b>和双<b class='flag-5'>链表</b>的区别在哪里

    链表数据结构基本概念

    链表基本概念 头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。 头指针具有标识作用,所以常用头指针冠以链表的名字。 无论
    的头像 发表于 07-27 11:14 615次阅读
    <b class='flag-5'>链表</b>数据<b class='flag-5'>结构</b>基本概念

    IAR开发M453时出现定义结构错误的原因?

    在使用IAR开发M453时出现了一个问题,定义一个空结构就会报错,但是在结构添加成员编译正
    发表于 06-25 07:35

    C语言算法题:反转一个单向链表

    链表是编程学习的一个难点。其实,在C语言编程以及单片机裸机开发中,链表运用并不多。但是如果想提升嵌入式技能水平或收入水平,可以考虑深入嵌入式系统层面(如参与操作系统设计、深入学习新的操作系统等),此时,
    发表于 06-21 11:07 389次阅读
    C语言算法题:反转一个单向<b class='flag-5'>链表</b>

    数据结构中最简单的链表

    数据结构作为嵌入式工程师必修课程之一,今天,我们就来讲一讲数据结构中最简单的链表,包含链表的初始化、插入和遍历操作。 链表在项目
    发表于 06-13 17:40 251次阅读