2016-04-13 4 views
3

Ce programme est censé faire une liste aléatoire de n numéros que l'utilisateur entre, mais quand il essaie d'imprimer la liste liée, il obtient un défaut de segmentation.Je continue d'obtenir la faute de segmentation sur la liste de liens

Le programme fonctionne jusqu'à ce qu'il affiche la liste chaînée.

#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; 
} 

Répondre

3

Vous essayez d'accéder à un pointeur non initialisé. Vous attribuez à la fonction print_linked_list la variable head_ptr, qui n'est pas initialisée. Il utilise ensuite cette valeur comme pointeur vers le noeud suivant lors de la création du premier noeud. Cela signifie que la condition print_ptr != NULL n'est jamais remplie.

Cela peut être corrigé en définissant head_ptr à NULL lorsque vous le déclarez dans main. Head_ptr n'est pas initialisé à NULL

+0

En remarque, vous avez également une fuite de mémoire, car vous ne supprimez jamais les nœuds créés avec 'new'. –

3

En tant que tel, le premier nœud qui sera créé obtiendra un pointeur de déchets pour ses link_field. En tant que tel, lorsque votre code d'impression tente de parcourir la liste des liens, il finira par atteindre le pointeur des ordures, et disparaîtra pour ne jamais atterrir.

+0

Ce serait bien si vous utilisiez 'nullptr'. ... au moins pour promouvoir des moyens plus idiomatiques. :-) – WhiZTiM

+1

Les vieilles habitudes sont difficiles à casser ... –