单链表插入节点代码:从问题剖析到完美修正全解析
以下是对这段代码的详细分析: 代码功能 这段代码实现了在单链表中指定位置插入一个新节点的功能。函数 `Insert` 接收三个参数:链表的头节点指针 `head`、要插入的位置 `i` 以及要插入的元素值 `x`。 代码存在的问题 1. 插入位置为链表末尾的情况未处理:当 `i` 大于链表的长度时,代码不会在链表末尾插入新节点,而是直接结束函数,没有完成预期的插入操作。 2. 内存分配失败的情况未处理:使用 `malloc` 分配内存时,没有检查是否分配成功。如果内存分配失败,`malloc` 会返回 `NULL`,后续对 `NULL` 指针的操作会导致程序崩溃。 3. 插入位置为 1 的情况处理不完整:当 `i` 为 1 时,代码会从 `head->next` 开始遍历,而不是直接在 `head` 后面插入新节点,不符合插入位置为 1 的逻辑。 修正后的代码 ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 插入函数 void Insert(Node* head, int i, int x) { if (i <= 0) { return; } int index = 1; Node* p = head; // 从 head 开始遍历 while (p && index < i) { p = p->next; index++; } if (p) { // 如果 p 不为 NULL,说明找到了插入位置 Node* tmp = (Node*)malloc(sizeof(Node)); if (tmp == NULL) { printf("内存分配失败\n"); return; } tmp->data = x; tmp->next = p->next; p->next = tmp; } } // 打印链表函数 void printList(Node* head) { Node* p = head->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { // 创建头节点 Node* head = (Node*)malloc(sizeof(Node)); head->next = NULL; // 插入一些元素 Insert(head, 1, 10); Insert(head, 2, 20); Insert(head, 3, 30); // 打印链表 printf("插入元素后的链表: "); printList(head); // 插入一个新元素到位置 2 Insert(head, 2, 40); // 再次打印链表 printf("再次插入元素后的链表: "); printList(head); return 0; } ``` 代码解释 1. `Insert` 函数: - 首先检查插入位置 `i` 是否小于等于 0,如果是则直接返回。 - 从 `head` 开始遍历链表,找到插入位置的前一个节点 `p`。 - 如果 `p` 不为 `NULL`,说明找到了插入位置,使用 `malloc` 分配新节点的内存,并检查是否分配成功。 - 将新节点插入到 `p` 后面。 2. `printList` 函数: - 从 `head->next` 开始遍历链表,打印每个节点的数据。 3. `main` 函数: - 创建头节点,并插入一些元素。 - 打印链表。 - 插入一个新元素到位置 2。 - 再次打印链表。 通过以上修正,代码可以正确处理插入位置为 1、插入位置为链表末尾以及内存分配失败的情况。 ######[AI问答 | 907点数解答 | 2025-12-23 13:26:58]
- 微信收款助手监控程序代码剖析:功能、问题与改进方向(DeepSeek | 282点数解答 | 2025-04-11 00:32:28)208
- C#工程师必知:数组、链表、哈希、队列、栈数据结构优缺点大揭秘! (百度文心 | 561点数解答 | 2023-11-09 17:56:30)260
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)274
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)305
- Java 实现仿 Windows 资源管理器:文件管理器功能全解析与代码示例(字节豆包 | 623点数解答 | 2025-01-01 14:59:04)247
- C 语言实现单链表全功能操作:创建、增删查改与逆置测试( | 4796点数解答 | 2024-03-28 16:24:20)340
- C++实现顺序存储结构基本操作:初始化、插入、删除等全解析(GPT | 1743点数解答 | 2024-09-26 00:20:17)281
- C++实现单循环链表:初始化、插入、删除等操作及测试验证(GPT | 2102点数解答 | 2024-10-13 13:39:58)154
- C 语言实现依据标准为 8 岁宝宝身高体重提供营养建议(字节豆包 | 365点数解答 | 2024-10-30 16:30:00)317
- C 语言实现:依据国家标准为 8 岁宝宝身高体重提供营养建议(GPT | 760点数解答 | 2024-10-31 11:19:21)255
- C 语言实现:依据国家标准为 8 岁宝宝身高体重提供营养建议(阿里通义 | 563点数解答 | 2024-10-31 11:27:04)288
- Java 实现通用文件存储系统:含随机读写与空闲空间回收(字节豆包 | 686点数解答 | 2024-11-21 16:25:51)223