PAT A1052 Linked List Sorting [静态链表]

题目描述

链接
给出一个链表,将链表排序,然后把链表上的结点按照data值的从小到大顺序输出

分析

  • 定义静态链表的结构体,地址作为下标,注意,这里还需要记录address,为什么?因为排序以后下标不是地址了
  • 同时定义flag变量,因为给出的结点有些根本不在链表中,所以需要再遍历一次(另一种遍历的写法看下面的代码),标记有效结点,同时统计结点个数保存在cnt中,方便下面遍历和特判0 -1的情况
  • 排序的实现:链表的地址是分散的,所以要对node+maxn排序,按照data值,排序后下标不再是地址,所以要用add成员变量记录原来的地址,同时存在无效结点,所以用flag标识,cmp函数可以把flag=1的放在一起,flag=0的放在后面,从而使有效结点连续存放
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e6+10;
struct Node{
    int add,data,next;
    bool flag;
}node[maxn];


bool cmp(Node a, Node b){
    if(a.flag != b.flag) return a.flag > b.flag;
    return a.data < b.data;
}

int main(){
    int n, st,cnt = 0;
    cin>>n>>st;
    int add,data,next;
    for(int i=0;i<n;i++){
        cin>>add>>data>>next;
        node[add] = {add, data, next, false}; //新的结构体赋值方法!!学到了
    }
    for(int i=st; i!=-1; i=node[i].next){ //遍历,新的方式!!学到了
        node[i].flag = true;
        cnt++;
    }
    if(cnt==0) printf("0 -1\n"); //全是无效结点
    else{
        sort(node, node+maxn, cmp);
        printf("%d %05d\n",cnt,node[0].add);
        for(int i=0;i<cnt-1;i++){
            printf("%05d %d %05d\n",node[i].add, node[i].data, node[i+1].add);
        }
        printf("%05d %d -1\n",node[cnt-1].add, node[cnt-1].data);
    }
}

猜你喜欢

转载自www.cnblogs.com/doragd/p/11263694.html
今日推荐