2012-02-09 11 views
-1

私のプログラムでリンクリストを作成する必要があります。私のプログラムでは、リストはmalloc()でヒープ上に割り当てられていますが、私はそれを訪問しようとしますが、セグメーションの失敗があります。リンクリストの割り当て後のセグメンテーションフォールト

EDIT:私はこのラインでSIGSEGVを取得 "しながら(!(ノード - >のnodeType == TYPE_END_LIST)){"

struct dagNode *createList(int k); 
    struct dagNode *newNodeXInterval(int type, int val); 


    struct dagNode *createList(int k){ 
    struct dagNode *head, *node; 
    printf("\nList %d = ", k); 
    head = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,1)); 
    node = head; 
    int i; 
    for (i=1; i<LENGTH_OF(k); i++){ 
      node->next = newNodeXInterval(TYPE_XTEST, getRightPointOf(k,i)); 
      node = node->next; 
      node->next = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,i+1)); 
      node = node->next; 
      }  
    node = newNodeXInterval(TYPE_END_LIST, 0); 
    node = head;  // i think that here there is the error 
    printf("%d", node->val); i=0; 
        while(!(node->nodeType == TYPE_END_LIST)){ 
         printf("%d ", i); 
         node = node->next;} 
    return head;} 


    struct dagNode *newNodeXInterval(int type, int val){ 
     struct dagNode *node = (struct dagNode *) malloc(sizeof(struct dagNode)); 
     if (type == TYPE_EDGE_OR_GAP){ 
     *node = (struct dagNode) {(val<0)? TYPE_GAP:TYPE_EDGE, val, NULL, NULL, NULL}; 
     } 
     else{ 
     *node = (struct dagNode) {type, val, NULL, NULL, NULL}; 
     } 
     return node; } 

、呼び出し元関数は、リストの先頭になるだろう。

+0

これを絞り込んでください。どのラインでセグメント違反がありますか? –

+0

もしあなたがSEGVを手に入れたら、おそらくコアが得られ、どこで死んだのか正確に見ることができますか? – Useless

答えて

1

私の知る限り、問題はassignement前にライン

node = newNodeXInterval(TYPE_END_LIST, 0); 

であり、nodeポイントあなたのリンクリストの最後のノードに、前のノードがnodeに等しいそのnextポインタを持っています。割り当て後、nodeは、タイプTYPE_END_LISTの新しく作成されたノードを指し示すが、前のノードのnextポインタは変更されていない(つまり、元の値はnodeである)。つまり、新しく作成されたノードはリストの一部ではないため、次のnode->nodeType == TYPE_END_LISTのループが真と評価されることはありません。そして、あなたは終わりを過ぎたときにヌルポインタの逆参照を終了します。リスト。回線を

node->next = newNodeXInterval(TYPE_END_LIST,0);  

に変更する必要があります。

関連する問題