Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从导入的queue.front()中获取奇怪的seg错误_C++_Algorithm_Segmentation Fault_Breadth First Search - Fatal编程技术网

C++ 从导入的queue.front()中获取奇怪的seg错误

C++ 从导入的queue.front()中获取奇怪的seg错误,c++,algorithm,segmentation-fault,breadth-first-search,C++,Algorithm,Segmentation Fault,Breadth First Search,因此,我目前正在为我的CS163类开发一个图形抽象数据类型。除了图形的深度优先遍历之外,这个程序的其他功能都非常棒。测试时,我添加所有需要的顶点,然后根据需要连接它们。我检查了一下,所有的事情都联系在一起了,所以我们可以走了。我跳转到下面的函数中,给定要开始的朋友(顶点)的名称。我注释的行“*current_buddy=myQueue.front();”是我在GDB中发现的导致seg故障的错误代码。同样使用GDB,我能够使用“p myQueue.front()”成功地打印正确的顶点 因此,也许需

因此,我目前正在为我的CS163类开发一个图形抽象数据类型。除了图形的深度优先遍历之外,这个程序的其他功能都非常棒。测试时,我添加所有需要的顶点,然后根据需要连接它们。我检查了一下,所有的事情都联系在一起了,所以我们可以走了。我跳转到下面的函数中,给定要开始的朋友(顶点)的名称。我注释的行“*current_buddy=myQueue.front();”是我在GDB中发现的导致seg故障的错误代码。同样使用GDB,我能够使用“p myQueue.front()”成功地打印正确的顶点

因此,也许需要一个示例测试来提供更多的上下文。假设我有a点,b点,c点,d点和e点。a连接到c、d和e。b连接到c。我想从顶点“a”开始测试。将a传递给函数,它使用find_location函数查找适当的索引,该函数只返回所述索引整数。然后,它会将该顶点推送到队列上,并将该顶点标记为已访问,以便在遍历时,我不会返回到该点再次将其推送到队列上。我创建一个节点“current”,该节点附着到“a”顶点的边列表中的第一个节点。当它进入第一个循环时,我使用先前创建的顶点“current_buddy”指向队列中的第一个对象,即顶点“a”。这是程序遇到seg故障的点,我一辈子都无法弄清楚这一行代码会发生什么

“顶点”和“节点”都是我创建的结构,我使用的队列来自标准库#包含队列任何和所有信息都将不胜感激!显然,由于这是一项学校作业,我不希望任何人给我答案,但我现在迷路了

bool graph::breadth_first(char * start)
{
    if(adjacency_list[0].buddy_name == NULL)
        return false;

    int location = find_location(start);
    queue<vertex> myQueue;

    myQueue.push(adjacency_list[location]);
    adjacency_list[location].visited = true;

    node * current = adjacency_list[location].head;
    vertex * current_buddy = NULL;

    while(myQueue.empty() == false)
    {
        *current_buddy = myQueue.front();//THIS LINE SEG FAULTS
        cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << current_buddy->buddy_name << endl;
        current = current_buddy->head;
        myQueue.pop();
        while(current != NULL)
        {
            if(current->connected_buddy->visited == false)
            {
                current_buddy = current->connected_buddy;
                location = find_location(current_buddy->buddy_name);
                myQueue.push(adjacency_list[location]);
                adjacency_list[location].visited = true;
                current = current->next;
            }

        }
    }

    for(int i = 0; adjacency_list[i].buddy_name != NULL; ++i)
    {
        adjacency_list[i].visited = false;
    }
    return true;
}
bool图::宽度优先(char*start)
{
if(邻接列表[0]。好友名称==NULL)
返回false;
int location=查找位置(开始);
队列myQueue;
push(邻接列表[位置]);
邻接列表[位置]。已访问=真;
节点*当前=邻接列表[位置]。头部;
顶点*current_buddy=NULL;
while(myQueue.empty()==false)
{
*current_buddy=myQueue.front();//此行分段错误
无法连接(好友->已访问==错误)
{
当前好友=当前->已连接好友;
位置=查找位置(当前好友->好友姓名);
push(邻接列表[位置]);
邻接列表[位置]。已访问=真;
当前=当前->下一步;
}
}
}
对于(int i=0;邻接列表[i]。好友名称!=NULL;++i)
{
邻接列表[i]。访问=假;
}
返回true;
}

我不知道这是否会像您预期的那样起作用,但一个快速解决方法可能是使用操作数的地址并实际分配指针,而不是取消对它的引用:

current_buddy = &myQueue.front();

我不知道这是否会像您预期的那样工作,但一个快速解决方法可能是使用操作数的地址并实际分配指针,而不是取消对它的引用:

current_buddy = &myQueue.front();
(编辑:对于问题的第一部分,Joachim提供的解决方案/答案可能会更好。我只是希望尽可能避免使用指针。)

你可以试试:

vertex * current_buddy = NULL;

while(myQueue.empty() == false)
{
    vertex front_buddy = myQueue.front();
    cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << front_buddy.buddy_name << endl;
    current = front_buddy.head;
这样你就不会再撞车了

这部分

   while(current != NULL)
    {
        if(current->connected_buddy->visited == false)
        {
            // your code

            current = current->next;
        }

    }
如果
current->connected\u buddy->visted
为真,看起来就像一个无休止的循环

也许你想要

   while(current != NULL)
    {
        if(current->connected_buddy->visited == false)
        {
            // your code

        }

        // Moved out of the if-statement
        current = current->next;
    }
(编辑:对于问题的第一部分,Joachim提供的解决方案/答案可能会更好。我只是希望尽可能避免使用指针。)

你可以试试:

vertex * current_buddy = NULL;

while(myQueue.empty() == false)
{
    vertex front_buddy = myQueue.front();
    cout << "THIS IS A FRIEND IN THE BREADTH-FIRST TRAVERSAL" << front_buddy.buddy_name << endl;
    current = front_buddy.head;
这样你就不会再撞车了

这部分

   while(current != NULL)
    {
        if(current->connected_buddy->visited == false)
        {
            // your code

            current = current->next;
        }

    }
如果
current->connected\u buddy->visted
为真,看起来就像一个无休止的循环

也许你想要

   while(current != NULL)
    {
        if(current->connected_buddy->visited == false)
        {
            // your code

        }

        // Moved out of the if-statement
        current = current->next;
    }

这是segfault,因为您正试图遵从空指针

vertex * current_buddy = NULL;

while(myQueue.empty() == false)
{
    // V de-referencing a NULL pointer
    *current_buddy = myQueue.front();//THIS LINE SEG FAULTS
你应该把它改成

// vertex * current_buddy = NULL; // < Remove this line

while(myQueue.empty() == false)
{
    vertex *current_buddy = &myQueue.front();
//顶点*current\u buddy=NULL;//<删除此行
while(myQueue.empty()==false)
{
顶点*current_buddy=&myQueue.front();

这是SEGFULT,因为您试图遵从空指针

vertex * current_buddy = NULL;

while(myQueue.empty() == false)
{
    // V de-referencing a NULL pointer
    *current_buddy = myQueue.front();//THIS LINE SEG FAULTS
你应该把它改成

// vertex * current_buddy = NULL; // < Remove this line

while(myQueue.empty() == false)
{
    vertex *current_buddy = &myQueue.front();
//vertex*current\u buddy=NULL;//<删除此行
while(myQueue.empty()==false)
{
顶点*current_buddy=&myQueue.front();

看看崩溃的那一行上面的几行,您将当前好友初始化为空指针。现在想想当您尝试取消引用空指针时会发生什么……这是我试图为我的测试添加一致性时所做的编辑:/即使我最初没有将其设置为空,它仍然会产生相同的问题hy是一个指针吗?它不应该只是一个顶点吗?它是指向顶点对象的指针。我的想法是让它指向myQueue.front()的顶点通过引用返回,如果不初始化变量,则其值将是不确定的,并且在尝试取消引用指针时仍有UB。请查看崩溃指针上方的几行,在该行中,您将当前好友初始化为空指针。现在想想当您尝试取消引用空指针时会发生什么…这是我试图在测试中添加一些一致性的编辑:/即使我最初没有将其设置为NULL,它仍然会产生相同的问题为什么
current\u buddy
是指针?它不应该只是一个
顶点吗?它是指向顶点对象的指针。我的想法是,我会让它指向我队列中的顶点。front()通过引用返回,如果不初始化变量,其值将是不确定的,并且在尝试取消引用指针时仍有UB。这确实起到了作用!尽管现在我似乎正在检查while循环的seg错误,以检查current!=NULL。我不确定