【思路】
①定义静态链表,其中结点性质由bool型变量flag定义
表示为结点在链表中是否出现
flag为false表示无效结点(不在链表上的点)
②初始化,令flag均为false(即0)
表示初始状态下所有结点都是无效结点
③由题目给出的链表首地址begin遍历整条链表
并标记有效结点的flag为true
(即1),同时计数有效结点的个数count
④对结点进行排序,排序函数cmp的原则是:
如果cmp的两个参数结点中有无效结点的话,则按flag从大到小排序
以把有效结点排到数组左端(因为有效结点的flag为1,大于无效结点的flag)
否则按数据域从小到大排序
⑤由于有效结点已经按照数据域从小到大排序
因此按要求输出即可
#include<utility>
#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define maxn 100010
struct node{
int data;
int next;
int address;
bool flag;
}Node[maxn];
bool cmp(node a,node b)
{
if(a.flag==false||b.flag==false)
return a.flag>b.flag;
else
return a.data<b.data;
}
int main()
{
for(int i=0;i<maxn;i++)
{
Node[i].flag=false;
}
int s,n;
scanf("%d%d",&n,&s);
int address,next;
while(n--)
{
scanf("%d",&address);
scanf("%d%d",&Node[address].data,&Node[address].next);
Node[address].address=address;
}
int count=0;
int p=s;
while(p!=-1)
{
Node[p].flag=true;
count++;
p=Node[p].next;
}
if(count==0)
{
printf("0 -1");
}
else
{
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);
}
}
return 0;
}