链表里的元素可能没有
思路:使用静态链表
注意:存在给出的地址不在链表上,此外,存在链表没有任何节点。所以这个故事告诉我们,多想一下出题人要求我们输出内容的必要性,一般情况,出题人不会脑残让我们读入什么,就输出什么。
版本1
PAT测试点
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100006;
struct node{
int key,add,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.key<b.key;
}
}
int main(){
int n,head,add;
for(int i=0;i<maxn;i++){ //初始化
Node[i].flag=false;
}
scanf("%d%d",&n,&head);
for(int i=0;i<n;i++){
scanf("%d",&add);
Node[add].add=add;
scanf("%d %d",&Node[add].key,&Node[add].next);
}
int cnt=0,p=head;
while(p!=-1){
Node[p].flag=true; //在链表上
cnt++;
p=Node[p].next;
}
if(cnt==0){ //链表没有任何节点时
printf("0 -1\n");
return 0;
}
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].key,Node[i+1].add);
}
printf("%05d %d -1\n",Node[cnt-1].add,Node[cnt-1].key);
return 0;
}
版本2
牛客网测试点
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
struct node{
int val, tag, next, add;
}E[maxn];
bool cmp(node a, node b){
if(a.tag != b.tag) return a.tag > b.tag;
else return a.val < b.val;
}
int main(){
int n, p, add, k = 0;
cin >> n >> p;
for(int i = 0; i < n; i++){
cin >>add;
E[add].add = add;
cin>>E[add].val>>E[add].next;
}
while(p != -1){
E[p].tag = 1;
p = E[p].next;
k++;
}
sort(E, E + maxn, cmp);
if(k == 0){
printf("0 -1\n");
return 0;
}
printf("%d %05d\n", k, E[0].add);
for(int i = 0; i < k; i++){
printf("%05d %d ",E[i].add, E[i].val);
if(i != k-1) printf("%05d\n", E[i+1].add);
else printf("-1\n");
}
return 0;
}