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
相关产品推荐
相关产品推荐

