Files
PAT/PATBasic/1075.c
T
2017-10-29 16:23:51 +08:00

86 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 1075. 链表元素分类(25)
*
* 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的
* 前面,而[0, K]区间内的元素都排在大于K的元素前面。但每一类内部元素的顺序是不能改变
* 的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2K为10,则输出应该为
* -4→-6→-2→7→0→5→10→18→11。
*
* 输入格式:
*
* 每个输入包含1个测试用例。每个测试用例第1行给出:第1个结点的地址;结点总个数,即正整
* 数N (<= 105);以及正整数K (<=1000)。结点的地址是5位非负整数,NULL地址用-1表示。
*
* 接下来有N行,每行格式为:
*
* Address Data Next
*
* 其中Address是结点地址;Data是该结点保存的数据,为[-105, 105]区间内的整数;Next
* 是下一结点的地址。题目保证给出的链表不为空。
*
* 输出格式:
*
* 对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与
* 输入相同。
*
* 输入样例:
* 00100 9 10
* 23333 10 27777
* 00000 0 99999
* 00100 18 12309
* 68237 -6 23333
* 33218 -4 00000
* 48652 -2 -1
* 99999 5 68237
* 27777 11 48652
* 12309 7 33218
* 输出样例:
* 33218 -4 68237
* 68237 -6 48652
* 48652 -2 12309
* 12309 7 00000
* 00000 0 99999
* 99999 5 23333
* 23333 10 00100
* 00100 18 27777
* 27777 11 -1
**/
#include <stdio.h>
int main()
{
int data[100000] = {0}, next[100000] = {0},
firstaddr, addr, lastaddr = -1, N, K;
/* Read */
scanf("%d %d %d", &firstaddr, &N, &K);
for(int i = 0; i < N; i++)
{
scanf("%d", &addr);
scanf("%d %d", data + addr, next + addr);
}
/* Scan three times */
for(int i = 0; i < 3; i++)
{
/* Scan along the linked list */
for(addr = firstaddr; addr != -1; addr = next[addr])
{
/* If the number fits the condition */
if((i == 0 && data[addr] < 0)
|| (i == 1 && 0 <= data[addr] && data[addr] <= K)
|| (i == 2 && data[addr] > K))
{
/* Print */
if(lastaddr != -1) printf(" %05d\n", addr);
printf("%05d %d", addr, data[addr]);
lastaddr = addr;
}
}
}
printf(" -1");
return 0;
}