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

C语言排序链表打印时丢失节点问题求助

问题分析与解决

核心问题:swapNode函数破坏链表结构

你的swapNode函数直接交换了整个节点的所有内容(包括next指针),这会导致链表结构被破坏,出现节点孤立或循环引用,最终表现为打印时丢失节点。

举个实际场景:假设初始链表是NodeA -> NodeB -> NodeC

  • 交换NodeA和NodeB后,NodeA的next会变成NodeB原来的next(即NodeC);
  • NodeB的next会变成NodeA原来的next(即NodeB自身),形成循环引用;
  • 最终NodeB被孤立出链表,打印时自然丢失这个节点。

修复方案

1. 修改swapNode函数:只交换节点数据,保留next指针

不要直接交换整个节点,而是单独交换节点的业务数据(姓名、出生日期、专业、年级等),让next指针维持原有链表结构:

// 假设已定义NAME_LEN、MAJOR_LEN等字段长度常量
void swapNode(node_t* a, node_t* b)
{
    // 交换姓氏
    char temp_last[NAME_LEN];
    strcpy(temp_last, a->lastName);
    strcpy(a->lastName, b->lastName);
    strcpy(b->lastName, temp_last);

    // 交换名字
    char temp_first[NAME_LEN];
    strcpy(temp_first, a->firstName);
    strcpy(a->firstName, b->firstName);
    strcpy(b->firstName, temp_first);

    // 交换出生日期(结构体支持直接赋值)
    bd_t temp_bd = a->bd;
    a->bd = b->bd;
    b->bd = temp_bd;

    // 交换专业
    char temp_major[MAJOR_LEN];
    strcpy(temp_major, a->major);
    strcpy(a->major, b->major);
    strcpy(b->major, temp_major);

    // 交换年级
    char temp_class[CLASS_LEN];
    strcpy(temp_class, a->classStanding);
    strcpy(a->classStanding, b->classStanding);
    strcpy(b->classStanding, temp_class);
}

2. 修复打印函数的空指针风险

你的打印代码存在逻辑漏洞:当checkInvalidDate(temp)为true时,直接跳转temp但未判断是否为NULL就执行打印,会触发空指针访问错误。修改如下:

while (temp != NULL)
{
    if (checkInvalidDate(temp) == true)
    {
        temp = temp->next;
        continue; // 跳过当前节点,直接处理下一个
    }

    fprintf(out, "Name:\t%s %s\n", temp->firstName, temp->lastName);
    fprintf(out, "Date of Birth:\t%s %s, %s\n", temp->bd.month, 
                                                temp->bd.day, 
                                                temp->bd.year);
    fprintf(out, "Major:\t%s\n", temp->major);
    fprintf(out, "Year:\t%s\n\n", temp->classStanding);
    temp = temp->next;
}

验证结果

修改后,排序仅交换节点数据,链表结构保持完整,打印时所有节点都会被正确遍历,不会出现丢失情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:27:22