自己想的,链表连接感觉比一开始简化了很多,顺便判断了起点
#include <iostream>
#include <vector>
using namespace std;
int main() {
int first,n,next[100000],data[100000],temp,k,cnt=0;
vector<int>v[3];
cin>>first>>n>>k;
for(int i=0;i<n;i++){
cin>>temp>>data[temp]>>next[temp];
}
temp=first;
while(temp!=-1){ //分类输入
if(data[temp]<0)v[0].push_back(temp);
else if(data[temp]<=k&&data[temp]>=0)v[1].push_back(temp);
else v[2].push_back(temp);
temp=next[temp];
}
temp=-1;
for(int i=0;i<3;i++){ //连接不同类链表元素
for(int j=0;j<v[i].size();j++){
if(temp!=-1){ //不是第一个链表元素
next[temp]=v[i][j]; //temp记录顺序遍历时的上一个节点
temp=v[i][j]; //更新temp
}else{temp=v[i][j];first=temp;} //链表起始先赋值,顺便记录起点后面输出时while循环
}
}
next[temp]=-1; //处理最后一个元素的next=-1
temp=first;
while(next[temp]!=-1){
printf("%05d %d %05d\n",temp,data[temp],next[temp]);
temp=next[temp];
}
printf("%05d %d %d\n",temp,data[temp],next[temp]); //输出最后一个-1
system("pause");
return 0;
}
参考柳神的,但其实有点难想,不用连接链表,直接把输出分开看待
#include <iostream>
#include <vector>
using namespace std;
int main() {
int first,n,next[100000],data[100000],temp,k;
vector<int>v[3];
cin>>first>>n>>k;
for(int i=0;i<n;i++){ cin>>temp>>data[temp]>>next[temp]; }
temp=first;
while(temp!=-1){ //分类输入,有可能有不在链接中的点,所以用-1判断
if(data[temp]<0)v[0].push_back(temp);
else if(data[temp]<=k&&data[temp]>=0)v[1].push_back(temp);
else v[2].push_back(temp);
temp=next[temp];
}
int flag = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < v[i].size(); j++) {
if (flag == 0) {
printf("%05d %d ", v[i][j], data[v[i][j]]);
flag = 1;
} else {
printf("%05d\n%05d %d ", v[i][j], v[i][j], data[v[i][j]]);
}
}
}
cout<<"-1";
system("pause");
return 0;
}