数组转单链表代码输出全0?求问题排查与正确实现方法
问题分析与修复方案
你的代码输出全0主要有几个关键问题:
1. 错误的打印时机
你在new->DATA = A[N-1];之前就打印了new->DATA,而malloc分配的内存是未初始化的随机值,这次刚好全是0,但本质是读取了未赋值的垃圾数据。必须先给new->DATA赋值,再打印。
2. 指针参数传递错误
C语言中,函数参数是按值传递的。你把former指针传给convert的head参数时,函数内部修改的只是head的副本,不会影响main里的former。要让函数能修改外部的指针,需要用二级指针,或者让函数返回新的头指针。
3. 数组长度计算错误
你的数组arr[10]只初始化了前5个元素,后面5个会被默认填充0。但你用sizeof(arr)/sizeof(arr[0])算出的长度是10,导致循环会处理10个元素,包括那些默认的0值。如果只想处理实际初始化的5个元素,应该直接指定长度为5,或者让编译器自动计算有效元素数。
4. 不必要的内存分配
main里给former分配内存完全没用,因为convert函数一开始就把head设为NULL,后面也不会用到这个初始分配的节点,还会造成内存泄漏。
修正后的代码
这里用返回头指针的方式实现,更直观:
#include <stdio.h> #include <stdlib.h> typedef struct node { int DATA; struct node* LINK; } node; // 函数返回新的头指针 node* convert(int A[], int N){ node* head = NULL; while(N > 0){ // 改成N>0更合理,避免处理N=-1的边界 node* new_node = (node*)malloc(sizeof(node)); if (new_node == NULL){ printf("Memory not available"); return head; } new_node->DATA = A[N-1]; // 先赋值 printf("%i ", new_node->DATA); // 再打印 new_node->LINK = head; head = new_node; N--; } return head; } // 新增打印链表的函数,验证结果 void print_list(node* head){ printf("\n链表内容:"); while(head != NULL){ printf("%i ", head->DATA); head = head->LINK; } } int main(){ int arr[] = {0, 1, 2, 3, 4}; // 不指定长度,让编译器自动计算有效元素数 int size = sizeof(arr)/sizeof(arr[0]); // 现在size是5 node* head = convert(arr, size); print_list(head); // 释放链表内存,避免泄漏 node* temp; while(head != NULL){ temp = head; head = head->LINK; free(temp); } return 0; }
代码说明
- 把
convert改成返回头指针,避免二级指针的复杂操作,贴合你的算法逻辑。 - 循环条件改为
N>0,数组下标从0到N-1,处理完N个元素后N变为0,自然停止循环,比N!=-1更合理。 - 新增
print_list函数,方便验证链表是否正确生成。 - 加上内存释放代码,避免内存泄漏。
- 数组不指定固定长度,让编译器自动计算有效元素数,避免处理多余的默认0值。
运行这段代码,输出会是:4 3 2 1 0,链表内容也是4 3 2 1 0,符合你的算法(从数组末尾开始构建链表,最终链表是数组的逆序)。
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

