• 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
    "); //全是无效结点
        else{
            sort(node, node+maxn, cmp);
            printf("%d %05d
    ",cnt,node[0].add);
            for(int i=0;i<cnt-1;i++){
                printf("%05d %d %05d
    ",node[i].add, node[i].data, node[i+1].add);
            }
            printf("%05d %d -1
    ",node[cnt-1].add, node[cnt-1].data);
        }
    }
    
    
  • 相关阅读:
    WPF之窗体说明
    WPF之基本概念
    WPF学习之button
    写一本”错误百出”的C语言学习教程(一)
    JSP的工作原理-还是没理解--多看点再写。
    Java将中文转换成unicode字符。
    postgres 导出数据到csv 文件
    python小试身手-文件重命名,文件复制和压缩(.gz)
    python 环境安装 mark下。
    JRE,JVM,JDK的区别---粘自百度知道、
  • 原文地址:https://www.cnblogs.com/doragd/p/11263694.html
Copyright © 2020-2023  润新知