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

单循环链表打印问题:最后一个元素无法正常显示

问题分析与解决

你的问题出在afficher_liste函数的循环终止条件上,导致单循环链表的最后一个节点始终无法被打印。

问题根源

先看你原来的循环逻辑:

do {
    lg++;
    afficher_ville(&aide->data);
    aide= aide->suivant;
} while(aide->suivant != l->T);

单循环链表的尾节点suivant指针是指向表头l->T的。当aide移动到尾节点时,aide->suivant == l->T,此时循环条件不满足,直接退出——但尾节点的打印操作还没执行就结束了,这就是为什么每次都少打最后一个元素。

举个例子:假设链表是A→B→C→A(3个元素)

  1. 第一次循环:打印A,aide移到B,判断B->suivant=C≠A,继续
  2. 第二次循环:打印B,aide移到C,判断C->suivant=A≠A?不成立,循环退出
  3. 结果:C完全没被打印,只输出了2个元素(对应你说的3个元素打2个的情况)

修正方案

把循环条件改成判断aide != l->T,这样我们会遍历到回到表头为止,确保所有节点都被处理:

void afficher_liste(liste* l) {
    if(l->T==NULL){exit(-1);}
    element *aide = l->T;
    int lg=0;
    do {
        lg++;
        afficher_ville(&aide->data);
        aide= aide->suivant;
    } while(aide != l->T); // 这里修改条件
    printf("longeur* %d\n",lg);
}

逻辑解释

这个修正后的循环流程是:

  1. 先打印当前节点(包括表头)
  2. 移动到下一个节点
  3. 判断是否回到表头:如果没回到,继续循环;如果回到了,说明所有节点都遍历完了,退出循环

这样不管链表有多少个节点,从表头开始,每个节点都会被打印一次,直到指针绕回表头为止,完美解决最后一个节点无法打印的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:57:51