2017-06-06 6 views
-5

以下のコードを実行しようとしていますが、セグメンテーションメッセージが返されます。 リストを初期化してから最初のノード(cabecera)をインクルードしてデータを印刷しようとしていますが、セグメント化エラーが返されます。 どうか私を助けてください、問題を知っていません。 ありがとうございます。cのセグメンテーションエラー

#include<stdio.h> 
#include<stdlib.h> 

typedef struct NODO{ 
    float data; 
    struct nodo* next; 
    struct nodo* before; 
} nodo; 

typedef struct CABECERA{ 
    float data; 
    struct nodo* next; 
} cabecera; 

void init(cabecera *L){ 
    L=NULL; 
} 

void pushBack(cabecera *L, float e){ 
    cabecera *newnodo; 
    newnodo= (cabecera*)malloc(sizeof(cabecera)); 
    newnodo->next= NULL; 
    newnodo->data=e; 
    L=newnodo; 
} 

int main(){ 
    cabecera *milista; 
    init(milista); 
    pushBack(milista, 0.5); 
    printf("%f\n", milista->data); 

    return 0; 
} 
+3

'void init(cabecera * L){ L = NULL;あなたは何も初期化していないので、ローカル変数を' NULL'に設定しています。あなたのpush_backメソッドも同じです。 –

+0

@ Jean-FrançoisFabreLはポインタですが、なぜそれが問題になるのでしょうか? –

+1

@ Shiva:それはポインタですが、値渡しです。 'L 'に代入することは、その関数の外部では何の効果もありません。 – Mat

答えて

0

コードをインデントします。

問題を見つけるには、プログラムを-gでコンパイルし、valgrindで実行すると、問題の内容と場所が正確にわかります。

常に英語で書いてください。それはCの残りの部分に適合し、他の人があなたを理解して助けやすくなります。

作成したノード構造体を使用していませんが、とにかく参照しています。ここで

#include<stdio.h> 
#include<stdlib.h>                


typedef struct NODO{                
    float data;                
    struct nodo* next;              
    struct nodo* before;              
} nodo;                   

    typedef struct CABECERA{               
    float data;                
    struct nodo* next;              
} cabecera;                  


void init(cabecera **L){               
    *L=NULL;                 
}                    



void pushBack(cabecera **L, float e){ //You want to take a pointer to your pointer          
    cabecera *newnodo;              
    newnodo= (cabecera*)malloc(sizeof(cabecera));       
    newnodo->next= NULL;              
    newnodo->data=e;               
    *L=newnodo; // Here you want to modify the VALUE of your pointer.            
}                    

int main(){                  
    cabecera *milista;              

    init(&milista); // For init (and pushBack) to modify the value of the pointer, pass a pointer to it. 

    pushBack(&milista, 0.5);             

    printf("%f\n", milista->data);           

    return 0;                
}                    

は両方の方法、(最短パスを使用して)、インデックスによるアクセス要素を反復処理し、配列から/に変換することができ、私は2年前のおもちゃの実装です。 https://github.com/DusteDdk/list

+0

プログラミングを始めたばかりで、私のプログラムがメッシュであることが分かりました。ありがとうございました。 –

+0

これは大丈夫です、普通です:)あなたの努力に恵まれて、Cを学ぶのは有益な経験です。 – DusteD

関連する問題