2017-07-30 20 views
-1

私のC++コードC++:セグメンテーションフォールト

#include <iostream> 
#include <cstdlib> 
using namespace std ; 

struct Node { 
    int data ; 
    struct Node* next; 
}; 

Node* Insert(Node *head,int data); 

int main(){ 
    struct Node* head = NULL; 
    struct Node* second = NULL; 
    struct Node* third = NULL; 
    head = (struct Node*)malloc(sizeof(struct Node)); 
    second = (struct Node*)malloc(sizeof(struct Node)); 
    third = (struct Node*)malloc(sizeof(struct Node)); 

    head->data = 7; 
    head->next = second; 
    second->data = 17; 
    second->next = third; 
    third->data = 37; 
    third->next = NULL; 

    head = Insert(head,3); 
} 
Node* Insert(Node *head,int data) 
{ 
    while (true) 
    { cout << "hey" ; 
     if (head == NULL) 
     { 
      cout << "hey"; 
      head->data = data ; 
      head->next = NULL ; 
      break ; 
     } 
     head = head->next ; 
    } 

    return head; 
} 

私はC++でリンクリストを学ぶことトリングています。 私が定義したInsert()関数を使用して、ノードにデータを挿入するためのデータを渡しています。ターミナル

Segmentation fault (core dumped) 

私の出力は、私は私が間違った方法でInsert()機能をinvocatingと思います。 助けてください! ありがとう!

+0

デバッグは、デバッガでステップバイステップで、あなたは間違って何が起こっているか知っていますよ。 –

+1

C++コードでmallocを使用しないでください。新しい演算子を使用します。 "using namespace std"を使用せず、どこにでもprintステートメントを置くのではなく、デバッガを使う方法を学んでください。 – LukeG

+0

main関数のすぐ下の最初の行に 'cout'を追加しようとしました。 何も印刷されませんでした。 実行時に問題が発生しました –

答えて

2

あなたは文の場合、それはあなたに入ったときheadNULLであることが表示されません。

これはそれを修正する必要があります

Node* Insert(Node *head,int data) { 
    while (head != NULL) { 
     if (head->next == NULL) { 
      struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); 
      newNode->data = data ; 
      newNode->next = NULL ; 
      head->next = newNode; 
      head = newNode; 
      break ; 
     } 
     head = head->next ; 
    } 

    return head; 
} 
+0

空のリスト(NULLなど)に値を挿入しようとすると、新しいリストは作成されませんが、その場合はNULLが返されることに注意してください。それが望ましい動作であるかどうか確認してください。 – LukeG

+0

良い点@LukeGですが、 'Insert(NULL、4);'と書くのは意味がありません。あなたはNULLにどのように挿入できますか? – sercanturkmen

1

何かが間違ってここにある:NULLある

if (head == NULL) 
{ 
    cout << "hey"; 
    head->data = data ; 
    head->next = NULL ; 
    break ; 
} 

head場合、あなたはそのhead->datadataを割り当てることはできませんので。これによりSIGSEGVが発生します。

2

問題は、コードのこの部分にある:

if (head == NULL) 
{ 
    cout << "hey"; 
    head->data = data ; 
    head->next = NULL ; 
    break ; 
} 

まず頭がNULLで、頭がNULLである場合は、間接参照(head->data)しようとした場合、あなたがチェックし、未定義の動作です先頭ポインタ、およびあなたのケースではセグメンテーションにつながります。

は、私は次のアルゴリズムを提案する:

if(head == NULL) { 
    Node* newHead = new Node(); 
    newHead->data = data; 
    newHead->next = NULL; 
    return newHead; 
} 
while(head->next != NULL) head = head->next; 
head->next = new Node(); 
head->next->data = data; 
head->next->next = NULL; 
return head; 
関連する問題