不知道各位读者是怎么理解链表的,还有就是链表和结构体的关系?最近开发的项目资源不是很紧凑,就用了面向对象编写,就大量的使用到结构体,有时还会配合共同体嵌套使用,顺便回顾了一些结构体的使用,这里主要简单回顾结构体和链表的关系;
链表在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,我们下篇推文再见!
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !