《算法笔记》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;
}