傳送門: https://www.patest.cn/contests/gplt/L2-002
給定一個帶整數鍵值的單鏈表L,本題要求你編寫程序,刪除那些鍵值的絕對值有重複的結點。即對任意鍵值K,只有鍵值或其絕對值等於K的第一個結點可以被保留。同時,所有被刪除的結點必須被保存在另外一個鏈表中。例如:另L爲21→-15→-15→-7→15,則你必須輸出去重後的鏈表21→-15→-7、以及被刪除的鏈表-15→15。
輸入格式:
輸入第一行包含鏈表第一個結點的地址、以及結點個數N(<= 105 的正整數)。結點地址是一個非負的5位整數,NULL指針用-1表示。
隨後N行,每行按下列格式給出一個結點的信息:
Address Key Next
其中Address是結點的地址,Key是絕對值不超過104的整數,Next是下一個結點的地址。
輸出格式:
首先輸出去重後的鏈表,然後輸出被刪除結點組成的鏈表。每個結點佔一行,按輸入的格式輸出。
輸入樣例:
00100 5
99999 -7 87654
23854 -15 00000
87654 15 -1
00000 -15 99999
00100 21 23854
輸出樣例:
00100 21 23854
23854 -15 99999
99999 -7 -1
00000 -15 87654
87654 15 -1
數據不大 可以結構體存儲 結構體的下標 就是他的地址
裏面存儲 2個信息 值data 和 下一個的地址next
將出現過的存入結構體數組a 中 沒有出現過得 存入結構體b中 , 分別輸出就好
code:
#include<iostream>
#include<queue>
#include<string>
#include<memory.h>
#include<math.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
struct node1
{
int data;
int next;
} map[100005];
int a[100005],b[100005];
int vis[100005];
int p,x,y,n,m;
int init()
{
for(int i=0; i<m; i++) //輸入
{
cin>>p>>x>>y;
map[p].data=x;
map[p].next=y;
}
}
int main()
{
cin>>n>>m;
init();
memset(vis,0,sizeof(vis));
int temp=n,ka=0,kb=0;
while(temp!=-1)
{
int t=abs(map[temp].data);
if(vis[t]==0)//如果沒有出現
{
vis[t]=1;//標記爲1
a[ka++]=temp;//將地址存入數組a
}
else//出現
b[kb++]=temp;//將地址存入數組b
temp=map[temp].next;
}
printf("%05d %d ",a[0],map[a[0]].data);
for(int i=1;i<ka;i++)
{
printf("%05d\n",a[i]);
printf("%05d %d ",a[i],map[a[i]].data,map[a[i]].next);
}
cout<<-1<<endl;
if(kb>0)
{
printf("%05d %d ",b[0],map[b[0]].data);
for(int i=1;i<kb;i++)
{
printf("%05d\n",b[i]);
printf("%05d %d ",b[i],map[b[i]].data,map[b[i]].next);
}
cout<<-1<<endl;
}
}