修改后的代码如下所示:
#include <iostream>
using namespace std;
struct Node {
int data;
Node* next;
Node(int value) : data(value), next(nullptr) {}
};
struct LinkedList {
Node* head;
int length;
LinkedList() : head(nullptr), length(0) {} // 构造函数,初始化头节点和长度为0
void insert(int value) {
Node* newNode = new Node(value);
if (head == nullptr) {
head = newNode; // 如果链表为空,则将新节点设置为头节点
}
else {
Node* temp = head;
while (temp->next != nullptr) {
temp = temp->next; // 找到链表尾部节点
}
temp->next = newNode; // 将新节点插入到尾部
}
length++;
}
void printList(bool lastElementWithoutDelimiter = false) { // 添加参数用于控制是否打印最后一个元素时输出分隔符
Node* temp = head;
while (temp != nullptr) {
cout << temp->data;
if (temp->next != nullptr) { // 判断是否为最后一个元素
cout << "-";
} else if(lastElementWithoutDelimiter){
break; // 如果是最后一个元素并且需要省略分隔符,直接跳出循环
}
temp = temp->next;
}
cout << endl;
}
};
// 移动位置函数
int move(LinkedList& list, int& location, int m) {
int a;
cin >> a; // 输入要移动的步数
location += a; // 更新位置
if (location >= m) {
location -= m; // 如果位置超过数组最大值m,则将位置减去m
}
Node* temp = list.head;
if (location > 0) {
for (int i = 0; i < location; ++i)
temp = temp->next;// 遍历找到目标位置对应的节点
}
if (temp->data == 0)
return location; // 如果位置处的元素为0,则返回当前位置
else {
location += temp->data; // 否则,将位置更新为当前位置加上当前位置处的元素值
return location;
}
}
int main() {
LinkedList list;
LinkedList v1;
LinkedList v2;
int m, n;
cin >> m; // 输入格子数量m
for (int i = 0; i < m; i++) {
int a;
cin >> a;
list.insert(a); // 将输入的值插入到链表中
}
cin >> n; // 输入回合数n
int location_1 = 0;
int location_2 = 0;
for (int i = 0; i < n; i++) {
location_1 = move(list, location_1, m);
v1.insert(location_1);
location_2 = move(list, location_2, m);
v2.insert(location_2);
}
v1.printList(true); // 在打印v1时不输出分隔符,最后一个元素之后换行
v2.printList(true); // 在打印v2时不输出分隔符,最后一个元素之后换行
return 0;
}
修改的地方包括:
- 在
LinkedList的printList函数中添加了一个参数lastElementWithoutDelimiter,用于控制是否打印最后一个元素时输出分隔符。默认情况下为 false。 - 在主函数中调用
v1.printList(true)和v2.printList(true),以指定在打印最后一个元素时不输出分隔符,并且在最后一个元素之后换行。
内容由零声教学AI助手提供,问题来源于学员提问




