链表节点指针无法更新导致打印循环问题求助
链表程序循环打印首个元素的问题修复
你的代码核心问题是只分配了一次链表节点内存,所有输入的元素都复用同一个节点,最终导致链表形成自引用循环,打印时陷入无限循环输出首个元素。以下是具体分析和修复方案:
错误原因分析
- 初始代码仅在开头调用一次
malloc(sizeof(nodo_t)),后续每次输入数据时,都直接覆盖同一个temp节点的dato值,并将temp->next指向当前的testa(也就是这个节点本身)。最终链表实际上只有一个节点,且该节点的next指向自己,形成循环。 - 额外问题:
free(temp)的位置错误,无论内存分配是否成功都会执行,可能导致非法内存访问;输入-1退出时,若未使用分配的节点,也会造成内存泄漏。
修正后的代码
#include <stdio.h> #include <stdlib.h> typedef struct nodo{ int dato; struct nodo *next; }nodo_t; typedef nodo_t *Ptr_nodo; int main(){ Ptr_nodo testa = NULL, temp; int q; q = 0; while(q != -1){ printf("Inserire valore: "); scanf("%d", &q); if(q != -1){ // 每次输入有效数据时,分配新的节点 temp = malloc(sizeof(nodo_t)); if(!temp){ printf("Errore allocazione memoria\n"); // 内存分配失败时,释放已创建的链表节点,避免泄漏 while(testa != NULL){ temp = testa; testa = testa->next; free(temp); } return 1; } temp->dato = q; temp->next = testa; testa = temp; } } // 打印链表 Ptr_nodo curr = testa; // 保留原头节点,方便后续释放 while(curr != NULL){ printf("%d", curr->dato); if(curr->next != NULL) printf(" -> "); else printf(" -|"); curr = curr->next; } printf("\n"); // 增加换行,优化输出格式 // 释放链表所有节点 while(testa != NULL){ temp = testa; testa = testa->next; free(temp); } return 0; }
关键改动说明
- 将
malloc移至输入有效数据后的代码块中,确保每个元素对应一个独立的链表节点,避免节点复用和自循环。 - 使用
curr指针遍历打印链表,保留原testa指针,方便后续释放所有节点,避免内存泄漏。 - 增加内存分配失败时的链表清理逻辑,防止内存泄漏。
- 调整
free的位置,确保只在链表使用完毕后统一释放所有节点,避免非法访问。
内容的提问来源于stack exchange,提问作者Jaco Toffo
相关产品推荐
相关产品推荐

