You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:20:15