(算法练习)——PAT A1052 Linked List Sorting

《算法笔记》P265
存疑:
1、排序规则那里,无效节点放到后面去,什么意思?

#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = 100005;

struct NODE{
	int address,data,next;
	bool flag;
}node[maxn];

bool cmp(NODE a,NODE b){
	if(a.flag == false || b.flag == false){
		return a.flag > b.flag;//只要a和b中有一个无效节点,就把它放到后面去 
	}
	else{
		return a.data < b.data;//如果都是有效节点,则按要求排序 
	}
}

int main(){
	for(int i = 0;i <maxn;i++){
		node[i].flag = false;
	}
	int n,begin,address;
	scanf("%d%d",&n,&begin);
	for(int i = 0;i <n;i++){
		scanf("%d",&address);
		scanf("%d%d",&node[address].data,&node[address].next);
		node[address].address = address;
	}
	int count = 0,p = begin;
	//枚举链表,对flag进行标记,同时计数有效节点个数
	while(p != -1){
		node[p].flag = true;
		count++;
		p = node[p].next;
	}
	if(count == 0){//特别判断,新链表中没有节点时输出0 -1 
		printf("0 -1");
	}
	else{
		//筛选有效节点,按data从小到大排序 
		sort(node,node+maxn,cmp);
		printf("%d %05d\n",count,node[0].address);//输出节点个数、首节点地址 
		for(int i = 0;i <count;i++){
			if(i != count - 1){//如不为最后一个节点 
				printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
			}
			else{
				printf("%05d %d -1\n",node[i].address,node[i].data);//最后一个节点,单独输出-1 
			}
		}
	}
	return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值