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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:16:10