2013-07-02 2 views
0

Я пытаюсь вставить новый узел в конец связанного списка. Однако, когда я пытаюсь, я получаю ошибку сегментации в том, что было бы точкой вставки. Я знаю, что предпочтительным методом является стиль «голова -> следующий», но для задания мы застреваем, делая его длинную руку. Помогите?Ошибка сегментации C++ в создании связанного списка

Спасибо!

#include <iostream> 
using namespace std; 

struct NodeType; 
typedef NodeType *NodePtr; 

struct NodeType 
{ 
    int data; 
    NodePtr next; 
}; 

int main() 
{ 
    NodePtr head; 
    NodePtr temp; 
    NodePtr tempTwo; 
    NodePtr tempThree; 
    NodePtr tempFour; 

    head = new NodeType; 
    (*head).data = 5; 
    (*head).next = NULL; 

    temp = new NodeType; 
    (*temp).data = 8; 
    (*temp).next = head; 
    head = temp; 
    delete temp; 

    tempTwo = new NodeType; 
    (*tempTwo).data = 12; 
    (*tempTwo).next = NULL; 
    head -> next -> next = tempTwo; 
    delete tempTwo; 






} 
+0

: доступ к памяти, которая была бесплатной причиной Неопределенное поведение во время выполнения –

ответ

4
delete temp; 
delete tempTwo; 

Удалить эти строки. Вы удаляете выделенную память, так что при следующем доступе к ней через head вы получаете segfault.

Необходимо выделить delete блоки памяти, которые должны быть выполнены после того, как вы закончите использовать память. Вам не нужно delete каждой переменной, которая касается этой памяти.

В вашем случае, вы можете сделать петлю на конце функции main которая удаляет элементы один за другим (вы должны сохранить next указатель первого)

+0

Большое вам спасибо! – user2458123

+0

В идеале, не должно ли это утверждение прийти в деструктор? Без оператора 'delete' память не возвращается в систему, когда объект выходит из области видимости. –

+0

@ RichardD он мог бы создать рекурсивный деструктор в своем классе «Node», но, вероятно, предпочтительнее сделать это итеративно в конце основной функции, как я советую. –

1

Когда вы сделаете это

head = temp; // head and temp point to same object 
delete temp; // object temp points to is de-allocated 

вы удаляете объект, который temp указывает на тот же объект, что и head. Тогда вы разыменовываются head здесь:

head -> next -> next = tempTwo; 

Но head не указывает ни на что действительное. Отказ от ссылки - это неопределенное поведение.

0
head = temp; 
    delete temp; 

- удалить указатель и почтения его позже

head -> next -> next = tempTwo; 
1

В коде

temp = new NodeType; 
    (*temp).data = 8; 
    (*temp).next = head; 
    head = temp; 
    delete temp; 

, что присваивается head удален. так что здесь head указывает на фигня. Таким образом, линия head -> next -> next = tempTwo; дает вам ошибку сегментации. Вы назначаете недопустимое местоположение.

Смежные вопросы