0
#include <iostream>
#include <string>
using namespace std;
struct Node{
    Node *next;
    int data;

 };

 int main(){
    Node* head = NULL;
    int data;
    cin >> data;
    Node*m = head;
    while(data >0){
    cout <<"enter a data";
    cin >> data;
    m -> data = data;
    m -> next = m;
    }

    while(m -> next != NULL){
            cout << m -> data << endl;

    }

  return 0;
}

以下は、値が 0 より大きい場合に値を取り、連結リストを作成する単純なコードです。負の値を入力すると、while ループが終了し、値が出力されます。

ただし、コードは、データの入力を求めたときとデータを取得した後にセグメンテーション違反を引き起こします。解決できなかったのですが、原因は何ですか?

4

1 に答える 1

0

ここで初期化されていないポインターを取得します。次のノードへのリンクを定義する場合は、Node *next;使用前に有効な Node オブジェクトへのアドレスでポインタを初期化する必要があります。

Node* head = NULL;
...
Node*m = head;
...
m -> data = data; // NPE

ご覧dataのとおり、NULL オブジェクトのメンバーを呼び出そうとしています。

修正方法: 常に有効なアドレスでポインタを初期化します。例えば:

int main(){
    Node head;
    head.next = NULL;
    int data;
    cout << "enter a data ";
    cin >> data;
    Node *prev = &head;
    prev->data = data;
    while(data >0){
      Node *next = new Node();
      cout <<"enter a data ";
      cin >> data;
      next->data = data;
      next->next = NULL;
      prev->next = next;
      prev = next;
    }
    Node* m = &head;
    while(m -> next ){
        cout << m -> data << endl;
        m = m->next;
    }

  return 0;
}
于 2012-12-19T07:11:32.660 に答える