链表应用--PAT.1052. Linked List Sorting

/**********************3stone***************************
Problem: PAT.1052. Linked List Sorting (25) 
Author:3stone
Time:2017/3/6

 思路:【order:记录点的序号】 
 1、根据地址遍历链表给order属性赋值,后按order排序
 2、再单独对有效结点的值排序
 3、注:可能所有数据都无效,这时要输出【0 -1***********************3stone***************************/
#include<cstdio>
#include<algorithm>
#define maxSize 100010
using namespace std;

struct P{
    int st, data, ed;
    int order;
}point[maxSize];

bool cmp1(P a, P b){
    return a.order < b.order;
}

bool cmp2(P a, P b){
    return a.data < b.data;
}

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

        for(int i = 0; i < maxSize; i++)
            point[i].order = maxSize;

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

        int num = 0; //遍历链表,记录序号 
        for(int pre = start; pre != -1; pre = point[pre].ed){
            point[pre].order = ++num;
        }

        sort(point, point + maxSize, cmp1);

        sort(point, point + num, cmp2);

        if(0 == num){
            printf("0 -1\n");
            break;
        }

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

    }//while
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值