L2-002 链表去重 (25分)

 

 

 

 解题思路:

1、注意到结点地址是固定5位整数,故输入数据可以按地址存放。

2、键值<=10000,故可用辅助数组按键值标记重复出现的键值

3、用两个辅助数组分别存放去重后的链表、被删除的链表

4、分别打印

#include <stdio.h>
#define Max 100000
typedef struct{
    int addr,data,next;
}Node;

int main()
{
    int pos,n;
    int i,j=0,k=0;
    int k1=0,k2=0;
    Node list[Max];
    Node tmp[Max],del[Max];
    int x,y,z;
    int vis[Max]={0};
    scanf("%d%d",&pos,&n);
    
    for(i=0;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        list[x].addr=x;
        list[x].data=y;
        list[x].next=z;
    }
    for(i=pos;pos!=-1;pos=list[pos].next)
    {
        if(!vis[abs(list[pos].data)])
        {
            vis[abs(list[pos].data)]=1;
            tmp[k1++]=list[pos];
        }
        else
        {
            del[k2++]=list[pos];
            
        }
    }
    

    for(i=0;i<k1;i++)
    {
        if(i!=k1-1)
        printf("%05d %d %05d\n",tmp[i].addr,tmp[i].data,tmp[i+1].addr);
        else
        printf("%05d %d -1\n",tmp[i].addr,tmp[i].data);
    }
    for(i=0;i<k2;i++)
    {
        if(i!=k2-1)
        printf("%05d %d %05d\n",del[i].addr,del[i].data,del[i+1].addr);
        else
        printf("%05d %d -1\n",del[i].addr,del[i].data);
    }
    return 0;
}

 

 

posted @ 2020-04-23 15:19  跃鱼  阅读(631)  评论(0编辑  收藏  举报