PAT A1052 Linked List Sorting (25分)


给一个链表,然后按链表里面的数据排序,重新排成一个链表。

注意给的数据里面有掺杂的无用节点,不能直接排序。
所以应该遍历一遍链表之后标记出有用节点再排序。

#include<cstdio>
#include<map>
#include <algorithm>
using namespace std;
const int N = 100010;
struct Node{
    int address;
    int v;
    int next;
    bool flag = false;
}node[N];

bool cmp(Node a,Node b){
    if(a.flag==false)
        return false;
    else if(b.flag==false)
        return true;
    else{
        return a.v<b.v;
    }
}
int main(){
    int n,firstadd;
    scanf("%d %d",&n,&firstadd);
    int tempadd;
    for(int i = 0;i < n;i++){
        scanf("%d",&tempadd);
        scanf("%d %d",&node[tempadd].v,&node[tempadd].next);
        node[tempadd].address = tempadd;
        
    }
    int count=0;
    tempadd = firstadd;
    while(tempadd!=-1){
        node[tempadd].flag = true;
        tempadd = node[tempadd].next;
        count++;
    }   
    if(count==0){
        printf("0 -1");
    }else{
        //从小往大排序
        sort(node,node+N,cmp);
        firstadd = node[0].address;
        printf("%d %05d\n",count,firstadd);
        for(int i = 0;i<count;i++){
            printf("%05d %d",node[i].address,node[i].v);
            if(i != count-1){            
                printf(" %05d\n",node[i+1].address);
            }else{
                printf(" -1\n");
            }            
        }

    }
    return 0;
            
}

代码二:map映射地址

#include<cstdio>
#include<map>
using namespace std;
const int N = 100010;
map<int,int> mp;
struct Node{
    int address;
    int v;
    int next;
}node[N];

int main(){
    int n,firstadd;
    scanf("%d %d",&n,&firstadd);
    int tempadd;
    for(int i = 0;i < n;i++){
        scanf("%d",&tempadd);
        scanf("%d %d",&node[tempadd].v,&node[tempadd].next);
        node[tempadd].address = tempadd;
        
    }
    tempadd = firstadd;
    while(tempadd!=-1){//遍历
        mp.insert(make_pair(node[tempadd].v,node[tempadd].address));
        tempadd = node[tempadd].next;
    }
    
    //mp从小往大排序
    if(mp.size()==0){
        printf("0 -1");
    }else{    
        int count = 0;
        map<int,int>::iterator it = mp.begin();
        firstadd = it->second;
        
        printf("%d %05d\n",mp.size(),firstadd);
        while(it!=mp.end()){
            printf("%05d %d",it->second,it->first);
            it++;
            count++;
            if(count != mp.size()){            
                printf(" %05d\n",it->second);
            }else{
                printf(" -1\n");
            }
        }
    }
    return 0;
            
}
posted @ 2020-09-01 17:28  是水泵呢  阅读(64)  评论(0编辑  收藏  举报