Почему эта программа дает ошибку сегментации? - PullRequest
0 голосов
/ 14 ноября 2018

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

Я пишу данную функцию длявставьте узлы в конце связанного списка.Идея состоит в том, что при вводе целых чисел первый ввод будет считаться частью конца списка, поскольку его переменная-член-указатель будет nullptr.После этого все другие входные данные должны быть добавлены так, чтобы их вставка происходила перед этим нулевым узлом.

Вот моя первая часть функции:

SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {


if(head == nullptr) //if the list is empty
{
    head -> next = new SinglyLinkedListNode(data);
    return head;
}

return head;

} 

однако эта часть функциивыдает ошибку ошибки сегментации:

head -> next = new SinglyLinkedListNode(data);

Это объявления классов:

#include <bits/stdc++.h>

using namespace std;

class SinglyLinkedListNode {
 public:
    int data;
    SinglyLinkedListNode *next;

    SinglyLinkedListNode(int node_data) {
        this->data = node_data;
        this->next = nullptr;
    }
     };

class SinglyLinkedList {
public:
    SinglyLinkedListNode *head;

    SinglyLinkedList() {
        this->head = nullptr;
    }

 };

и Main:

int main()
{
ofstream fout(getenv("OUTPUT_PATH"));

SinglyLinkedList* llist = new SinglyLinkedList();

int llist_count;
cin >> llist_count;
cin.ignore(numeric_limits<streamsize>::max(), '\n');

for (int i = 0; i < llist_count; i++) {
    int llist_item;
    cin >> llist_item;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    SinglyLinkedListNode* llist_head =
    insertNodeAtTail(llist->head, llist_item);
    llist->head = llist_head;
}

print_singly_linked_list(llist->head, "\n", fout);
fout << "\n";

free_singly_linked_list(llist->head);

fout.close();

return 0;
 }

Я думал, что:

 head -> next = new SinglyLinkedListNode(data);

создаст новый узел с аргументом данных в качестве данных-членов, а затем текущий головной узел будет указывать на этот список.

Я хотел бы знать, почему происходит эта ошибка сегментации.Кроме того, я не могу изменить ни одно объявление класса, ни конструкторы, так как они приведены в вызове.

GDB Trace:

Reading symbols from solution...done.
[New LWP 22279]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000000000400eea in insertNodeAtTail (head=<optimized out>, 
data=<optimized out>) at solution.cc:62
62          head -> next = new SinglyLinkedListNode(data);
#0  0x0000000000400eea in insertNodeAtTail (head=<optimized out>, 
data=<optimized out>) at solution.cc:62
#1  0x0000000000400c2e in main () at solution.cc:88

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Голова равна нулю. Вы не можете получить доступ к полю 'next' нулевого объекта.

if(head == nullptr) //if the list is empty
{
    head = new SinglyLinkedListNode(data);
    return head;
}
return insertNodeAtTail(head->next, data)
0 голосов
/ 14 ноября 2018

Поскольку разыменование нулевого указателя (head IS null) равно неопределенное поведение , последствием которого может быть ошибка сегментации:

if(head == nullptr) //if the list is empty
{
    head -> next = new SinglyLinkedListNode(data);
...