题目:http://www.patest.cn/contests/pat-a-practise/1097
数据结构题,用数组模拟链表,难点是移到删除链表中时别搞晕了
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
//59ms 2688kb
bool appeared[10010]; //记录某个绝对值是否出现过
struct Node
{
int value;
int next;
}nodes[100000]; //数组下标模拟地址
int main()
{
Node *first=new Node,*removed_first=new Node;
int n;
scanf("%d%d",&first->next,&n);
int addr;
for (int i=0;i<n;i++)
{
scanf("%d",&addr);
scanf("%d%d",&nodes[addr].value,&nodes[addr].next);
}
Node* now=first;
Node* pre;
Node* removed=removed_first;
do{
pre=now;
now=&nodes[now->next];
if (!appeared[abs(now->value)])
appeared[abs(now->value)]=true;
else
{
removed->next=pre->next; //加入删除链表
removed=now;
pre->next=now->next; //在原链表中删除
now=pre; //不写这句会导致下次循环开始时pre被赋值为now这个已被删除的节点
}
}while (now->next!=-1);
removed->next=-1;
for (int i=0;i<2;i++)
{
addr= i==0? first->next : removed_first->next ;
while (addr!=-1)
{
char s[6];
if (nodes[addr].next==-1)
sprintf(s,"-1");
else
sprintf(s,"%05d",nodes[addr].next);
printf("%05d %d %s\n",addr,nodes[addr].value,s);
addr=nodes[addr].next;
}
}
return 0;
}