美文网首页
A1052 Linked List Sorting (25分)

A1052 Linked List Sorting (25分)

作者: km15 | 来源:发表于2020-03-01 18:24 被阅读0次

/*
题意:
1、给出N和首地址
2、然后给出静态链表
要求按key从小到大排列

解题:
1、按要求输入
2、排序倒是没什么问题,但是如何修改next

learn && wrong:
1、如何排序呢——排序后输出I+1的address,服了
2、注意用if(count != -1),特例输出-1,记住就像最后一个不要空格就行了
3、题目存在无效节点,不过没关系
4、需要特判,0 -1的情况
5、还有,先读入address,然后再address,加data,next,在修改address流程
6、输出要用count统计一下
7、流程:全部置为false-读入-while循环-特判输出
*/

include <iostream>

include <cstdio>

include <algorithm>

using namespace std;
const int maxn = 100010;
struct Node{
int data;
int address;
int next;
bool flag;
}node[maxn];

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

int main()
{
for(int i = 0;i < maxn;i++){
node[i].flag = false;
}

int n, begin,address;
scanf("%d%d",&n,&begin);

for(int i = 0;i < n;++i){       //输入所有链表!!!
    scanf("%d",&address);
    scanf("%d%d",&node[address].data,&node[address].next);
    node[address].address = address;
}

int count = 0,p = begin;
//枚举链表,对flag进行标记,同时计数有效节点个数(步骤3)
while(p != -1){ //!!!
    node[p].flag = true;
    count++;
    p = node[p].next;
}
if(count == 0){ //特判,表中没有节点
    cout<<"0 -1"<<endl;
}else{
    //筛选有效节点,并按data从小到大排序(步骤4
    sort(node,node + maxn,cmp);
    printf("%d %05d\n",count,node[0].address);  //防止-1被%05d化,提前判断
    for(int i = 0;i < count;i++){
        if(i != count - 1){
            printf("%05d %d %05d\n",node[i].address, node[i].data,node[i+1].address);
        }else{
            printf("%05d %d -1\n",node[i].address, node[i].data);
        }
    }
}
return 0;

}

相关文章

网友评论

      本文标题:A1052 Linked List Sorting (25分)

      本文链接:https://www.haomeiwen.com/subject/rmickhtx.html