二叉树转前/后序遍历链表求助:生成链表元素全为零
问题诊断与修复方案
嘿,我一眼就瞅到你代码里的关键问题了——就是createNode函数里的内存分配搞错了!先看看你给出的代码片段里的坑:
typedef struct list { int data; struct list next; } List;
List createNode(int data) {
// create node in memory
List* list = malloc(sizeof(list));
// ...(剩下的代码没写完,但核心问题就在这一行)
你这里用了malloc(sizeof(list)),但list是一个List*类型的指针啊!在大多数系统里,指针的大小是4或者8字节,可你的List结构体明明包含了一个int(通常4字节)加一个指针(4/8字节),实际需要的内存大小应该是sizeof(List)才对。用指针的大小去分配内存,会导致空间不够,后续给list->data赋值的时候要么内存越界,要么就是写到了未初始化的内存区域,最终就表现成链表元素全是0了。
给你修复好的createNode函数,顺便加了内存分配失败的检查(这是个好习惯,能避免后续空指针崩溃):
List* createNode(int data) { // 分配结构体本身的大小,而不是指针的大小 List* newNode = malloc(sizeof(List)); if (newNode == NULL) { fprintf(stderr, "内存分配失败!\n"); exit(EXIT_FAILURE); } newNode->data = data; newNode->next = NULL; return newNode; }
另外再给你提两个小建议:
- 构建链表的时候,如果是递归遍历二叉树,最好用二级指针传递尾节点,或者每次返回新的尾节点,别每次都从头遍历找尾,效率太低;
- 用完链表之后一定要记得遍历释放所有节点的内存,不然会造成内存泄漏;
- 后序遍历的逻辑虽然和前序类似,但要严格遵循「左子树→右子树→根节点」的访问顺序,别搞混了。
内容的提问来源于stack exchange,提问作者Robert DeRienzo
相关产品推荐
相关产品推荐

