题目描述
链接
给出一个链表,将链表排序,然后把链表上的结点按照data值的从小到大顺序输出
分析
- 定义静态链表的结构体,地址作为下标,注意,这里还需要记录address,为什么?因为排序以后下标不是地址了
- 同时定义flag变量,因为给出的结点有些根本不在链表中,所以需要再遍历一次(另一种遍历的写法看下面的代码),标记有效结点,同时统计结点个数保存在cnt中,方便下面遍历和特判0 -1的情况
- 排序的实现:链表的地址是分散的,所以要对node+maxn排序,按照data值,排序后下标不再是地址,所以要用add成员变量记录原来的地址,同时存在无效结点,所以用flag标识,cmp函数可以把flag=1的放在一起,flag=0的放在后面,从而使有效结点连续存放
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
struct Node{
int add,data,next;
bool flag;
}node[maxn];
bool cmp(Node a, Node b){
if(a.flag != b.flag) return a.flag > b.flag;
return a.data < b.data;
}
int main(){
int n, st,cnt = 0;
cin>>n>>st;
int add,data,next;
for(int i=0;i<n;i++){
cin>>add>>data>>next;
node[add] = {add, data, next, false}; //新的结构体赋值方法!!学到了
}
for(int i=st; i!=-1; i=node[i].next){ //遍历,新的方式!!学到了
node[i].flag = true;
cnt++;
}
if(cnt==0) printf("0 -1
"); //全是无效结点
else{
sort(node, node+maxn, cmp);
printf("%d %05d
",cnt,node[0].add);
for(int i=0;i<cnt-1;i++){
printf("%05d %d %05d
",node[i].add, node[i].data, node[i+1].add);
}
printf("%05d %d -1
",node[cnt-1].add, node[cnt-1].data);
}
}