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

C语言双向链表输出0-10序列的代码问题排查

双向链表0-10序列输出问题修复

现有代码Bug说明

  • append函数空链表分支逻辑缺失:当链表为空创建首节点后没有提前返回,会重复执行后续节点创建逻辑,导致第一个插入的数值重复生成节点,既浪费内存也会导致数据错误。
  • append函数存在冗余代码:已经封装了create函数负责节点初始化,追加节点时重复写了malloc和成员赋值逻辑,容易遗漏指针初始化。
  • display函数循环条件写反:使用while(!aNode)作为遍历条件,仅当节点为空时才进入循环,和「节点非空时持续遍历」的正确逻辑完全相反,导致无法输出任何节点内容,极端场景还会触发空指针崩溃。
  • 缺失必要头文件:代码中使用了malloc、printf函数但没有引入对应头文件,会直接导致编译失败。

修复后完整代码

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

// 双向链表结构体定义
typedef struct doubleLinkedList
{
  struct doubleLinkedList *prevPtr;
  int data;
  struct doubleLinkedList *nextPtr;
} dNode;

typedef dNode *dNodePtr;

// 初始化新节点
dNodePtr create(int val) {
    dNodePtr newNode = (dNodePtr)malloc(sizeof(dNode));
    newNode->data = val;
    newNode->prevPtr = NULL;
    newNode->nextPtr = NULL;
    return newNode;
}

// 链表尾部追加节点
void append(dNodePtr* head, int val) {
    // 空链表直接创建首节点后返回
    if (!(*head)) {
        *head = create(val);
        return;
    }
    // 复用create接口生成新节点
    dNodePtr valNode = create(val);
    dNodePtr cur = *head;
    // 遍历到尾节点
    while (cur->nextPtr) {
        cur = cur->nextPtr;
    }
    // 建立双向指针关联
    valNode->prevPtr = cur;
    cur->nextPtr = valNode;
}

// 打印链表内容
void display(dNodePtr* head) {
  dNodePtr cur = *head;
  printf("Linked list: ");
  // 修正循环条件:节点非空时持续遍历
  while (cur) {
    printf("%d", cur->data);
    if (cur->nextPtr) {
        printf(" -> ");
    }
    cur = cur->nextPtr;
  }
  printf("\nPrint finished\n");
}

int main() {
    dNodePtr head = NULL;
    // 依次插入0-10的数值
    for (int i = 0; i <= 10; i++) {
        append(&head, i);
    }
    display(&head);

    // 释放链表内存避免泄漏
    dNodePtr temp;
    while (head) {
        temp = head;
        head = head->nextPtr;
        free(temp);
    }
    return 0;
}

运行输出结果

Linked list: 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10
Print finished

内容的提问来源于stack exchange,提问作者Grimmace_23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 10:09:17