Я пытаюсь реализовать Ханойскую башню, используя Linked List.Вот код.
struct tower_ {
int size;
node* head;
tower_() {
size = 0;
head = NULL;
}
int pop() {
if (size == 0)
return -1;
else {
size--;
node* iter = head;
while (iter->next && iter->next->next != NULL)
iter = iter->next;
int rt = iter->next->value;
delete iter->next;
iter->next = NULL;
return rt;
}
}
int insert(int x) {
node* newNode = new node;
newNode->value = x;
newNode->next = NULL;
if (size == MAX_SIZE)
return -1;
else if (head == NULL) {
head = newNode;
size++;
return 0;
}
else {
node* iter = head;
while (iter->next != NULL)
iter = iter->next;
iter->next = newNode;
size++;
return 0;
}
}
void printTower() {
node* iter = new node;
for (iter = head; iter != NULL; iter = iter->next) {
std::cout << iter->value << " ";
}
std::cout << "\n";
}
};
void hanoi(int size, tower_ source, tower_ target, tower_ aux) {
if (size == 1) {
target.insert(source.pop());
return;
}
hanoi(size - 1, source, aux, target);
hanoi(size - 1, aux, target, source);
}
int main() {
tower_ A, B, C;
A.insert(3);
A.insert(2);
A.insert(1);
std::cout << "A: ";
A.printTower();
hanoi(3, A, C, B);
std::cout << "\n" << "C: ";
C.printTower();
return 0;
}
При запуске я получаю следующий вывод:
A: 3 2 1
C:
Кажется, я не вижу проблем с функциями pop()
и insert()
и я проверил их отдельно.Я отладил и обнаружил, что это может быть из-за возврата -1
функции pop()
для пустого списка.С другой стороны, когда я изменил свое определение Ханоя на это:
void hanoi(int size, tower_ source, tower_ target, tower_ aux) {
if (size > 0) {
hanoi(size - 1, source, aux, target);
target.insert(source.pop());
hanoi(size - 1, aux, target, source);
}
Выдает ошибку исключения в следующей строке: int rt = iter->next->value;
с Exception thrown: read access violation.
iter->next was nullptr.
Что является правильнымспособ сделать это?Любая подсказка будет оценена.Благодаря.