版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SYaoJun/article/details/86613357
静态链表
PAT的套路题,多刷几道知道了。
注意:是以地址作为数组的下标,所以读入的时候要细心,我开始就想当然的挨个存了,最后调了很久才发现。
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int add,key,next;
int no,tag;
}Node[100005];
int hash[100005];
bool cmp(node a, node b){
if(a.tag!=b.tag) return a.tag > b.tag;
else return a.no < b.no;
}
int main(){
int start,n,x;
scanf("%d %d",&start,&n);
memset(hash,0,sizeof(hash));
for(int i=0;i<n;i++){
scanf("%d",&x);
Node[x].add=x;
scanf("%d %d",&Node[x].key,&Node[x].next);
}
int p = start;
int cnt=0;
int num1=0,num2=0;
while(p != -1){
if(hash[abs(Node[p].key)]==0){
hash[abs(Node[p].key)]=1;
Node[p].tag=2;
num1++;
}else{
Node[p].tag=1;
num2++;
}
Node[p].no=cnt;
cnt++;
p = Node[p].next;
}
sort(Node,Node+100000,cmp);
for(int i=0;i<num1;i++){
if(i!=num1-1){
printf("%05d %d %05d\n",Node[i].add,Node[i].key,Node[i+1].add);
}else{
printf("%05d %d -1\n",Node[i].add,Node[i].key);
}
}
for(int i=num1;i<cnt;i++){
if(i!=cnt-1){
printf("%05d %d %05d\n",Node[i].add,Node[i].key,Node[i+1].add);
}else{
printf("%05d %d -1\n",Node[i].add,Node[i].key);
}
}
return 0;
}