2016-04-13 1 views
3

Эта программа должна сделать случайный связанный список номеров n, которые пользователь вводит, но когда он пытается распечатать связанный список, он получает ошибку сегментации.Я продолжаю получать ошибку сегментации в списке ссылок

Программа работает, пока не отобразит связанный список.

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

ответ

3

Вы пытаетесь получить доступ к неинициализированному указателю. Вы даете функции print_linked_list переменную head_ptr, которая неинициализирована. Затем он использует это значение как указатель на следующий узел при создании первого узла. Это означает, что условие print_ptr != NULL никогда не выполняется.

Это можно исправить, установив head_ptr на номер NULL, когда вы объявите его в main.

+0

В качестве побочной заметки у вас также есть утечка памяти, потому что вы никогда не удаляете узлы, созданные вами с помощью 'new'. –

3

head_ptr не инициализирован NULL.

Таким образом, первый созданный узел получит указатель на мусор для своего link_field.

Таким образом, когда ваш код печати пытается просмотреть список ссылок, он, в конце концов, попадет в указатель мусора и отправится вглубь в землю никогда.

+0

Было бы неплохо, если бы вы использовали 'nullptr'. ... по крайней мере, продвигать более идиоматические способы. :-) – WhiZTiM

+1

Старые привычки трудно сломать ... –