题目链接:
题目大意:
要求找出一个线性表中的结点数据绝对值重复的结点,仅保留第一个,其余的按地址连接的顺序去除,并且连接成另一个线性表。
分析:
水题,用数组下标模拟地址。遍历去重时,利用set不能放重复元素的特性进行判断,如果不能插入结点数据,证明是重复的,模拟链表删除一个结点。
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<set>
using namespace std;
struct Node
{
int _val;
int _nextAdr;
};
Node list[100005];
struct Mark
{
int _curAdr;
int _val;
int _nextAdr;
};
Mark delNode[100005];
int main()
{
int staAdr;
int n;
set<int> s;
scanf("%d%d",&staAdr,&n);
int adr;
while (n--)
{
scanf("%d",&adr);
scanf("%d%d",&list[adr]._val,&list[adr]._nextAdr);
}
int curAdr = staAdr;
int val;
int size;
int preAdr = 0;
int cnt = 0;
while (curAdr != -1)
{
val = list[curAdr]._val;
val = val > 0 ? val : -val;
size = s.size();
s.insert(val);
if (size == s.size())
{
list[preAdr]._nextAdr = list[curAdr]._nextAdr;
delNode[cnt]._curAdr = curAdr;
delNode[cnt]._val = list[curAdr]._val;
delNode[cnt]._nextAdr = -1;
if (cnt > 0)
{
delNode[cnt - 1]._nextAdr = curAdr;
}
cnt++;
}
else
{
preAdr = curAdr;
}
curAdr = list[curAdr]._nextAdr;
}
curAdr = staAdr;
while (list[curAdr]._nextAdr != -1)
{
printf("%05d %d %05d\n", curAdr, list[curAdr]._val, list[curAdr]._nextAdr);
curAdr = list[curAdr]._nextAdr;
}
//curAdr = list[curAdr]._nextAdr;
printf("%05d %d -1\n", curAdr, list[curAdr]._val);
for (int i = 0; i < cnt; i++)
{
printf("%05d %d",delNode[i]._curAdr,delNode[i]._val);
if (delNode[i]._nextAdr == -1)
{
printf(" -1\n");
}
else
{
printf(" %05d\n",delNode[i]._nextAdr);
}
}
return 0;
}