标签:while 线性 key test color each follow base describe
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤) which is the total number of nodes, and a positive K (≤) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address
is the position of the node, Data
is an integer, and Next
is the position of the next node.
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
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
提交代码:
#include <stdio.h> #include <stdlib.h> #define Null -1 #define MAXSIZE 100000 typedef int ElemType; typedef int Ptr; struct LISTNODE { ElemType key; int next; }list[MAXSIZE]; int GetLength(Ptr start) { int count = 0; Ptr next = start; while (next != Null) { count++; next = list[next].next; } return count; } //返回新的起始地址 int Reverse(Ptr p, int k) { int count = 0; Ptr cur, next, tmp; cur = p; next = list[cur].next; for (int i = 0; i < k - 1; ++i) { tmp = list[next].next; list[next].next = cur; cur = next; next = tmp; } list[p].next = next; return cur; } int ReverseWholeList(int firstPos, int len, int k) { if (len >= k) { int startPos;//记录开始反转的第一个位置 int lastPos;//记录上次反转后的最后一个位置 //第一次反转 startPos = firstPos; firstPos = Reverse(startPos, k); lastPos = startPos;//反转后第一个位置变为最后一个位置 startPos = list[startPos].next;//反转后,第一个位置变为反转序列最后一个位置,取下个起始位置 //第二次到最后一次反转 for (int i = 1; i < len / k; ++i) { list[lastPos].next = Reverse(startPos, k); lastPos = startPos; startPos = list[startPos].next; } } return firstPos; } void Print(Ptr firstPos) { Ptr next = firstPos; if(next == -1){ return; } while (list[next].next != Null) { printf("%05d %d %05d\n", next, list[next].key, list[next].next); next = list[next].next; } printf("%05d %d %d\n", next, list[next].key, list[next].next); } int main() { int firstPos; int N; int k; scanf("%d %d %d", &firstPos, &N, &k); int addr, data, next; for (int i = 0; i < N; ++i) { scanf("%d %d %d", &addr, &data, &next); list[addr].key = data; list[addr].next = next; } int len = GetLength(firstPos); firstPos = ReverseWholeList(firstPos, len, k); Print(firstPos); return 0; }
结果:
02-线性结构3 Reversing Linked List (25分)
标签:while 线性 key test color each follow base describe
原文地址:https://www.cnblogs.com/2018shawn/p/13236869.html