题记
思路: 1.建立结点结构体,存储该结点的位置,值,下一个结点的位置,写一个"<"重载,后面优先队列队列就会自动地排序2.根据头结点遍历一遍这个链表,并把链表中的结点放入利用优先队列当中
3.最后是输出,如果记录的num(链表上有效的结点数目)为0,输出"0 -1",如果不为0,先输出num和队列里的第一个结点的位置,之后循环,先输出队列最前面的结点的位置和值,先别急着输出下一个结点的位置,因为这是一个新的值,而我们并没有改变next,所以先判断一下还有几个结点在队列里,如果还有,就先弹出最前面的结点,再把队列的第一个结点的address当做上一个结点的next,注意用%05d;如果当前结点就是最后一个节点那么输出-1并且换行。
注意事项: 1.一定要遍历一遍再加到队列里,因为可能存在无效的点,也就是不在这条链表里冗余的、连不起来的点 2.一定不要忘记全部结点都无效的情况(头结点的位置就是-1的情况),这时候最好单独分支写出来,因为-1要求的是-1而不是带前导0的-1
代码如下
#include <iostream>
#include <queue>
using namespace std;
const int Maxn=100000+10;
struct Node{
int address,next;
int key;
//重载运算符
friend bool operator <(Node n1,Node n2){
return n1.key>n2.key;
}
}node[Maxn];
//优先队列
priority_queue<Node> q;
//输入
int n,head;
int main()
{
//链表上的结点个数
int num=0;
bool flag=false;//如果为true表示结点全部无效
scanf("%d %d",&n,&head);
int key,address,next;
Node temp;
for(int i=0;i<n;i++){
scanf("%d %d %d",&address,&key,&next);
node[address].address=address;
node[address].key=key;
node[address].next=next;
}
int i=head;
while(i!=-1){
temp.address=i;
temp.key=node[i].key;
temp.next=node[i].next;
q.push(temp);
num++;
if(node[i].next==-1)
break;
i=node[i].next;
}
if(num==0)
printf("%d %d\n",0,-1);
else{
printf("%d %05d\n",num,q.top().address);
while(1){
printf("%05d %d ",q.top().address,q.top().key);
num--;
if(num!=0){
q.pop();
printf("%05d\n",q.top().address);
}
else{
printf("-1\n");
break;
}
}
}
return 0;
}