1

私はグラフを扱っています。エッジのリストにエッジを挿入したいとき、ポインターに問題があります。

これはすべてのグラフ構造です:

typedef struct _edge {
  int source;         
  int dest;          
  int cost;          
  struct _edge *next; 
} edge;

typedef struct {
  int  id;       
  rama *edges;   /* List of edges */
} node;

typedef struct {  
  int n_nodes;     
  int n_edges;     
  int directed;    
  node *nodes;  /* Array of nodes */
} graph;

私の問題は、エッジのリストに新しいエッジを挿入しようとすると発生します...

int insert_edge(graph *g, int source, int dest, int cost){

    edge *e;
    edge *nxt;

    e=(edge*)malloc(sizeof(edge));
    e->source=source;
    e->dest=dest;
    e->cost=cost;
    e->next=NULL;

    nxt=g->nodes[source].edges;
    if(nxt==NULL)
        nxt=e;  
    else
    {   
        while(nxt->next!=NULL)  
            nxt=nxt->next;  
        nxt->next=e;        
    }       
    return 1;
}

メイン関数から insert_edge を呼び出すと、エッジのフィールドにアクセスしようとするとセグメンテーション違反が発生します。

どうすれば正しく挿入できますか?

graph->nodes[position].edges にアクセスすると、まだ null です...挿入関数内のグラフのコンテンツを更新する方法がわかりません。

4

1 に答える 1

3
        nxt=nxt>next; 

このタイプミスにより、基本的に 0/1 を に代入しnxt、後でポインタのように扱います。

(PSは、貴重な時間を節約できる警告をコンパイラが提供したことをほぼ確信しています)。


もう 1 つの問題は、nxt=e;代わりにg->nodes[source].edges = e.
最初の例では、ローカル変数を変更するだけで、実際にはデータを変更しません。

于 2013-10-17T09:48:24.420 に答える