【问题标题】:Exception error in implementing Tower of Hanoi using Linked List使用链表实现河内塔时出现异常错误
【发布时间】:2018-10-08 16:31:37
【问题描述】:

我正在尝试使用链表实现河内塔。这是代码。

    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() 函数。 另一方面,当我将 hanoi 定义更改为:

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-&gt;next-&gt;value;Exception thrown: read access violation. iter->next was nullptr.

这样做的正确方法是什么?任何线索将不胜感激。谢谢。

【问题讨论】:

  • 看看你的pop函数。现在假设您有一个带有tower::size = 1 的列表。发生什么了?即int rt = iter-&gt;next-&gt;value;是什么?
  • 是的。谢谢你指出。对此做了一点修正。 else if (size == 1) { int rt = head-&gt;value; head = NULL; return rt; } 但是操作后C还是空的。和以前一样。
  • 别忘了删除!
  • 我确实添加了它。不过,什么也没发生。
  • 您是在尝试用 C++ 编写汉诺塔程序,还是尝试使用链表实现堆栈并解决汉诺塔是测试要求?如果是前者,你应该使用std::stack。如果是后者,您应该专注于实现和测试您的堆栈,使用可以暴露问题的良好单元测试来练习它。一旦你有一个表现良好的堆栈,无论底层技术如何,解决河内塔都是微不足道的。尝试使用三个正在使用的堆栈来测试您的堆栈只会让您的工作变得比需要的更加困难。

标签: c++ recursion linked-list towers-of-hanoi


【解决方案1】:

调试器会有所帮助。每次修改塔时都会出现这种情况。

void hanoi(int size, tower_ source, tower_ target, tower_ aux) {
    if (size == 1) {
        std::cout << "target before insert: ";
        target.printTower() ;
        std::cout << std::endl;
        std::cout << "source before pop: "; 
        source.printTower() ;
        std::cout << std::endl;

        target.insert(source.pop());


        std::cout << "target after insert: ";
        target.printTower() ;
        std::cout << std::endl;
        std::cout << "source after pop: " ;
        source.printTower();
        std::cout << std::endl << "------------------------------------" <<  std::endl;
        return;
    }
    hanoi(size - 1, source, aux, target);
    hanoi(size - 1, aux, target, source);
}

A: 3 2 1 

target before insert: 

source before pop: 3 2 1 

target after insert: 1 

source after pop: 3 2 

------------------------------------
target before insert: 

source before pop: 

target after insert: -1 

source after pop: 

------------------------------------
target before insert: 3 2 

source before pop: 

target after insert: 3 2 -1 

source after pop: 

------------------------------------
target before insert: 

source before pop: 3 2 -1 

target after insert: -1 

source after pop: 3 2 

------------------------------------

C: 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2016-01-27
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多