Solution:
这道题我竟然真的用链表+指针过了。。。。。真是模拟了链表。。没谁了
不熟悉指针的最好别借鉴了。。不说了,代码如下:
//链表排序
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n,h;
int num=1;
struct node_x{
int key;//键值
int address;//当前结点的地址
int next;
}a[100005],b[100005];
bool flag[100005];
struct node{
int key;
node *next;
int address;
int ne;
};
node *head,*p;
void init(){//初始化
head=new node;
p=new node;
p=head;
head->next=NULL;
head->key=0;
for(int i=0;i<num;i++){//插入
node *x=new node;
p->next=x;
p=x;
x->key=b[i].key;
x->address=b[i].address;
x->ne=b[i].next;
x->next=NULL;
}
}
bool cmp(node_x a,node_x b){
return a.key<b.key;
}
void traversal(){
node *q=new node;
q=head->next;
printf("%d %05d\n",num,q->address);
while(q!=NULL&&q->next!=NULL){
printf("%05d %d %05d\n",q->address,q->key,q->next->address);
q=q->next;
}
printf("%05d %d -1",q->address,q->key);
}
int main(){
cin>>n>>h;
if(h==-1){
cout<<"0 -1";
return 0;
}
for(int i=0;i<100005;i++){
flag[i]=false;
}
int pos;//找到头结点位置
int address;
bool f=false;
for(int i=0;i<n;i++){
cin>>address;
cin>>a[address].key>>a[address].next;
a[address].address=address;
flag[address]=true;
if(address==h){
f=true;
pos=address;
}
}
if(!f){
cout<<"0 -1";
return 0;
}
b[0].address=a[pos].address;
b[0].key=a[pos].key;
b[0].next=a[pos].next;
int nn=n;
while(nn--){
if(flag[a[pos].next]){
int temp=a[pos].next;
b[num].address=temp;
b[num].key=a[temp].key;
b[num].next=a[temp].next;
num++;
pos=temp;
}
}
sort(b,b+num,cmp);
init();
traversal();//遍历链表
return 0;
}