亦行之 2024-03-08 19:49 采纳率: 34.5%
浏览 0

PAT乙级1075c语言答案错误求解

img


#include<stdio.h>
#include<string.h>
struct num{
    int ads;
    int num;
    int ads_next;
};
int main(){
    int n,k,ad_1;
    int ads;
    scanf("%d %d %d",&ad_1,&n,&k);//k是基准元素 
    //char ad,next;
    struct num point[100001];
    /*for(int i=0;i<n;i++){
        scanf("%d %d %d",&point[i].ads ,&point[i].num ,&point[i].ads_next );
    }*/
    int f_num=0,z_num=0,d_num=0;
    for(int i=0;i<n;i++){
        scanf("%d",&ads);//结点地址做下标 
        scanf("%d %d",&point[ads].num ,&point[ads].ads_next );
        point[ads].ads =ads;
        if(point[ads].num <0){
            f_num++;
        }
        else if(point[ads].num >=0&&point[ads].num <=k){
            z_num++; 
        }
        else{
            d_num++;
        }
    }
    //新建一个输出用的数组
    struct num newpoint[n];
    ads=ad_1;
    int i=0;
    while(ads!=-1&&f_num!=0){//先存放负数的 
        if(point[ads].num <0)
        {
        newpoint[i].num =point[ads].num ;
        newpoint[i].ads =point[ads].ads ;
        i++;
        f_num--;
        }
        ads=point[ads].ads_next ;
    } 
    ads=ad_1,i=0; 
    while(ads!=-1&&z_num!=0){
        if(point[ads].num >=0&&point[ads].num <=k)
        {
        newpoint[i].num =point[ads].num ;
        newpoint[i].ads =point[ads].ads ;
        i++;
        z_num--;
    }
    ads=point[ads].ads_next ;
    }
    ads=ad_1,i=0;
    while(ads!=-1&&d_num!=0){
        if(point[ads].num >k){
            newpoint[i].num =point[ads].num ;
            newpoint[i].ads =point[ads].ads ;
            i++;
            d_num--;
        }
        ads=point[ads].ads_next ;
    }
    //最后一个不要忘记置为-1 
    newpoint[i].ads =-1;
    for(int j=0;j<n;j++){
        //nextads怎么得到呢? 
        printf("%05d %d",newpoint[j].ads ,newpoint[j].num);
        //if(j!=n-1)
        if(newpoint[j+1].ads !=-1) 
        printf(" %05d\n",newpoint[j+1].ads );
        else{
                printf(" -1\n");
                //break;
        }
    }
    return 0;
} 

这是我的输出:明显错误

img


提交到pta后也只有一个测试点通过 请问我错在哪里了呢?为什么 不能正确得到输出?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-08 20:03
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的代码和问题描述,您在尝试解决PAT乙级1075题目的C语言实现,该题目要求对链表中的结点按照数值大小进行分类重组,并输出新链表。从您的描述来看,输出结果有误。

    错误可能出在以下几点:

    1. 在新建的newpoint数组中存放元素时,没有正确处理负数、[0,k]以及(k,+∞)区间内的节点遍历顺序。当一个区间内的节点遍历完后应继续遍历下一个区间的节点,而不是重新从ad_1开始。

    2. 代码里有三个独立的while循环来遍历并填充newpoint数组,这会导致遍历混乱,应该只用一个循环按顺序读取和分类插入。

    3. newpoint[i].ads = -1; 这一行放在了循环内部,实际上应该放在循环结束后作为结束标志。

    4. 输出部分逻辑也有问题,不应该依赖于j+1的值来决定是否输出换行和-1,而应该根据当前遍历到的位置判断。

    基于以上分析,您可以尝试修改为以下代码:

    #include<stdio.h>
    #include<string.h>
    
    struct num{
        int ads;
        int num;
        int ads_next;
    };
    
    int main(){
        int n, k, ad_1;
        scanf("%d %d %d", &ad_1, &n, &k);
        
        struct num point[100001];
        for(int i = 0; i < n; i++){
            int ads;
            scanf("%d %d %d", &ads, &point[ads].num, &point[ads].ads_next);
            point[ads].ads = ads;
        }
        
        struct num newpoint[n];
        int new_index = 0;
    
        ads = ad_1;
        while(ads != -1 && new_index < n){
            if(point[ads].num < 0){
                newpoint[new_index++] = point[ads];
                f_num--;
            }
            else if(point[ads].num >= 0 && point[ads].num <= k){
                newpoint[new_index++] = point[ads];
                z_num--;
            }
            else{
                newpoint[new_index++] = point[ads];
                d_num--;
            }
    
            ads = point[ads].ads_next;
        }
    
        // 将剩余未遍历到的位置用哨兵标记
        newpoint[new_index].ads = -1;
    
        // 按顺序输出新链表
        for(int j = 0; j < n; j++){
            printf("%05d %d", newpoint[j].ads, newpoint[j].num);
            
            if(j != n - 1 && newpoint[j + 1].ads != -1)
                printf(" %05d\n", newpoint[j + 1].ads);
            else
                printf(" -1\n");
        }
    
        return 0;
    }
    

    请确保输入数据格式正确,且变量f_num, z_num, 和 d_num在实际代码中有初始化和正确的更新(您给出的代码片段中它们仅用于计数,但并没有看到更新的地方)。此外,这段代码假设所有输入节点都会被正确分类并放入newpoint数组中。如果存在非法输入或不完整的链表情况,请相应地增加错误检查和边界条件处理。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月8日