PATA1052 Linked List Sorting (25 分)

链表里的元素可能没有
思路:使用静态链表
注意:存在给出的地址不在链表上,此外,存在链表没有任何节点。所以这个故事告诉我们,多想一下出题人要求我们输出内容的必要性,一般情况,出题人不会脑残让我们读入什么,就输出什么。

版本1

PAT测试点

#include
#include
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
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;
}

你可能感兴趣的:(链表,PAT甲级真题题解)