C语言入门题,我的代码循环出不来了,请问是什么问题,如何修改

7-1 链表去重 (25 分)

给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。

输入格式:

输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤100000 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。

随后 N 行,每行按以下格式描述一个结点:

地址 键值 下一个结点

其中地址是该结点的地址,键值是绝对值不超过10000​​ 的整数,下一个结点是下个结点的地址。

输出格式:

首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。

输入样例:

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

我的代码:

#include<stdio.h>


struct Node {
	int address;
	int data;
	int next;
};


struct Node A[100000];


int main() {
	int data[10000] = { 0 };
	int head, N;
	scanf("%d %d", &head, &N);
	int i;
	int address, dat, next;
	for (i = 0; i < N; i++) {
		scanf("%d %d %d", &address, &dat, &next);
		A[address].address = address;
		A[address].data = dat;
		A[address].next = next;
	}
	int cur = head;
	int tmp = A[cur].next;
	int head2,cur2;
	int flag = 1;
	data[A[cur].data] = 1;
	while (A[tmp].address != -1) {
		if (data[A[tmp].data] == 0) {
			data[A[tmp].data] = 1;
			tmp = A[tmp].next;
			cur = A[cur].next;
		}
		else if (data[A[tmp].data] == 1) {
			A[cur].next = A[tmp].next;
			if (flag) { 
				head2 = tmp
				cur2 = head2;
				flag = 0;
			}
			else {
				A[cur2].next = tmp;
				cur2 = A[cur2].next;
			}
			tmp = A[cur].next;
		}
	}
	cur = head;
	cur2 = head2;
	while (A[cur].next != -1) {
		printf("%d ", A[cur].data);
		cur = A[cur].next;
	}
	printf("\n");
	while (A[cur2].next != -1) {
		printf("%d ", A[cur2].data);
		cur2 = A[cur2].next;
	}
}