如何在C语言中使用for循环向双向链表插入数据
双向链表循环插入问题的修复
你的代码存在两个核心问题,导致双向链表无法正常工作:
问题1:tail指针未初始化且未维护
main函数中tail是未初始化的局部变量,默认值为随机内存地址(野指针)。调用backward_traversing(tail)和show_last(tail)时访问野指针,属于未定义行为,看似能运行只是巧合。
问题2:双向关联未建立
插入新节点到头部时,仅设置了新节点的next_link指向当前head,但没有将原head的prev_link指向新节点,导致链表的反向指针链断裂,双向链表的结构不完整。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct Node { int value; struct Node *next_link; struct Node *prev_link; } Node; Node *create_node(int value) { Node *new_node = malloc(sizeof(Node)); new_node->value = value; new_node->next_link = NULL; new_node->prev_link = NULL; return new_node; } void forward_traversing(Node *head) { Node *temp = head; while (temp != NULL) { printf("%d ", temp->value); temp = temp->next_link; } printf("\n"); } void backward_traversing(Node *tail) { Node *temp = tail; while (temp != NULL) { printf("%d ", temp->value); temp = temp->prev_link; } printf("\n"); } void show_first(Node *head) { printf("%d \n", head->value); } void show_last(Node *tail) { printf("%d \n", tail->value); } int main() { Node *head = NULL, *temp, *tail = NULL; for (int i = 0; i <= 25; i++){ temp = create_node(i); if (head == NULL) { // 第一个节点,头尾指针指向同一位置 head = temp; tail = temp; } else { // 新节点的next指向当前头部 temp->next_link = head; // 原头部的prev指向新节点,建立双向关联 head->prev_link = temp; // 更新头部为新节点 head = temp; } } forward_traversing(head); // 输出:25 24 23 ... 0 backward_traversing(tail); // 输出:0 1 2 ... 25 show_first(head); // 输出:25 show_last(tail); // 输出:0 // 释放链表内存,避免泄漏 Node *current = head; while (current != NULL) { temp = current; current = current->next_link; free(temp); } return 0; }
关键修改说明
- 初始化
head和tail为NULL,避免野指针问题。 - 第一次插入节点时,同时将
tail指向该节点(此时链表仅有一个节点,头尾重合)。 - 非首次插入时,补充设置原头部节点的
prev_link,完整建立双向指针关联。 - 增加内存释放逻辑,养成良好的内存管理习惯。
内容的提问来源于stack exchange,提问作者Moonwalker
相关产品推荐
相关产品推荐

