pat1052Linked List Sorting (25)

56 篇文章 0 订阅

题意分析:

(1)给出内存中链表的节点,节点定义为:address value nextaddress并且给出链表的起始地址,按照原来的格式输出这个链表经过按照value排序后的链表,即:链表节点的个数 起始地址以及每个链表的节点

(2)因为涉及到链表节点的排序,先将链表的定义包装成结构体,然后按照value值进行排序,因为排序后address域没有发生变化,而nextAddress域变成了排序后下一个节点的address

坑能坑点:

这题的坑点还是蛮多的,主要在以下几个方面设坑:

(1)输入的节点并非全部都是链表中的节点,也就是所给的链表的节点个数可能比N要少

(2)由于(1)坑的存在,因此不能简单对节点输入完成后进行排序,而因该将属于链表中的节点存储后排序

(3)由于(2)要塞选出链表中的节点,而将五位数的地址作为节点数组索引有可能造成溢出段错误,因此需要借助map容器存储结点后来根据首地址来一个个索引。

(4)最大的坑点:当遇到首地址为-1或者根本没有节点时(N=0)时,不要忘记要进行特殊处理:直接输出0 -1.

(5)涉及到数据量大时,建议使用scanf和printf,不要使用cin和cout

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <map>
using namespace std;
struct Node
{
    int value;
    int address;
    int next;
};
Node nodes[100001];
map<int,Node>mp;
bool cmp(Node a,Node b)
{
    if(a.value!=b.value)return a.value<b.value;
}
int main()
{
    int N,start,i=0,j=0;
    scanf("%d %d",&N,&start);
    Node temp;
    while(i<N)
    {
        scanf("%d %d %d",&temp.address,&temp.value,&temp.next);
        mp[temp.address]=temp;
        i++;
    }
    if(start==-1||N==0)
    {
        printf("%d %d\n",0,-1);
        return 0;
    }
    while(start!=-1)
    {
        nodes[j]=mp[start];
        start=mp[start].next;
        j++;
    }
    sort(&nodes[0],&nodes[j],cmp);
    printf("%d %05d\n",j,nodes[0].address);
    for(int i=0;i<j-1;i++)printf("%05d %d %05d\n",nodes[i].address,nodes[i].value,nodes[i+1].address);
    printf("%05d %d %d\n",nodes[j-1].address,nodes[j-1].value,-1);
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值