2016-04-13 9 views
3

Dieses Programm soll eine zufällige verkettete Liste von n Zahlen, die der Benutzer eingibt, aber wenn es versucht, die verknüpfte Liste zu drucken, erhält es einen Segmentierungsfehler.Ich bekomme Segmentierung Fehler auf Link-Liste

Das Programm funktioniert, bis es die verkettete Liste anzeigen muss.

#include <iostream> 

class node 
{ 
public: 
    // TYPEDEF 
    typedef double value_type; 

    // CONSTRUCTOR 
    node(
     const value_type& init_data = value_type(), 
     node* init_link = NULL 
     ) 
    { data_field = init_data; link_field = init_link; } 

    // Member functions to set the data and link fields: 
    void set_data(const value_type& new_data) { data_field = new_data; } 
    void set_link(node* new_link)    { link_field = new_link; } 

    // Constant member function to retrieve the data: 
    value_type data() const { return data_field; } 

    // Constant member functions to retreive the link: 
    node* linker() const   { return link_field; } 

private: 
    value_type data_field; 
    node* link_field; 
}; 

int myrand(int) 
{ 
    return(1 + rand() %(1000 - 1 +1)); 
} 

void print_linked_list(node*& head_ptr, node*& print_ptr, size_t n) 
{ 
    for (size_t i =1 ; i <= n ; i++) { 
     head_ptr = new node(myrand(n), head_ptr); 
    } 
    std::cout << "Unsorted List: " << std::endl; 
    for (print_ptr = head_ptr; print_ptr !=NULL; print_ptr = print_ptr->linker()) { 
     std::cout << print_ptr->data() << " "; 
    } 
} 

int main() 
{ 
    size_t n; 
    srand(time(NULL)); 

    node* head_ptr; 
    node* print_ptr; 

    std::cout << "Please input a number" << std::endl; 
    std::cin >> n; 

    print_linked_list(head_ptr, print_ptr, n); 

    return 0; 
} 

Antwort

3

Sie versuchen, auf einen nicht initialisierten Zeiger zuzugreifen. Sie geben der print_linked_list Funktion die head_ptr Variable, die nicht initialisiert ist. Dieser Wert wird dann beim Erstellen des ersten Knotens als Zeiger auf den nächsten Knoten verwendet. Dies bedeutet, dass die Bedingung print_ptr != NULL niemals erfüllt wird.

Dies kann durch Setzen head_ptr-NULL festgelegt werden, wenn Sie es in main erklären.

+0

Als eine Randnotiz haben Sie auch einen Speicherverlust, weil Sie nie die Knoten löschen, die Sie mit 'new' erstellt haben. –

3

head_ptr ist nicht initialisiert auf NULL.

Als solche erhält der erste Knoten, der erstellt wird, einen Abfallzeiger für seine link_field.

Wenn Ihr Druckcode dann versucht, die Linkliste zu durchlaufen, wird er schließlich den Mülleimer treffen und in Nimmerland landen.

+0

Es wäre schön, wenn Sie 'nullptr' verwenden würden. ... zumindest um mehr idiomatische Wege zu fördern. :-) – WhiZTiM

+1

Alte Gewohnheiten sind schwer zu brechen ... –

Verwandte Themen