18925 试卷排序(双向链表)

时间限制:1000MS  代码长度限制:10KB

题型: 编程题   语言: G++;GCC

Description

老师要将N张试卷重新排序,每张试卷都有编号为1∼N,采取如下的方法:
先将编号1的试卷放进队列,剩下从第2张到第N张依次放入队列,
放入的时候老师会把编号i的试卷插入到编号为x试卷之前或之后(x<i),
在老师完成这N-1次操作之后,请输出试卷序列的最终编号。

输入格式

第1行为一个正整数N,表示了有N张试卷。

第2-N行,第i行包含两个整数x,p,其中x为小于i的正整数,p为0或者1。
若p为0,则表示将编号为i的试卷放入编号为x试卷的左边,为1则放入x试卷的右边。

输出格式

输出N个整数,表示完成插入后试卷系列中试卷的编号(1<=N<=100000)。

输入样例

4
1 0
2 1
1 0

输出样例

2 3 4 1

提示

4张试卷。第二行1,0,将编号2的试卷放入编号1的左边,则序列为2  1;
第三行2,1,将编号3试卷放入编号2试卷的右边,则序列为2 3 1;
第四行1 0,将编号4的试卷放入编号1的左边,则序列为2 3 4 1。

思路:使用顺序表记录第x张卷子的位置,弥补链表不能随机访问的缺点。

#include <iostream>//C++
using namespace std;
/*
4
1 0
2 1
1 0
*/
typedef struct Lnode    //定义链结点
{
    int m_data;
    struct Lnode *prev, *next;
};

int main()
{
    int N;
    int x, p;
    scanf("%d", &N);    //N张试卷
    Lnode* List[N];  //用于存放链表结点

    Lnode *head = new Lnode;    //创建头结点
    Lnode *L, *it;   //定义一个Lnode指针用于后续结点插入
    L = new Lnode;
    L->m_data = 1;
    head->next = L;
    L->next = head;
    head->prev = L;
    L->prev = head;//创建循环链表方便插入结点

    List[0] = L; //将第一张卷子放入顺序表


    for(int i = 1; i < N; ++i)
    {
        scanf("%d %d", &x, &p);
        L = new Lnode;  //开辟新空间插入第(i+1)张试卷
        L->m_data = i+1;
        it = List[x-1]; //让it指向当前第x张试卷

        if(p)//插入x试卷右边
        {
            L->next = it->next;
            L->next->prev = L;
            L->prev = it;
            it->next = L;
        }
        else//插入x试卷左边
        {
            L->prev = it->prev;
            L->prev->next = L;
            L->next = it;
            it->prev = L;
        }
        List[i] = L;    //将L写入顺序表
    }

    L = head->next;
    while(L != head)
    {
        printf("%d ", L->m_data);
        L = L->next;
    }
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值