2016-11-20 20 views
-1

隣接関係リストをゼロから作成する際に、構造体の配列のアドレス指定とメモリ割り当てに問題があります。 (有向/無向リストを無視する)。
数時間のデバッグの後、私はコードが隣接リストの最後の2つの入力だけを保持していることを発見しました。
実際に私がメモリの割り当てを混乱させ、それにアクセスしていることを何で、どのように知りたいのですか。
このトピック/問題に関するさらに詳しい調査リンクを忘れずにください。前もって感謝します。私はコメントとして述べたようにここで
は私のコード -構造体配列のアドレス指定とメモリの割り当て

/*a single node of an adjacency list*/ 
typedef struct adjList{ 

    int dest; 
    struct adjList *next; 

} adjList; 


/*Image of a graph...*/ 

typedef struct Image{ 

    int source; 
    adjList *head; 

} Image; 


void add_adj_edge(Image graph[], int source, int destiny); 

int main() { 

    int vertices = 6; 
    Image graph[vertices]; 

    //need not to mention detailed here  
    // initialize_graph(graph, vertices); 

    add_adj_edge(graph, 1, 2); 
    add_adj_edge(graph, 1, 4); 
    add_adj_edge(graph, 1, 5); 
    add_adj_edge(graph, 1, 6); 
    print_graph(graph, vertices); 
    printf("graph[1].head->dest: %d\n", graph[1].head->dest); 

    return 0; 
} 





void add_adj_edge(Image *graph, int src, int dest){ 

    adjList *cache = malloc(sizeof(adjList)); 
    /*create a single node*/ 
    cache->dest = dest; 
    cache->next = NULL; 

    if(graph[src].head == NULL){ 
      graph[src].head = cache; 

    } 


    else{ 

      while(graph[src].head->next != NULL){ 
       graph[src].head = graph[src].head->next; 
      } 

      graph[src].head->next = cache; 

    } 

    return; 

} 

出力

 node: 1 5 6 
     node: 2  
     node: 3  
     node: 4  
     node: 5  
     node: 6  
     graph[1].head->dest: 5 

Instead of 

     node: 1 2 4 5 6 
     node: 2  
     node: 3  
     node: 4  
     node: 5  
     node: 6 
     graph[1].head->dest: 2 
+0

'グラフ[SRC] .h​​ead =グラフ[SRC] .h​​ead-> next'。それは間違いです。リストをトラバースするには、一時変数を使用する必要があります。各反復でヘッドポインタを変更しないでください。 – kaylum

+0

最初に 'Image graph [vertices];'を割り当てたが、決して '..head = NULL;'を設定していないので、 'if(graph [src] .head == NULL) add_adj_edge() 'は常に' false'です。 –

+0

@ J.Piquard 'initialize_graph(グラフ、頂点)'に 'NULL'に各ヘッドを割り当てました – ph03n1x

答えて

1

だ、あなたのソースコードは、いくつかの不足しているともリ​​ンクされたリストを更新する方法について誤解しています。

最初の問題:Image graph[vertices];main()に割り当てても初期化されません)。

if(graph[src].head == NULL)は最初のアクセス時にtrueになります ことを確認するためにNULLにadjList *head;プロパティを設定する必要があります。

int vertices = 6; 
Image graph[vertices]; 
for(int i=0;i<vertices;i++) { 
    graph[i].head = NULL; // list is empty 
    graph[i].source = 0; // or what ever you want 
} 

第二の問題:(リンクリストの末尾に新しいノードを追加するとき、前のノードを探索するために、一時的な変数を使用する必要があります)。

あなたがgraph[src].head = graph[src].head->next;を使用している場合は、 最後の1で以前のすべてのノードが上書きされます。

ノードを探索するadd_adj_edge()に以下の方法を使用します。

 adjList *pTmp; 

     // point to the first node 
     pTmp = graph[src].head; 
     // explore node until the last has no node 
     while(pTmp->next != NULL){ 
      pTmp = pTmp->next; 
     } 
     // update the next node 
     pTmp->next = cache; 
+0

' initialize_graph(グラフ、頂点) 'に' NULL'に各ヘッドを割り当てました – ph03n1x

+0

私の答えは**最初の問題**が解決されましたが、あなたの解決策をテストしました** "第2の問題" **? –

+0

時間の仲間で働いていた同僚 – ph03n1x

関連する問題