无动态内存分配静态链表增删节点后打印无变化问题求助
问题根因
你的Del_Node函数存在三处核心逻辑错误,导致删除操作完全没有实际生效:
- 仅修改临时变量,未改动链表结构:函数末尾的
temp = temp->next修改的是栈上的局部临时指针,不会改变链表中原有节点的next指向,相当于你根本没修改链表的节点关联关系,删除操作等于没执行。 - 节点遍历逻辑错误:删除指定位置的节点需要先找到它的前驱节点,再修改前驱节点的
next指针跳过待删除节点,你当前的逻辑是直接遍历到待删除节点本身,无法完成指针重连。 - 边界情况未校验:没有处理空链表、删除头节点、index超出链表长度等特殊场景,容易触发野指针崩溃。
修正方案
修正后的Del_Node函数
void Del_Node(node **head, uint8_t index) { // 空链表直接返回 if (*head == NULL) return; node *temp = *head; // 删除头节点的特殊情况 if (index == 0) { *head = temp->next; next_node--; return; } // 找到待删除节点的前驱节点(index-1的位置) for (uint8_t run = 0; temp != NULL && run < index-1; run++) { temp = temp->next; } // 校验index是否超出链表长度,或者待删除节点不存在 if (temp == NULL || temp->next == NULL) return; // 跳过待删除节点,完成删除 temp->next = temp->next->next; next_node--; }
额外说明
你当前使用的头插法逻辑下,main函数中插入节点后的链表实际顺序为5 → 4 → 3 → 2,如果按从0开始计数:
- 位置0对应值5,位置1对应值4,位置2对应值3,位置3对应值2
如果需要删除值为3的节点,调用Del_Node时的index参数应该传2而非3,调整后打印输出为5 4 2。
另外你当前代码里的next_node变量没有实际作用:你是手动传入index参数指定使用静态数组的哪个节点,并没有通过next_node来分配空闲节点索引,增删时的next_node增减逻辑不影响节点的实际使用。
内容的提问来源于stack exchange,提问作者Nguyễn Phùng Thái Cường
相关产品推荐
相关产品推荐

