pat-链表去重

以结构体数组来模拟链表,通过赋值index然后排序来确定先后顺序,输出的时候注意链表断裂的情况如何处理

#include
using namespace std;
typedef long long ll;
typedef pair p;
const int maxn = 100005;
const int INF = 0x3f3f3f3f;

int i, j, n, x, cnt1 = 0, cnt2 = 0, cnt, addr, flag[maxn] = {0};

struct node
{
    int value;
    int adr;
    int next;
    int num;
    bool operator < (const node &y) const
    {
        return num < y.num;//通过以index排序来确定链表(结构体)的先后顺序
    }
}a[maxn];

int main()
{
    cin>>addr>>n;
    for(i = 0; i < maxn; i++)
    {
        a[i].num = 2 * maxn;
    }
    for(i = 0; i < n; i++)
    {
        cin>>x;
        a[x].adr = x;
        cin>>a[x].value>>a[x].next;
    }
    for(i = addr; i != -1; i = a[i].next)
    {
        int t = abs(a[i].value);
        if(!flag[t])
        {
            flag[t] = 1;
            a[i].num = cnt1;
            cnt1++;
        }
        else
        {
            a[i].num = maxn + cnt2;
            cnt2++;
        }
    }
    sort(a, a+maxn);
    int cnt = cnt1 + cnt2;
    for(i = 0; i < cnt; i++)
    {
        if(i != cnt1-1 && i != cnt-1)
            printf("%05d %d %05d\n", a[i].adr, a[i].value, a[i+1].adr);//因为中间会去掉重复的,所以next输出的是下一项的地址,避免链表断裂
        else
            printf("%05d %d -1\n", a[i].adr, a[i].value);.//两个链表的最后一项一定为-1
    }
    return 0;
}

你可能感兴趣的:(pat-链表去重)