0

Tarjan のアルゴリズムを使用して強連結成分の実装に取り​​組んでいます。ノードとエッジのリンクされたリストとして入力を与えています。ただし、gcc コンパイラは、再帰関数で毎回セグメンテーション違反を発生させます (while ループで、頂点の隣接ノードをチェックしています)。

このコードの何が問題なのか分かりますか?

void strongconnect(int Vertex)
{
 struct sc_node * Ver;
 Ver = search_node(Vertex);
 Ver->sc_index = ind; //accessing the index information of node
 Ver->sc_lowlink = ind; // accessing the link information of node
 //Ver->visited = 1;
 ind++;
 int w;
 push(Vertex);

 struct sc_node * to_link, *to_link1;
 int to_lowlink,to_index;
 int flowlink;
 int min;
 int from_index;

 edge_trav = edge_head;    

 while(edge_trav != NULL)   //accessing linked list of edges
 {
   if(edge_trav->from_vertex == Vertex)
   {
     to_link = search_node(edge_trav->to_vertex);
     to_lowlink = to_link->sc_lowlink;
     to_index = to_link->sc_index;
     to_link1 = search_node(Vertex);
     flowlink = to_link1->sc_lowlink;
     from_index =  to_link1->sc_index;

     if(to_index == 0)
     {   Vertex = to_link->sc_data;
          printf("INSIDE RECURSION");
          strongconnect(Vertex);   // recursive loop
          min = minimum(flowlink,to_lowlink);
          to_link1->sc_lowlink = min;
     }
     else 
     {
       min =  minimum(flowlink, from_index);
       to_link1->sc_lowlink = min;
     }  }
  edge_trav = edge_trav->next;
  }
  Ver = search_node(Vertex);
  if(Ver->sc_lowlink == Ver->sc_index)
  {
   do
   {
    w = pop();
    printf("%d\t",w);
   }while(w != Vertex);
  }
}
4

1 に答える 1

0

プログラムを gcc でコンパイルしてから-s、プログラムを で実行することをお勧めしますvalgrind。非常に便利なメモリ リーク チェッカーです。これを使用すると、不正なメモリ位置にアクセスするプログラムを自分で把握できます。@Dogbertが指摘したように、NULLポインタを逆参照しているようです。

于 2014-04-21T17:56:07.810 に答える