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
相关产品推荐
相关产品推荐

