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

C语言链表创建程序运行异常,仅可打印头节点无后续节点输出

错误根因

createLinkedList函数else分支的尾节点查找逻辑存在问题:

  • 原代码中while(p != NULL) p = p->next;的遍历终止条件错误,循环结束后指针p会指向NULL,此时执行p = temp仅修改了局部指针变量p本身的存储值,并未修改链表最后一个节点的next指针,新节点完全没有挂载到原有链表上,因此除头节点外其余节点均和链表断开关联,遍历的时候自然只能输出头节点。
修复方案

修改else分支的逻辑,调整遍历终止条件,让循环结束时p指向链表当前的最后一个有效节点,再将新节点赋值给该节点的next指针即可,修改后的createLinkedList函数代码如下:

void createLinkedList(int n)
{
    int i;
    struct Node *temp, *p;
    
    for(i=1; i<=n; i++)
    {
        temp = (struct Node *)malloc(sizeof(struct Node));
        printf("Now enter your element %d of linked list: ",i);
        scanf("%d",&(temp->data));
        temp->next = NULL;
        
        if(head == NULL)
            head = temp; 
        else
        {
            p = head;
            // 调整终止条件:遍历到当前最后一个节点就停止
            while(p->next != NULL)
                p = p->next;
            // 将新节点挂到最后一个节点的next指针上
            p->next = temp;
        }
        printf("\n");
    }
}
可选优化

当前代码每次插入新节点都要从头遍历链表找尾节点,时间复杂度为O(n²),如果链表较长效率较低,可以额外维护一个全局或局部的尾指针,每次插入新节点后更新尾指针,插入操作时间复杂度可以降到O(1)。

内容的提问来源于stack exchange,提问作者nSack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 23:15:01