2017-10-05 12 views
-1

10ノードのリストを作成し、1〜10の値を割り当てて印刷しようとしています。私は次のコードでそれを試しましたが、私はセグメンテーションフォールトで終わっています。リンクリストCプログラムのセグメンテーションフォルト

私はあなただけの単一ノードのためのスペースが割り当てられている、まだあなたは、このことによってリンクされたノードのリストをループしようとしているC.

#include<stdio.h> 
typedef struct Node 
{ 
    int data; 
    struct Node *next; 
}Node_Struct; 

int main(void) 
{ 
int i =0; 
Node_Struct* Node = NULL; 
Node = (Node_Struct*)malloc(sizeof(Node_Struct)); 

for (i = 1; i<=10; i++){ 
    Node->data = i; 
    Node  = Node->next; 
} 

    for (i = 1; i<=10; i++){ 
    printf("\n Node->data:%d",Node->data); 
    Node = Node->next; 
    } 
return 0; 
} 
+3

以下の私のコードを参照してください。 –

+0

1つのノードを作成し、9つの存在しないノードをループします。 –

+0

'Node = Node-> next;で次のノードに行きますが、リストの開始位置を忘れてしまい、' head'と呼ばれます。 –

答えて

0

にリンクされたリストに非常に新しいです:

for (i = 1; i<=10; i++){ 
    Node->data = i; 
    Node  = Node->next; 
} 

これを行うと、Node = Node->next;Nodeがどこかを指している可能性があります。触れてはいけないメモリを指しているかもしれません。

覚えておくべきことの1つは、決してリストの先頭にハンドルを置かないことです。コピーを維持して、リストの先頭にポインタを置いてください。

Node = malloc(sizeof(Node_Struct)); 
Node_Struct *head = Node; 

malloc()を使用して各ノードの領域を割り当てます。最初にノードのリストを構築します。その後

for (i = 1; i<=10; i++){ 
    Node->next = malloc(sizeof (Node_Struct)); 
    Node  = Node->next; 
} 
Node->next = NULL // The last node should point to NULL 

あなたは別のループ内のすべてのノードdataフィールドを設定したり、malloc()をしながら同じループでそれらを設定できます。それを行うための1つの方法は、このようなものです。既にリストのheadへのハンドルを持っているので、あなたはどこから始めるべきかを知っています。そうであるように:

Node = head; 
i = 0; 
while (Node) { 
    Node->data = i++; 
    Node = Node->next; 
} 
+0

迅速な答えを与える。 'malloc'は割り当てられた領域を初期化せず、多くの微妙なエラーがあります –

+1

@JacekCz' malloc'はどこに割り当てられた領域を初期化しましたか?そして、私が作った微妙な誤りを親切に指摘してください。常に幸せに学ぶ。 – babon

+0

@JacekCz私は微妙な誤りを指摘するのを待っています。 – babon

1

コメントで人が指摘したように、あなただけがヘッドノードにのみメモリを割り当てています。ループのためにintを追加しようとしている各ノードにメモリを割り当てる必要があります。さらに、各反復でNodeポインタを前方に移動しているため、挿入後にリストをトラバースすることはできません。リストの先頭と末尾の両方を追跡します。

リンクリストの先頭と末尾を維持:

Node_Struct* headNode = NULL, *tailNode = NULL; 
// head node 
headNode = tailNode = (Node_Struct*)malloc(sizeof(Node_Struct)); 

ループの各繰り返しでメモリを割り当て、次のようにしてください。ヘッドノードに何かを保持したいかどうかはあなたの望みです。したがって、このようなループのためにコードを変更します。この後

for (i = 1; i<=10; i++) { 
    Node_Struct* newNode = (Node_Struct *)malloc(sizeof(Node_Struct)); 

    newNode->data = i; 
    newNode->next = NULL; 

    tailNode->next = newNode; 
    tailNode = newNode; 
} 

をあなたには、いくつかの他の変数に頭値をコピーしてあなたのリストを反復処理することができます:あなたが追加された各ノードのためのメモリを割り当てていない

Node_Struct *tmpNode = headNode; 
    for (i = 1; i<=10; i++){ 
    printf("\n Node->data:%d",tmpNode->data); 
    tmpNode = tmpNode->next; 
    } 
1

あなたのループを使用する場合、これらのマイナーな変更

Node_Struct* Node = NULL; 
Node_Struct **current = &Node; 

for (i = 1; i <= 10; i++) { 
    *current = malloc(sizeof(Node_Struct)); 
    (*current)->data = i; 
    (*current)->next = NULL; 
    current = &(*current)->next; 
} 

current = &Node; 
for (i = 1; i <= 10; i++) { 
    printf("\n Node->data:%d", (*current)->data); 
    current = &(*current)->next; 
} 

は、あなたがプログラムを終了する前に、ノードのすべての割り当てられたメモリを解放すべきであることを考慮してくださいせるのに十分です。

0

まず、私はあなたの間違いがどこにあるのかを示しています。あなたの問題を解決するコードを書き直しました。私のコードを見てあなたのものと比較してください。希望は、あなたがデータ構造を学ぶのに役立ちます。

さんがあなたに過ち

#include<stdio.h> 
typedef struct Node 
{ 
    int data; 
    struct Node *next; 
}Node_Struct; 

int main(void) 
{ 
    int i =0; 
    Node_Struct* Node = NULL; 
    Node = (Node_Struct*)malloc(sizeof(Node_Struct)); 

for (i = 1; i<=10; i++){ 
    Node->data = i;/* till here everything fine */ 
    Node  = Node->next; /* now you are pointing to nowhere */ 
    /* in the next iteration of for loop Node->data = i will crash the application */ 
    /* you could have done it like below 
    Node->next = (Node_Struct*)malloc(sizeof(Node_Struct)); 
    Node  = Node->next; 
    Node->data = i; 
    Node->next = NULL 
    but here you lost the address of first node so all gone*/ 

} 

    for (i = 1; i<=10; i++){ 
    printf("\n Node->data:%d",Node->data); 
    Node = Node->next; 
    } 
    return 0; 
} 

を見てみましょうは、今、あなたは頭だけでなく、それぞれeverynodeを初期化し、malloc関数する必要がある「かもしれない」

int main(void) 
{ 
    int i =0; 
    Node_Struct *Node = NULL; 
    Node_Struct *p = NULL; 

    for (i = 1; i<=10; i++){ 
    if (Node == NULL) 
    { 
     Node = (Node_Struct*)malloc(sizeof(Node_Struct)); 
     Node->data = i; 
     Node->next = NULL; 
     p = Node; /* p is pointing to the first Node of the list */ 
     } 
     else 
     { 
      p->next = (Node_Struct*)malloc(sizeof(Node_Struct)); 
      p = p->next; 
      p->data = i; 
      p->next = NULL; 
     } 
    } 

     p = Node; /* now p is pointing to first node of the link list */ 
     /* if you see above we always assign NULL to 'next' pointer so that the last node of the list pointing to NULL */ 
     /* Therefore in the below while loop we are searching the list untill we reach the last node */ 
     while(p != NULL) 
     { 
      printf("\n p->data:%d",p->data); 
      p = p->next; 
     } 
     return 0; 
    } 
関連する問題