BFS算法的SIGSEGV错误

时间:2015-06-04 14:36:55

标签: c++ breadth-first-search

我有BFS算法错误。 尝试使用gdb进行调试,但我不明白为什么会这样做。

任何人都可以告诉我为什么我的代码出现SIGSEGV错误。是否依赖于您使用指针如何处理的编译器?由于代码中存在无效指针错误

#include<iostream>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0

using namespace std;

const int MAX = 8;

struct Node
{
  int data;
  Node *next;
};

class Graph
{
  private:

    int visited[MAX];
    int q[8];
    int front, rear;

public:

    Graph();
    void BFS(int v, Node **p);
    Node *getNode_Write(int val);
    static void addQueue(int *a, int vertex, int *f, int *r);
    static int deleteQueue(int *q, int *f, int *r);
    static int isEmpty(int *f);
    void del(Node *n);
};

// initialize data memeber
Graph::Graph()
{
   for(int i = 0; i < MAX; i++)
        visited[i] = FALSE;

   front = rear = -1;
}

// function that implements breadth first search (BFS) algorithm
void Graph::BFS(int v, Node **p)
{
    Node *u;

    visited[v-1] = TRUE;

    cout<<v<<"\t";

   addQueue(q, v, &front, &rear);

   while(isEmpty(&front) == FALSE)
   {
       v = deleteQueue(q, &front, &rear);
       u = *(p+v-1);

       while(u != NULL)
       {
          if(visited[u->data-1] == FALSE)
          {
            addQueue(q, u->data, &front, & rear);
            visited[u->data-1] == TRUE;
            cout<<u->data<<"\t";
          }

          u = u->next;
       }            

     }
  }

 // Creates a node
 Node *Graph::getNode_Write(int val)
 {
     Node *newNode = new Node;
     newNode->data = val;
     return newNode;
 }

 //Adds node to the queue
 void Graph::addQueue(int *a, int vertex, int *f, int *r)
 {
    if(*r == MAX -1)
    {
       cout<<"\nQueue Overflow.";
       exit(0);
    }

    (*r)++;

    a[*r] = vertex;

    if(*f == -1)
       *r = 0;
   }

   // Deletes a node from the queue
   int Graph::deleteQueue(int *a, int *f, int *r)
   {
       int data;

       if(*f == -1)
       {
         cout<<"\nQueue Underflow";
         exit(0);
       }

       data = a[*f];

       if(*f == *r)
          *f = *r = -1;
       else
         (*f)++;

      return data;      
    }

    // checks if queque is empty
  int Graph::isEmpty(int *f)
  {
     if(*f == -1)
        return TRUE;
    return FALSE;
  }


  // deallocate the memory
  void Graph::del(Node *n) 
  {
       Node *temp;

      while(n != NULL)
      {
           temp = n->next;
           delete n;
           n = temp;
      }
   }

  int main()
  {
      Node *arr[MAX];
      Node *v1,*v2,*v3,*v4;

      Graph g;

      v1 = g.getNode_Write(2);  
      arr[0] = v1;  
      v1->next = v2 = g.getNode_Write(3);
      v2->next = NULL;

      v1 = g.getNode_Write(1);
      arr[1] = v1;
      v1->next = v2 = g.getNode_Write(4);
      v2->next = v3 = g.getNode_Write(5);
      v3->next = NULL;  

      cout<<endl;

      g.BFS(1,arr);

      for(int i = 0; i<MAX; i++)
          g.del(arr[i]);    


    }

2 个答案:

答案 0 :(得分:1)

arr的堆栈帧中有一个未初始化的数组main。只有arr[0]arr[1]被初始化。在main的末尾,它遍历整个数组,并在delete中在垃圾值上调用Graph::del(Node *n)

答案 1 :(得分:0)

  

&#34;它是否依赖于您使用指针如何被寻址的编译器?&#34;

不,它主要不依赖于编译器。正如约阿希姆在comment中指出的那样:

要查看错误的真正来源,您应该升级堆栈跟踪,并检查所有变量和参数是如何实际设置的。

由于缺少或错误的变量初始化,很可能您一直在调用某些未定义的行为。