鱼C论坛

 找回密码
 立即注册
查看: 19|回复: 1

动态链表

[复制链接]
发表于 半小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
链表我可以看懂,但是到了动态链表我感觉一点都看不懂,这可咋整。。。。前面的函数、指针虽然不是很熟练,但至少能看懂程序,但是动态链表是真的看不懂,云里雾里。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 半小时前 | 显示全部楼层
动态链表我可以看懂,但是到了动态链表我感觉一点都看不懂,这可咋整。。。。前面的函数、指针虽然不是很熟练,但至少能看懂程序,但是动态链表是真的看不懂,云里雾里。。。。


别担心,动态链表只是链表的一种实现方式,它在程序运行时动态分配内存来创建节点。如果你已经理解了链表的基本概念,那么动态链表只是多加了一步:动态内存分配。下面我用简单的方式解释一下。

核心概念:
- 动态链表的每个节点包含两部分:数据(存储值)和指针(指向下一个节点)。
- 它使用动态内存分配函数(如C中的 malloc)在运行时创建新节点,而不是在编译时固定大小。
- 通过指针操作将节点连接起来,形成链式结构。

一个简单的动态链表示例(C语言):
以下代码创建了一个包含三个节点的动态链表,并遍历输出。


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. // 定义链表节点结构
  4. struct Node {
  5.     int data;           // 数据域
  6.     struct Node* next;  // 指针域,指向下一个节点
  7. };

  8. int main() {
  9.     // 创建三个节点指针,初始化为NULL
  10.     struct Node* head = NULL;
  11.     struct Node* second = NULL;
  12.     struct Node* third = NULL;

  13.     // 动态分配内存给三个节点
  14.     head = (struct Node*)malloc(sizeof(struct Node));
  15.     second = (struct Node*)malloc(sizeof(struct Node));
  16.     third = (struct Node*)malloc(sizeof(struct Node));

  17.     // 检查内存分配是否成功
  18.     if (head == NULL || second == NULL || third == NULL) {
  19.         printf("内存分配失败!\n");
  20.         return 1;
  21.     }

  22.     // 为节点赋值并连接它们
  23.     head->data = 1;          // 第一个节点的数据
  24.     head->next = second;     // 指向第二个节点

  25.     second->data = 2;        // 第二个节点的数据
  26.     second->next = third;    // 指向第三个节点

  27.     third->data = 3;         // 第三个节点的数据
  28.     third->next = NULL;      // 第三个节点是尾节点,next为NULL

  29.     // 遍历链表并打印数据
  30.     struct Node* current = head;
  31.     while (current != NULL) {
  32.         printf("%d -> ", current->data);
  33.         current = current->next;
  34.     }
  35.     printf("NULL\n");

  36.     // 释放动态分配的内存
  37.     free(head);
  38.     free(second);
  39.     free(third);

  40.     return 0;
  41. }
复制代码


逐步解释:
1. 定义节点结构 struct Node,它包含一个整数 data 和一个指向下一个节点的指针 next
2. 在 main 函数中,声明三个节点指针并初始化为NULL,表示它们还没有指向任何内存。
3. 使用 malloc 动态分配内存: sizeof(struct Node) 计算一个节点需要的内存大小, malloc 返回分配的内存地址,然后转换为 struct Node* 类型。
4. 检查内存分配是否成功,如果失败则输出错误信息。
5. 为每个节点的数据域赋值,并通过 next 指针连接节点,形成链表(head -> second -> third -> NULL)。
6. 遍历链表:从 head 开始,使用一个临时指针 current 依次访问每个节点,打印数据,直到 current 为NULL。
7. 最后,使用 free 释放内存,避免内存泄漏。

关键点总结:
- 动态链表的节点是在堆(heap)上动态创建的,而不是在栈上静态分配。
- 指针是连接节点的桥梁:每个节点的 next 指针存储下一个节点的地址。
- 务必记得释放内存,否则会导致内存泄漏。

如果你对指针和函数不熟练,建议先复习指针基础(如指针声明、赋值、访问指针指向的数据)。动态链表只是这些知识的应用。多动手写代码,从简单示例开始,尝试添加节点、删除节点等操作,慢慢就会理解了。加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-12-2 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表