A1052 Linked List Sorting (25分)

/*
題意:
1、給出N和首地址
2、然后給出靜態(tài)鏈表
要求按key從小到大排列

解題:
1、按要求輸入
2、排序倒是沒什么問題,但是如何修改next

learn && wrong:
1、如何排序呢——排序后輸出I+1的address,服了
2、注意用if(count != -1),特例輸出-1,記住就像最后一個不要空格就行了
3、題目存在無效節(jié)點,不過沒關系
4、需要特判,0 -1的情況
5、還有,先讀入address,然后再address,加data,next,在修改address流程
6、輸出要用count統(tǒng)計一下
7、流程:全部置為false-讀入-while循環(huán)-特判輸出
*/

include <iostream>

include <cstdio>

include <algorithm>

using namespace std;
const int maxn = 100010;
struct Node{
int data;
int address;
int next;
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 n, begin,address;
scanf("%d%d",&n,&begin);

for(int i = 0;i < n;++i){       //輸入所有鏈表!!!
    scanf("%d",&address);
    scanf("%d%d",&node[address].data,&node[address].next);
    node[address].address = address;
}

int count = 0,p = begin;
//枚舉鏈表,對flag進行標記,同時計數(shù)有效節(jié)點個數(shù)(步驟3)
while(p != -1){ //!!!
    node[p].flag = true;
    count++;
    p = node[p].next;
}
if(count == 0){ //特判,表中沒有節(jié)點
    cout<<"0 -1"<<endl;
}else{
    //篩選有效節(jié)點,并按data從小到大排序(步驟4
    sort(node,node + maxn,cmp);
    printf("%d %05d\n",count,node[0].address);  //防止-1被%05d化,提前判斷
    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;

}

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容