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

博客介绍了一道题的解题思路。先定义静态链表,用bool型变量flag表示结点是否在链表中出现,初始化为false。接着从链表首地址遍历,标记有效结点的flag为true并计数。然后对结点排序,有无效结点时按flag从大到小排,否则按数据域从小到大排,最后按要求输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

【思路】

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值