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

描述

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

链表在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()
{
  int temp = 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,我们下篇推文再见!

审核编辑:郭婷

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分