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
    +关注

    关注

    21

    文章

    809

    浏览量

    119411
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68325

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

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

收藏 人收藏

    评论

    相关推荐

    C语言和C++结构的区别

    同样是结构,看看在C语言和C++中有什么区别?
    的头像 发表于 10-30 15:11 132次阅读

    在TAS5558两者之间的映射关系怎样的?

    在TAS5558,两者之间的映射关系怎样的?
    发表于 10-18 07:18

    ota升级的库结构upgrade_server_infopespconn的作用是什么?

    check_cb; struct espconn *pespconn; }; 这个结构已经有ip,port,pespconn这个结构
    发表于 07-12 06:33

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构在内
    的头像 发表于 06-04 08:04 373次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    嵌入式C语言结构基本实现

    :     在struct 声明了一个含有若干新成员的数据类型。     tag  是结构标签。     member-list  是标准的变量定义,比如 int i; 或者 float f,或者其他
    的头像 发表于 05-11 08:49 932次阅读
    嵌入式<b class='flag-5'>中</b>C语言<b class='flag-5'>结构</b><b class='flag-5'>体</b>基本实现

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

    数组和链表在内存的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存
    的头像 发表于 02-21 11:30 890次阅读

    数组和链表有何区别

    数组和链表的区别,这个问题,不仅面试中经常遇到,考研的同学也得掌握才行。
    的头像 发表于 02-19 15:33 449次阅读
    数组和<b class='flag-5'>链表</b>有何区别

    求助,请问一个结构如何全部定义到 __attribute__ 区域?

    请问一个结构如何全部定义到 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储到 __attribute__ 区域。 三个结构 ,每个
    发表于 01-16 07:29

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,
    的头像 发表于 01-11 18:24 1254次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构结构可以
    的头像 发表于 01-11 08:00 934次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的<b class='flag-5'>关系</b>

    keil arm工程结构1字节对齐如何实现

    在Keil Arm工程结构的对齐方式可以通过使用特定的编译器指令或者关键字来实现。结构的对齐方式会直接影响
    的头像 发表于 01-05 14:40 3464次阅读

    使用关系数据库的半结构化数据

    NoSQL革命已经进入了关系世界。您可能正在使用关系数据库,但仍必须查询和理解隐藏在文本列、JSON或 XML文档的半结构化数据。
    的头像 发表于 12-20 10:46 622次阅读
    使用<b class='flag-5'>关系</b>数据库<b class='flag-5'>中</b>的半<b class='flag-5'>结构</b>化数据

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

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

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

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