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

链表节点指针无法更新导致打印循环问题求助

链表程序循环打印首个元素的问题修复

你的代码核心问题是只分配了一次链表节点内存,所有输入的元素都复用同一个节点,最终导致链表形成自引用循环,打印时陷入无限循环输出首个元素。以下是具体分析和修复方案:

错误原因分析

  • 初始代码仅在开头调用一次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:30:41