#include #include

using namespace std;

struct node { int x, y; node *next; };

bool include(node n, int x, int y) { node *p = &n; while (p != nullptr) { if (p->x == x && p->y == y) return true; p = p->next; } return false; }

bool validPosition(int n, int m, node pos, int adjX, int adjY) { return pos.x + adjX >= 0 && pos.x + adjX < n && pos.y + adjY >= 0 && pos.y + adjY < m; }

void appendNode(node *&front, int adjX, int adjY) { node *temp = new node; temp->x = front->x + adjX; temp->y = front->y + adjY; temp->next = nullptr; front->next = temp; front = temp; }

int num(int n, int m, int x1, int y1, int x2, int y2) { int ans = 0; node temp = {x1, y1}, *head = &temp, *front, *x, *old; old = front = head; do { cout << front->x << ' ' << front->y << endl; if (front->x == x2 && front->y == y2) ans++; else { if (validPosition(n, m, *front, 1, 0) && !include(*old, front->x + 1, front->y + 0)) appendNode(front, 1, 0); if (validPosition(n, m, *front, 1, 1) && !include(*old, front->x + 1, front->y + 1)) appendNode(front, 1, 1); if (validPosition(n, m, *front, 0, 1) && !include(*old, front->x + 0, front->y + 1)) appendNode(front, 0, 1); if (validPosition(n, m, *front, -1, 1) && !include(*old, front->x - 1, front->y + 1)) appendNode(front, -1, 1); if (validPosition(n, m, *front, -1, 0) && !include(*old, front->x - 1, front->y + 0)) appendNode(front, -1, 0); if (validPosition(n, m, *front, -1, -1) && !include(*old, front->x - 1, front->y - 1)) appendNode(front, -1, -1); if (validPosition(n, m, *front, 0, -1) && !include(*old, front->x + 0, front->y - 1)) appendNode(front, 0, -1); if (validPosition(n, m, *front, 1, -1) && !include(*old, front->x + 1, front->y - 1)) appendNode(front, 1, -1); } x = head; while (x->next->next) x = x->next; front = x->next; // 修复错误: 将 front 指向下一个节点 } while (front != head); return ans; }

int main() { cout << num(4, 4, 1, 1, 3, 3); return 0; }

问题分析:

代码中 num 函数的 do-while 循环内,front = x; 导致 front 指针始终指向前一个节点,无法移动到下一个节点,因此陷入死循环。

修复方法:

front = x; 改为 front = x->next;,将 front 指向下一个节点,即可修复死循环问题。

代码修复后:

int num(int n, int m, int x1, int y1, int x2, int y2) {
    int ans = 0;
    node temp = {x1, y1}, *head = &temp, *front, *x, *old;
    old = front = head;
    do {
        cout << front->x << ' ' << front->y << endl;
        if (front->x == x2 && front->y == y2) ans++;
        else {
            if (validPosition(n, m, *front, 1, 0) && !include(*old, front->x + 1, front->y + 0))
                appendNode(front, 1, 0);
            if (validPosition(n, m, *front, 1, 1) && !include(*old, front->x + 1, front->y + 1))
                appendNode(front, 1, 1);
            if (validPosition(n, m, *front, 0, 1) && !include(*old, front->x + 0, front->y + 1))
                appendNode(front, 0, 1);
            if (validPosition(n, m, *front, -1, 1) && !include(*old, front->x - 1, front->y + 1))
                appendNode(front, -1, 1);
            if (validPosition(n, m, *front, -1, 0) && !include(*old, front->x - 1, front->y + 0))
                appendNode(front, -1, 0);
            if (validPosition(n, m, *front, -1, -1) && !include(*old, front->x - 1, front->y - 1))
                appendNode(front, -1, -1);
            if (validPosition(n, m, *front, 0, -1) && !include(*old, front->x + 0, front->y - 1))
                appendNode(front, 0, -1);
            if (validPosition(n, m, *front, 1, -1) && !include(*old, front->x + 1, front->y - 1))
                appendNode(front, 1, -1);
        }
        x = head;
        while (x->next->next) x = x->next;
        front = x->next; // 修复错误: 将 front 指向下一个节点
    } while (front != head);
    return ans;
}
C++ 链表死循环问题分析及修复 - 解决 #include <iostream> 中的循环错误

原文地址: https://www.cveoy.top/t/topic/poFS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录