链表应用--PAT.1097.Deduplication on a Linked List

来源:互联网 发布:淘宝如何打印发货单 编辑:程序博客网 时间:2024/06/03 20:30
/**********************3stone***************************Problem: PAT.1097. Deduplication on a Linked List (25) Author:3stoneTime:2017/3/6 思路:【order:记录点的序号】  0、遍历链表,给order赋值  1、用map<int, bool>记录这个值是否出现过 2、用两个queue分别记录保留节点和删除节点的序号 ***********************3stone***************************/#include<cstdio>#include<algorithm>#include<map>#include<queue>#define maxSize 100010using namespace std;struct P{    int st, data, ed;    int order;}point[maxSize];bool cmp1(P a, P b){    return a.order < b.order;}map<int, bool> value;queue<int> keep_que, del_que;int main(){    int n, start;    while(scanf("%d%d", &start, &n) != EOF){        for(int i = 0; i < maxSize; i++)//初始化序号             point[i].order = maxSize;        value.clear();//清空 map & queue         while(del_que.empty() == false) del_que.pop();         while(keep_que.empty() == false) keep_que.pop();        for(int i = 0; i < n; i++){//输入数据             int ad;            scanf("%d", &ad);            point[ad].st = ad;            scanf("%d%d", &point[ad].data, &point[ad].ed);        }//for - i 输入数据         int num = 0; //遍历链表,记录序号         for(int pre = start; pre != -1; pre = point[pre].ed){            point[pre].order = ++num;        }        sort(point, point + maxSize, cmp1);        for(int i = 0; i < num; i++){            int temp = point[i].data;            if(value.find(abs(temp)) == value.end()){//此值第一次出现                 value[abs(temp)] = true;                keep_que.push(i);//入队列             }            else{//已出现过                del_que.push(i);            }         }        int now_p, next_p;        while(keep_que.size() > 1){//输出保留链表             now_p = keep_que.front();            keep_que.pop();            next_p = keep_que.front();            printf("%05d %d %05d\n", point[now_p].st, point[now_p].data, point[next_p].st);        }        if(keep_que.size() != 0){//输出最后一个点                                //防止链表只有一个点,所以要加判断             now_p = keep_que.front();            printf("%05d %d -1\n", point[now_p].st, point[now_p].data);        }         while(del_que.size() > 1){//输出删除链表             now_p = del_que.front();            del_que.pop();            next_p = del_que.front();            printf("%05d %d %05d\n", point[now_p].st, point[now_p].data, point[next_p].st);        }        if(del_que.size() != 0){            now_p = del_que.front();            printf("%05d %d -1\n", point[now_p].st, point[now_p].data);         }    }//while    return 0;} 
0 0