1、视作链表模板题,分类转成排序
#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
struct node{
int address,data,next;
int fen;
int order;
}listn[maxn];
bool cmp(node a,node b){
if(a.fen!=b.fen) return a.fen<b.fen;
else return a.order<b.order;
}
int main(){
int begin,n,k;
scanf("%d %d %d",&begin,&n,&k);
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
scanf("%d %d",&listn[x].data,&listn[x].next);
listn[x].address=x;
}
for(int i=0;i<maxn;i++){
listn[i].fen=maxn;listn[i].order=maxn;
}
int p=begin;int num=0;
while(p!=-1){
listn[p].order=num++;
if(listn[p].data<0) listn[p].fen=0;
else if(listn[p].data<=k) listn[p].fen=1;
else listn[p].fen=2;
p=listn[p].next;
}
sort(listn,listn+maxn,cmp);
for(int i=0;i<num;i++){
if(i!=num-1) printf("%05d %d %05d\n",listn[i].address,listn[i].data,listn[i+1].address);
else printf("%05d %d -1\n",listn[i].address,listn[i].data);
}
return 0;
}
2、用vector将节点按题目要求顺序push_back
这里的一些操作可以学习下,起码不要不知道(匿名结构体变量啊~赋值啊~)
#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
struct node{
int address,data,next;
}d[maxn];
vector<node> v,ans;
int main(){
int start,n,k;
int a,b,c;
scanf("%d %d %d",&start,&n,&k);
for(int i=0;i<n;i++){
scanf("%d %d %d",&a,&b,&c);
d[a]={a,b,c};//还可以这样赋值
}
//首先把节点按顺序串起来
for(;start!=-1;start=d[start].next)
v.push_back(d[start]);
//按三种类型,三次push
for(int i=0;i<v.size();i++)
if(v[i].data<0) ans.push_back(v[i]);
for(int i=0;i<v.size();i++)
if(v[i].data>=0&&v[i].data<=k) ans.push_back(v[i]);
for(int i=0;i<v.size();i++)
if(v[i].data>k) ans.push_back(v[i]);
for (int i=0;i<ans.size()-1;i++)
printf("%05d %d %05d\n", ans[i].address, ans[i].data, ans[i + 1].address);
printf("%05d %d -1\n", ans[ans.size() - 1].address, ans[ans.size() - 1].data);
return 0;
}