当前位置: 首页 > ds >正文

弄清C语言中的链表

弄清C语言中的链表

​​

节点结构​​

链表由节点(Node)组成,每个节点包含:

  • ​​数据域​​:存储实际数据(如整数、字符等)。
  • 指针域​​:指向下一个节点的地址(单链表)或前驱和后继节点的地址(双向链表)

链表是,利用结构体,在堆上开辟内存空间去作为指针,这个指针总是指向下一个节点,结点通过指针相互串联,形成链表。

在这里插入图片描述
DATA作为结构体中自定义的数据类型;NEXT为指向链表结点的指针,通过访问NEXT,可以去访问链表的下一个结点。

//定义结点类型
//定义结点类型
typedef struct Node{int data;//数据类型struct Node* next;//指向下一个链表结点的指针
}Node;

​​链表类型​​

  • ​​单向链表​​:节点仅包含指向下一个节点的指针。
  • 双向链表​​:节点包含指向前驱和后继的指针,支持双向遍历。
  • ​​循环链表​​:尾节点指向头节点,形成环形结构。

单链表概念和简单的设计

在这里插入图片描述

//定义结点类型
typedef struct Node {int data;       //数据类型struct Node *next;//单链表的指针域
} Node,*LinkedList;  
//Node表示结点的类型,LinkedList表示指向Node结点类型的指针类型

链表的创建

创建一个单链表的前置节点并向后逐步添加节点,一般指的是申请结点的空间,同时对一个结点赋空值(NULL)。

LinkedList listinit()
{Node* newNode = (Node*)malloc(sizeof(Node));//开辟空间if(newNode == NULL)//如果开辟空间失败{printf("申请空间失败");//exit(0);                  //开辟空间失败可以考虑直接结束程序}newNode->next = NULL;//指针指向空return;
}

注意:一定要判断是否开辟空间失败,否则生产中由于未知的情况造成空间开辟失败,仍然在继续执行代码,后果将不堪设想啦,因此养成这样的判断是很有必要的。

尾插入法创建单链表

在这里插入图片描述

//尾插法建立单链表
LinkedList LinkedListCreatT(int x)
{Node* newNode = (Node*)malloc(sizeof(Node));//开辟空间if(newNode == NULL)//如果开辟空间失败{printf("申请空间失败");//exit(0);                  //开辟空间失败可以考虑直接结束程序return 0;}newNode->next = NULL;//指针指向空//定义辅助指向Node结点类型的指针类型Node *r;r = newNode;//r始终指向终端结点,开始时指向头结点while(scanf("%d",&x) != EOF) {Node *p;p = (Node *)malloc(sizeof(Node));   //申请新的结点p->data = x;                     //结点数据域赋值r->next = p;            //将结点插入到表头L-->|1|-->|2|-->NULLr = p;}r->next = NULL;return newNode;}
//使用数组创建链表
struct node* list_create(int data[],int n)
{//创建头结点struct node* list = (struct node*)malloc(sizeof(struct node));if(list == NULL){return NULL;}//创建结构体指针指向头结点struct node* p = list;for(int i = 0;i < n;i++){struct node* tmp = (struct node*)malloc(sizeof(struct node));//设置数据tmp->value = data[i];//连接p->next = tmp;//p指针后移p = p->next;}p->next = NULL;return list;
}
http://www.xdnf.cn/news/1707.html

相关文章:

  • 济南国网数字化培训班学习笔记-第二组-1节-输电线路工程
  • DRF凭什么更高效?Django原生API与DRF框架开发对比解析
  • 如何创建和使用 Hive 视图
  • 【低配置电脑预训练minimind的实践】
  • 【网络安全】社会工程学策略
  • H3C Magic路由器安全警报来啦![特殊字符][特殊字符]
  • Spark-Streaming核心编程(2)
  • 三国杀专业分析面板,立志成为桌游界的stockfish
  • AI与智能能源管理:如何通过AI优化能源分配和消耗?
  • 矩阵运营的限流问题本质上是平台与创作者之间的流量博弈
  • 【25软考网工】第三章(3)虚拟局域网VLAN
  • Nginx 反向代理,啥是“反向代理“啊,为啥叫“反向“代理?而不叫“正向”代理?它能干哈?
  • Qt5.15.2+OpenCV4.9.0开发环境搭建详细图文教程(OpenCV使用Qt自带MinGW编译的全过程,包教包会)
  • 低代码平台开发串口调试助手
  • 【Java面试笔记:进阶】17.一个线程两次调用start()方法会出现什么情况?
  • 单体OJ项目
  • Java语言的进化:JDK的未来版本
  • vue-study(1)
  • Vue3项目中 npm 依赖安装 --save 与 --save-dev 的区别解析
  • 面试篇:Spring Boot
  • leetcode 69和367
  • 一道MySQL索引题
  • 如何下载适用于语音识别功能增强的Google Chrome浏览器
  • JavaScript 页面刷新:从传统到现代的全面解析
  • 优雅实现网页弹窗提示功能:JavaScript与CSS完美结合
  • 网络原理 - 7(TCP - 4)
  • 【C++ 真题】P3456 [POI2007] GRZ-Ridges and Valleys
  • 中介者模式:解耦对象间复杂交互的设计模式
  • connection.cursor() 与 models.objects.filter
  • 解决编译pcl时报错‘chrono_literals‘: is not a member of ‘std‘