PAT 1052. Linked List Sorting

题目:http://pat.zju.edu.cn/contests/pat-a-practise/1052

题解:

模拟链表按值排序

注意:可能给多个链表,只要输出与头地址相连的部分

            可能输入的长度为0

代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x6fffffff
struct point
{
    char add[10];//当前结点地址
    int num;//当前结点值
    char nextx[10];//下个结点地址
    int idx;
} node[100005];
map<string,int> mapx;
bool cmpIdx(const struct point &a,const struct point &b)
{
    return a.idx<b.idx;
}
bool cmpValue(const struct point &a,const struct point &b)
{
    return a.num<b.num;
}
int main()
{
    int n,x,i;
    char st[10];
    string s;
    scanf("%d%s",&n,st);
    for(i=0; i<n; ++i)
    {
        scanf("%s%d%s",node[i].add,&node[i].num,node[i].nextx);
        mapx.insert(make_pair(string(node[i].add),i));
        node[i].idx=999999;
    }
    s=string(st);
    if(n==0||mapx.find(s)==mapx.end())//输入的链表长度为0或者输入的链表头地址有误
    {
        printf("0 -1\n");
    }
    else
    {
        for(i=1; s!="-1"; ++i)//找出了输入的链表头地址相连的部分
        {
            x=mapx.find(s)->second;
            node[x].idx=i;
            s=string(node[x].nextx);
        }
        sort(node,node+n,cmpIdx);//把上面求出的有效部分移动到前端
        n=i-1;
        sort(node,node+n,cmpValue);//对有效链表部分按值从小到大排序
        printf("%d %s\n",n,node[0].add);
        for(i=0; i<n; ++i)
        {
            printf("%s %d ",node[i].add,node[i].num);
            if(node[i+1].idx==999999||node[i+1].idx==0)//如果当前结点为最后一个结点或者当前下个结点为无效链表部分
            {
                printf("-1\n");
                break;
            }
            else
                printf("%s\n",node[i+1].add);
        }
    }
    return 0;
}

来源: http://blog.csdn.net/acm_ted/article/details/20507157


你可能感兴趣的:(PAT 1052. Linked List Sorting)