//21分
/*
00100 6 3
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
struct Node {//1
int address,data,next;
int order;
}node[maxn];
//(4)按单链表上的有效结点的序号排序 order 0 1 2 3...maxn-1
bool cmp(Node a,Node b) {
return a.order<b.order;
}
int main() {
//2)初始化
//初始化全部为无效结点
for (int i = 0; i < maxn; i++) {
node[i].order = 2 * maxn;
}
int s, n, r;
cin >> s >> n >> r;
for (int i = 0; i < n; i++) {
int address, data, next;
cin >> address >> data >> next;
node[address].address = address;
node[address].data = data;
node[address].next = next;
}
//(3)有效结点在单链表中的序号
int p;
int cntValid = 0;//cntValid计数有效结点的数目
for (p = s; p != -1; p = node[p].next) {//遍历链表,找出单链表的所有有效结点
node[p].order = cntValid++;//结点在单链表中的序号
}
//(4)将单链表 从头到尾排序
sort(node, node + maxn, cmp);
//for (int i = 0; i <n; i=i+r) {
//n=6
//k=3
//=>012 345
//sort(node + i, node + i + r);
//}
//cout << "---------------------" << endl;
//(5)单链表已经形成,下面是按照题目要求来进行输出
//正好分成n/r块,每块里面逆序输出
//n=6
//r=3
//n/r=2
//=>012 345
if (n % r == 0) {
for (int i = 0; i < n / r; i++) {
//i=0
//i=1
int j;
for (j = (i + 1) * r - 1; j > i * r; j--) {
//j=2,j>0=>2 1 (0)
//j=5,j>3=>5 4 (3)
printf("%05d %d %05d\n", node[j].address, node[j].data, node[j - 1].address);
}
//j=0//j=3
printf("%05d %d ", node[j].address, node[j].data);
if (i == n / r - 1) {
//最后一块的最后一个结点指向的下一个结点的指针指向-1
printf("-1\n");
}
else {
printf("%05d\n", node[(i + 2) * r - 1].address);
}
}
}
else {
//不能被整除,最后一块结点数量<r
//n=6
//r=4
//n/r=1
//=>0123 45
//除了最后一块
for (int i = 0; i < n / r; i++) {
//i=0
int j;
for (j = (i + 1) * r - 1; j > i * r; j--) {
//j=3,j>0=>3 2 1 (0)
printf("%05d %d %05d\n", node[j].address, node[j].data, node[j - 1].address);
}
//j=0
printf("%05d %d %05d\n", node[j].address, node[j].data,node[(i+1)*r].address);
}
//最后一块
for (int i =(n / r)*r; i < n; i++) {
//i=4//i<6=>4 5
if (i == n - 1) {
printf("%05d %d -1\n", node[i].address, node[i].data);
}
else {
printf("%05d %d %05d\n", node[i].address, node[i].data, node[(i + 1)].address);
}
}
}
return 0;
}
/*
00100 6 3
00000 4 99999
00100 1 12309
68237 6 - 1
33218 3 00000
99999 5 68237
12309 2 33218
-------------------- -
33218 3 12309
12309 2 00100
00100 1 68237
68237 6 99999
99999 5 00000
00000 4 - 1
*/
/*
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
---------------------
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
*/
/*
for (int i = 0; i < n / r; i++) {
//0 1
//枚举完整的n/r块(除了每一块的最后一个结点)
int j;
for (j = (i + 1) * r - 1; j > i * r; j--) {
//i=0
//j=1*3-1=2//j>0
//2 1
//i=1
//j=2*3-1=5//j=1*3>3
//5 4
printf("%05d %d %05d\n", node[j].address, node[j].data, node[j - 1].address);
}
//j=0
//j=3
//每一块的最后一个结点
printf("%05d %d ", node[j].address, node[j].data);
//1.中间块
if (i < n / r - 1) {
//下一块的最后一个结点
printf("%05d\n", node[(i+2)*r-1].address);
}
else {
//2.最后一块
if (n % r == 0) {
//最后1个结点
cout << "-1\n";
}
else {
//剩下不完整的块按原先的顺序输出
printf("%05d\n", node[(i + 1) * r].address);
for (int i = n / r * r; i < n; i++) {
printf("%05d %d ", node[i].address,node[i].data);
if (i < n - 1)
printf("%05d\n", node[(i + 1)].address);
else
cout << "-1\n";
}
}
}
}
*/
//for (int i = 0; i < n; i++) {
//cout << node[i].data << "->";
//}
|静态链表|(21/25)1074 Reversing Linked List (25分)
最新推荐文章于 2022-02-20 00:14:57 发布