题意分析:
(1)给出内存中链表的节点,节点定义为:address value nextaddress并且给出链表的起始地址,按照原来的格式输出这个链表经过按照value排序后的链表,即:链表节点的个数 起始地址以及每个链表的节点
(2)因为涉及到链表节点的排序,先将链表的定义包装成结构体,然后按照value值进行排序,因为排序后address域没有发生变化,而nextAddress域变成了排序后下一个节点的address
坑能坑点:
这题的坑点还是蛮多的,主要在以下几个方面设坑:
(1)输入的节点并非全部都是链表中的节点,也就是所给的链表的节点个数可能比N要少
(2)由于(1)坑的存在,因此不能简单对节点输入完成后进行排序,而因该将属于链表中的节点存储后排序
(3)由于(2)要塞选出链表中的节点,而将五位数的地址作为节点数组索引有可能造成溢出段错误,因此需要借助map容器存储结点后来根据首地址来一个个索引。
(4)最大的坑点:当遇到首地址为-1或者根本没有节点时(N=0)时,不要忘记要进行特殊处理:直接输出0 -1.
(5)涉及到数据量大时,建议使用scanf和printf,不要使用cin和cout
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <map>
using namespace std;
struct Node
{
int value;
int address;
int next;
};
Node nodes[100001];
map<int,Node>mp;
bool cmp(Node a,Node b)
{
if(a.value!=b.value)return a.value<b.value;
}
int main()
{
int N,start,i=0,j=0;
scanf("%d %d",&N,&start);
Node temp;
while(i<N)
{
scanf("%d %d %d",&temp.address,&temp.value,&temp.next);
mp[temp.address]=temp;
i++;
}
if(start==-1||N==0)
{
printf("%d %d\n",0,-1);
return 0;
}
while(start!=-1)
{
nodes[j]=mp[start];
start=mp[start].next;
j++;
}
sort(&nodes[0],&nodes[j],cmp);
printf("%d %05d\n",j,nodes[0].address);
for(int i=0;i<j-1;i++)printf("%05d %d %05d\n",nodes[i].address,nodes[i].value,nodes[i+1].address);
printf("%05d %d %d\n",nodes[j-1].address,nodes[j-1].value,-1);
return 0;
}