【问题标题】:Floyd's Algorithm - SIGTSTP error弗洛伊德算法 - SIGTSTP 错误
【发布时间】:2018-11-15 03:49:07
【问题描述】:

我正在解决一个问题,以在给定的链表中查找循环中存在的节点数(如果有的话)。下面是接受节点头的函数,使用 Floyds 循环算法检查循环,如果找到,则给出循环中的节点数。 在运行程序时,它会给出运行时错误 SIGTSTP,据我了解,这是在程序在执行期间要停止时传递的信号,考虑到,我无法看到此代码中要更改的内容。在调试时,突出显示的部分似乎是问题的根本原因。

请阐明 SIGTSTP 的含义以及如何在 C++ 中处理它。

int countNodesinLoop(struct Node *head)
{
    Node* slow = new Node;
    Node* fast = new Node;
    slow = head;
    fast = head;

    **do{
        if(slow==NULL || fast==NULL || fast->next==NULL)
            return 0;                            // LOOP NOT FOUND
        slow = slow->next;
        fast = fast->next;
        fast = fast->next;
    }while(slow!=head);**

    // LOOP FOUND
    slow = head;
    while(slow!=fast)
    {
        slow = slow->next;
        fast = fast->next;
    }                      
    // BOTH SLOW AND FAST POINT TO THE NODE WHERE LOOPS START
    int ans = 1;          // COUNTER
    slow = slow->next;                
    while(slow!=fast)
    {
        slow = slow->next;
        ans++;
     }
     return ans;
}

【问题讨论】:

  • 你能在调试器或valgrind中试试看是哪一行导致了信号吗?
  • 我尝试调试它,除了表明问题出在“do-while”循环之外,无法得出任何结论。

标签: algorithm debugging error-handling floyd-cycle-finding


【解决方案1】:

我不知道您为什么会看到 SIGTSTP - 可能是资源受限环境中的超时?

检查第一个循环中的循环条件。

另外,不要为slowfastnew 分配空节点。这些是内存泄漏。

【讨论】:

  • 我尝试在不使用“new”的情况下运行代码。循环条件对我来说似乎没问题。我已经完成了试运行,并且运行良好。
  • @AyushPallav:阅读维基百科页面上的伪代码。
  • 循环运行直到慢速和快速在同一点相遇。逻辑是,如果是这样,就会有一个循环。这里就是这种情况。我看不出有什么问题。
  • 我所能建议的就是继续盯着你的代码和维基百科伪代码中的循环条件,直到你看到有什么不同。或者休息一下再回来。
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多