Очередь ошибок сегмента с использованием связанного списка (C ++) - PullRequest
0 голосов
/ 04 октября 2018

Ниже приведена новая попытка программиста в очереди.Это вызывает ошибки в функции Push (), когда я пытаюсь распечатать данные в первом узле.Похоже, что front_ptr на самом деле не устанавливается в head_insert.Что я здесь не так делаю, это совершенно неправильный подход?

Спасибо.

#include <cstdlib>
#include <iostream>

using namespace std;

class node {
public:
    typedef double data_type;

    node(data_type init_data = 0, node * init_next = NULL) {
        data = init_data;
        next_node = init_next;
    }

    void set_data(data_type new_data) { data = new_data; }

    void set_next(node * new_next) { next_node = new_next; }

    data_type get_data() { return data; }

    node * get_next() { return next_node; }

private:
    data_type data;
    node * next_node; 
};

void head_insert(node::data_type val, node* head_ptr) {
    node* insert_ptr = new node(val, head_ptr);
    head_ptr = insert_ptr;
}

void list_insert(node::data_type val, node* prev_ptr) {
    node* insert_ptr = new node(val, prev_ptr->get_next());
    prev_ptr->set_next(insert_ptr);
}

void head_remove(node* head_ptr) {
    node* remove_ptr = head_ptr;
    head_ptr = head_ptr->get_next();
    delete remove_ptr;
}

void list_remove(node * prev_ptr) {
    node* remove_ptr = prev_ptr->get_next();
    prev_ptr->set_next(remove_ptr->get_next());
    delete remove_ptr;
}

void list_clear(node* head_ptr) {
    while (head_ptr != NULL) {
        head_remove(head_ptr);
    }
}

class queue {
public:
    queue() {
        size = 0;
        front_ptr = NULL;
        rear_ptr = NULL;
    }
    //~queue() {}

    bool empty() { return (size == 0);}

    void push(node::data_type val) {
        if (empty()) {
            head_insert(val, front_ptr);
            cout << "Here: " << front_ptr->get_data() << endl;
            rear_ptr = front_ptr;
        }
        else {
            list_insert(val, rear_ptr);
        }
        size++;
    }

    void pop() {
        if (!empty()) {
            head_remove(front_ptr);
            size--;
        }
    }

private:
    node* front_ptr;
    node* rear_ptr;
    int size;
};

int main() {
    cout << "START" << endl;
    double testVal = 1;
    queue* qList = new queue();
    qList->push(testVal);
    cout << "END" << endl;

    return 0;
}

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 04 октября 2018

Ваш front_ptr остается нулевым указателем в push, потому что head_insert принимает его по значению.Разыменование нулевого указателя приводит к сбою программы.Создайте параметры, которые вы хотите изменить, с помощью справочных параметров функции, таких как void head_insert(node::data_type val, node*& head_ptr).

. Кроме того, вы можете избежать сбоя разыменования нулевого указателя, предварительно проверив его, например, так:

   cout << "Here: " << (front_ptr ? front_ptr->get_data() : 0./0.) << endl;
...