2012-12-19 26 views
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循環終止並打印值。鏈接列表中的原因分段錯誤

但是,當代碼輸入數據並獲取數據後,代碼會給我提供分段錯誤。我解決不了,原因是什麼?

回答

0

您會在此處獲得未初始化的指針。如果你定義到下一個節點的鏈接爲Node *next;你應該在使用前初始化帶有地址的指針到有效的節點對象。

而且

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

,你可以看到,你想調用NULL對象的成員data

如何修復它: Anways用有效地址初始化指針。例如:

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; 
} 
+0

但是,當我寫了m = &tmp;它給了我這個錯誤。 homework.cpp:在函數「廉政的main()」: homework.cpp:24:錯誤:在分配 –

+0

抱歉,不能將「節點**」到「節點*」。當然它應該是'.',而不是' - >'。這應該工作。 – user1516873

+0

並在'while'中存儲堆棧變量不是一個好主意:)增加了工作解決方案。 – user1516873