1052 Linked List Sorting
题目大意
将读入的结点根据是否有效(是否在链表上)和key值的大小排序后,输出所有有效结点(是否在链表上)的address key 和 当前结点的下一个结点的address。(排序后结点的顺序发生了变化,当前结点的next不再是下一个结点的adress)
核心思路
思路借鉴于柳神,链接如下:
https://blog.csdn.net/liuchuo/article/details/52144537
建立结构体数组,按照首地址开始的顺序(直到-1)遍历一遍链表,将在链表上的结点标记为true,并统计个数cnt(有效结点的个数)。(无效结点不在链表中,flag为false)
然后根据链表结点的flag和key进行排序,有效结点在吴小姐点之前,key更小的在key更大的之前
输出前cnt个结点。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100005;
//结点类型
struct Node{
int address;
int key;
int next;
bool flag;//表示该节点是否是有效结点(在链表上为有效,flag为true;不在链表上为无效,flag为false)
}node[maxn];
//排序函数
bool cmp(Node a,Node b){
if(a.flag==false||b.flag==false){
return a.flag>b.flag;//有效的结点放在前面,无效结点放在后面
}
else{
return a.key<b.key;//key值更小的在前面,key值大的在后面
}
}
int main(){
//读入结点数量,初始结点的address
int n,s;
scanf("%d%d",&n,&s);
//给每个结点赋值
for(int i=0;i<n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
node[a]={a,b,c,false};//flag全部初始化为false,表示所有结点均为无效结点
}
//遍历链表的每一个结点,在链表上的结点都是有效结点,同时记录有效结点的个数
int cnt=0;//有效结点的个数
for(int p=s;p!=-1;p=node[p].next){
node[p].flag=true;
cnt++;
}
//根据结点的flag和key进行排序,按结点编号(0~cnt-1~n-1)输出前cnt个结点的address和key和next(
//根据flag和key排序后,结点的next是会变化的,变成下一个结点的address)
if(cnt == 0) {
printf("0 -1");
} else {
sort(node, node + maxn, cmp);//对结点进行排序
printf("%d %05d\n", cnt, node[0].address);//输出结点个数和第一个结点的address
for(int i = 0; i < cnt; i++) {
printf("%05d %d ", node[i].address, node[i].key);//输出第i个结点的address和key
if(i != cnt - 1)//i不是最后一个结点,该结点的next为下一个结点的address
printf("%05d\n", node[i+1].address);
else//i是最后一个结点,该结点的下一个结点为-1
printf("-1\n");
}
}
return 0;
}