C++处理线性结构Reversing Linked List不知道错在哪
02-线性结构3 Reversing Linked List (25分)
*Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10^5 ) which is the total number of nodes, and a positive K (≤N) 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.
Output Specification:
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.
Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1*
**解题思路:
用结构体数组存储数据;
用sortNode()排序数组
用reverse()翻转节点
用print()函数输出翻转后的数组
存在问题:
部分正确:
**
#include <iostream>
#include <iomanip>
using namespace std;
struct Node
{
int cpos;
int data;
int npos;
};
void exchange(Node*, Node*);
void sortNode(Node[], int&, int head);
void reverse(Node[], int, int);
void print(Node[], int);
int main()
{
int head_pos, N, K;
cin >> head_pos >> N >> K;
Node *arr = new Node[N];
for (int i = 0; i < N; ++i)
{
cin >> arr[i].cpos >> arr[i].data >> arr[i].npos;
}
sortNode(arr, N, head_pos);
reverse(arr, N, K);
print(arr, N);
}
void exchange(Node *a, Node *b)
{
Node* temp = new Node;
temp->cpos = a->cpos;
temp->data = a->data;
temp->npos = a->npos;
a->cpos = b->cpos;
a->data = b->data;
a->npos = b->npos;
b->cpos = temp->cpos;
b->data = temp->data;
b->npos = temp->npos;
}
void sortNode(Node a[], int &n, int head)
{
for (int i = 0; i < n; ++i)
{
if (head == a[i].cpos)
{
exchange(&a[i], &a[0]);
}
}
int count = n;
for (int i = 0; i < n-1; ++i)
{
if (a[i].npos == -1)
{
count = i + 1;
break;
}
for (int j = i + 1; j < n; ++j)
{
if (a[j].cpos == a[i].npos)
{
exchange(&a[i + 1], &a[j]);
break;
}
}
}
n = count;
}
void reverse(Node a[], int n, int k)
{
if (n >= k)
{
for (int i = 0; i < k / 2; ++i)
{
exchange(&a[i], &a[k - i - 1]);
}
for (int i = 0; i < k - 1; ++i)
{
a[i].npos = a[i + 1].cpos;
}
if (n > k)
a[k - 1].npos = a[k].cpos;
else
a[k - 1].npos = -1;
}
else
{
for (int i = 0; i < n / 2; ++i)
{
exchange(&a[i], &a[n - i - 1]);
}
for (int i = 0; i < n - 1; ++i)
{
a[i].npos = a[i + 1].cpos;
}
a[n - 1].npos = -1;
}
}
void print(Node a[], int n)
{
for (int i = 0; i < n-1; ++i)
{
cout << right << setw(5) << setfill('0') << a[i].cpos;
cout << " " << a[i].data << " ";
cout << right << setw(5) << setfill('0') << a[i].npos << endl;
}
cout << right << setw(5) << setfill('0') << a[n-1].cpos;
cout << " " << a[n-1].data << " ";
cout << a[n-1].npos << endl;
}