PAT——A1052 Linked List Sorting(静态链表)

题目链接:

【思路】

①定义静态链表,其中结点性质由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;
}

猜你喜欢

转载自blog.csdn.net/qq_42232118/article/details/82113960