2016-03-30 5 views
0

私は多くの異なる質問をオンラインで見てきましたが、私が間違っていることを理解できません。私は非常に多くの異なることを試みたので、間違った方向に向かっているかもしれません。C Simple LinkedList

私は単なる単純なlinkedListをCで作ろうとしています。リストの接続を維持する方法を理解できないようです。

これは私のコードは、リストを作ることです

typedef struct node 
{ 
    double x;   // x-coordinate of this point in the tour 
    double y;   // y-coordinate of this point in the tour 
    struct node* next; // Pointer to the next node in the linked list 
} Node; 

私のノードのための構造体は、私はメイン

Node* addFront(Node* first, double x, double y) { 

    first = malloc(sizeof(Node)); 
    if (first == NULL) { 
     first->x = x; 
     first->y = y; 
     first->next = NULL; 
    } 
    else { 
     Node * temp = malloc(sizeof(Node)); 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     
     first = temp;  
    } 
    //Temp testing 
    int size = 0; 
    Node * current = first; 
    while (current->next != NULL) { 
     printf("(%.4f, %.4f)\n", current->x, current->y); 
     current = current -> next; 
     size++; 
    } 
    printf("Size: %d\n", size); 

    return first; 
} 

いくつかのノートの最初の= NULL空のノードを構成します最初のものがnullかどうかを確認する必要はありません...リストは、単にelseステートメントを使って構築できるはずです。 (私の考え)

if/elseステートメントを追加した後、C言語で無限ループと思われるものが得られました。ランダムメモリを指し示すだけで、最終的にセグメンテーションフォルトにつながります。

私はどこに向かうべきか分かりません。そんなに進んでいただきありがとうございます!

+1

次のように見ることができます意味をなさない'first'が' NULL'ならば、 'first-> x = x;'のようにすることができます。これは、メモリを割り当てる前に 'malloc'が失敗したことを意味します。 – pzaenger

答えて

4

このブロックには全く意味がありません。

first = malloc(sizeof(Node)); 
if (first == NULL) { 
    first->x = x; 
    first->y = y; 
    first->next = NULL; 
} 

は、おそらくあなたは、ブロック内first = malloc(sizeof(Node));を移動したかったです。それは動作しますが、それは論理的にはelseブロックに等しいので完全には不要です。あなたがtemp == NULLをチェックし、それに応じて行動しなければならないので、あなたは、ケース内のメモリのうちmalloc実行エラー処理を追加する必要があります(関数からNULLを返す -

Node * temp = malloc(sizeof(Node)); 
    temp->x = x;   
    temp->y = y;      
    temp->next = first;     
    first = temp; 
    return first; 
    // or rather return temp directly 

1つのより多くのポイントがあります:あなたはそこだけの第二のブロックを残すことができますまたは何でも...)。

+0

ありがとうございます。私はif文がなければ正しかったと思います。私は銃を飛ばして正しく試してはいけません。 –

0

パラメータfirstの値が上書きされるため、機能の最初の文でも間違っています。

Node* addFront(Node* first, double x, double y) { 

    first = malloc(sizeof(Node)); 
    //... 

機能ブロック `場合(最初== NULL){...}` doesnの

Node * addFront(Node *first, double x, double y) 
{ 
    Node *temp = malloc(sizeof(Node)); 

    if (temp != NULL) 
    { 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     

     first = temp; 
    } 

    return first; 
} 

または試験コードで

Node * addFront(Node *first, double x, double y) 
{ 
    Node *temp = malloc(sizeof(Node)); 

    if (temp != NULL) 
    { 
     temp->x = x;   
     temp->y = y;      
     temp->next = first;     

     first = temp; 
    } 

    // start pf inline test 
    size_t size = 0; 

    for (Node *current = first; current != NULL; current = current->next) 
    { 
     printf("(%.4f, %.4f)\n", current->x, current->y); 
     ++size; 
    } 
    printf("Size: %zu\n", size); 
    // end pf inline test 

    return first; 
}