A1052 Linked List Sorting (25分)

一、技术总结

  1. 这个也是一个链表类题目,主要是在结构提上的设计,可以设计一个flag参数用于记录真实有效的结点。
  2. 然后就是根据题目要求进行排序,输出结果。
  3. cmp()函数可以,一层是把有效节点排到数组的左边,然后可以进行二次比较,按题目要求来。

二、参考代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
	int key;//数据 
	int next;//用于存储下一个地址 
	int address;//地址 
	bool flag;
}node[100010];
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;
	int cnt = 0;//用于统计有效节点个数 
	scanf("%d %d", &N, &head);
	for(int i = 0; i < N; i++){
		int tkey, tnext, taddress;
		scanf("%d %d %d", &taddress, &tkey, &tnext);
		node[taddress] = {tkey, tnext, taddress, false};
	} 
	for(int i = head; i != -1; i = node[i].next){
		cnt++;
		node[i].flag = true; 
	}
	if(cnt == 0){
		printf("0 -1");
	}else{
		sort(node, node+100010, cmp);
		printf("%d %05d\n", cnt, node[0].address);
		for(int i = 0; i < cnt; i++){
			if(i == cnt-1){
				printf("%05d %d -1", node[i].address, node[i].key);
			}else{
				printf("%05d %d %05d\n", node[i].address, node[i].key, node[i+1].address);
			}	
		}
	}
	return 0;
} 
posted @ 2020-02-03 18:07  睿晞  阅读(132)  评论(0)    收藏  举报