【ACM】PAT A1052 Linked List Sorting 【链表】

题目链接
题目分析

输入中含有无效结点,只需对有效结点操作即可

解题思路

1、对于无效结点:结构体中设置属性flag,表示是否在链表中
2、有效结点按key值进行结构体排序即可

(也可把有效结点摘取出来,存储在另一个数组,有效结点较少的情况这样排序更快)


AC程序(C++)
/**************************
*@Author: 3stone
*@ACM: PAT A1052 Linked List Sorting
*@Time: 18/7/18
*@IDE: VSCode 2018
***************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxSize 100010 
using namespace std;

struct Point{
    int st, data, ed;
    int flag;
}point[maxSize + 5], new_p[maxSize];

//比较规则
bool cmp(Point a, Point b){
    if(a.flag != b.flag)
        return a.flag > b.flag;
    else
        return a.data < b.data;
}

//标记有效结点,并返回有效结点数
int myCheck(int st) {
    int num = 0;
    while(st != -1){
        num++; //统计有效结点数
        point[st].flag = 1;
        st = point[st].ed;
    }
    return num;
}

int main(){
    int n, start, ad, count;
    while(scanf("%d %d", &n, &start) != EOF){

        for(int i = 0; i < maxSize; i++){//初始化 
            point[i].data = maxSize;
            point[i].flag = 0;  //初始均为 无效结点
        } 

        for(int i = 0; i < n; i++){//输入数据 
            scanf("%d", &ad);
            point[ad].st = ad;
            scanf("%d %d", &point[ad].data, &point[ad].ed);
        }

        //审查,标记有效结点
        count = myCheck(start);

        sort(point, point + maxSize, cmp);

        if (count < 1) {
            printf("0 -1\n");
        }else {
            printf("%d %05d\n", count, point[0].st);
            for(int i = 0; i < count - 1; i++) 
                printf("%05d %d %05d\n", point[i].st, point[i].data, point[i + 1].st);
            printf("%05d %d -1\n", point[count - 1].st, point[count-1].data);
        }

    }//while

    return 0; 
} 

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/81138109