C程序统计超5000数值时数据丢失问题排查求助
问题分析与修复方案
从你的描述和代码来看,统计超过5000数值数量异常的核心原因是统计逻辑与需求不匹配,同时代码还存在内存泄漏的问题,以下是详细分析和修复步骤:
1. 统计逻辑错误:统计对象与需求不符
你的需求是统计不重复节点中超过5000的数值数量(和不重复节点总数对应),但当前代码的统计逻辑是:
while (fscanf(fp, "%d", &newData) != EOF) { dataType = InsertNode(rheadnode, newData); // 无论数值是否重复,只要>5000就计数 if (newData > 5000) Data_morethan5000_Count++; switch (dataType) { case 0: break; case 1: NodeCount++; } }
这种写法会把重复的超过5000的数值也计入统计,但你提到程序结果比Excel小28,结合你说NodeCount(不重复节点数)正常,更合理的解释是你实际需要统计的是不重复的超过5000数值,而Excel的45460正是这个值——之前的统计逻辑可能因为部分重复数值是≤5000的,导致整体统计结果反而偏小。
修复统计逻辑
修改GetData函数中的统计代码,仅当插入成功(即数值不重复)时才判断是否超过5000并计数:
while (fscanf(fp, "%d", &newData) != EOF) { dataType = InsertNode(rheadnode, newData); switch (dataType) { case 0: break; case 1: NodeCount++; // 仅统计不重复的超过5000的数值 if (newData > 5000) { Data_morethan5000_Count++; } break; } }
2. 插入函数的内存泄漏问题
在InsertNode函数中,当遇到重复数值时,你已经malloc了新节点,但直接return 0,没有释放这个节点,会导致内存泄漏:
else if (node->key == search->key) { free(node); // 新增:释放未使用的节点 return 0; }
3. 链表插入逻辑的顺序错误(非核心统计问题,但影响链表结构)
当前插入逻辑会导致链表降序排列,且逻辑上存在颠倒:
// 当前错误的条件:node->key < search->key时继续遍历 if (node->key < search->key) { previous = search; search = search->link; }
如果需要链表按升序排列,应该修改为:
// 正确的升序插入条件:node->key > search->key时继续向后找 if (node->key > search->key) { previous = search; search = search->link; }
这个修改不影响去重和统计,但能让链表结构符合预期的升序顺序。
验证修复
修改后重新运行程序,统计的Data_morethan5000_Count应该会和Excel的45460一致,同时解决了内存泄漏问题。
内容的提问来源于stack exchange,提问作者student12343
相关产品推荐
相关产品推荐

