2013-08-18 4 views
0

Я пишу функцию в C++ для добавления «данных» типа «int» в конец связанного списка.Ошибка сегментации в реализации связанных списков в C++

void insert_back() 
{ 
int no; 
node *temp; 
cout<<"\nEnter the number"<<"\n"; 
cin>>no; 
temp = head; 
if(temp != NULL) 
{ 
     while(temp != NULL) 
        temp = temp->next; 
} 

temp->next = (node*)malloc(sizeof(node)); 
temp = temp->next; 
temp->data = no; 
temp->next = NULL; 

}

Однако, на линии, TEMP-> следующая = (узел *) таНос (SizeOf (узел)), я получаю сообщение об ошибке нарушения прав доступа (ошибку сегментации). Я не считаю ничего принципиально неправильным. Не могли бы вы рассказать мне об этом?

+0

Он не входит в цикл. Вместо этого инициализируется новый узел, на который указывает temp. Мой основной связанный список - это «список», поэтому на самом деле мне нужно дать инструкцию: list = temp; в конце функции. –

ответ

-1
while(temp != NULL) 
    temp = temp->next; 

Приведенный выше код доставит вас к последнему узлу в списке. Итак, вы должны добавить узел в temp, а не temp->next.

temp = (node*)malloc(sizeof(node)); 

И теперь ребенок последнего узла должен быть NULL.

temp->next = NULL; 
+1

Этот новый 'temp' не будет иметь никакого отношения к списку, так зачем беспокоиться о петле? – Beta

+0

У меня есть сомнения здесь .. temp-> next дает адрес следующего узла. Нужно ли ссылаться на новый узел с помощью temp-> next, а не temp? –

+0

Кроме того, 'temp' указывает на недавно выделенную область памяти. Вы уверены, что хотите рассматривать его как «узел»? Существуют реальные преимущества использования подхода C++. – Beta

0

Как раз перед тем, как эта линия будет выполнена, temp будет пустым. Затем вы разыгрываете его.

1

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

В коде, вы проверяете температура равна нулю или не вместо TEMP-> следующая.

while(temp != NULL) 
    temp = temp->next; 

будет получать значение темпа, когда цикл закончен.

Кроме того, вы должны также рассмотреть условие, когда голова равна нулю.

void insert_back() 
{ 
    int no; 
    node *temp; 
    cout<<"\nEnter the number"<<"\n"; 
    cin>>no; 
    temp = head; 
    if(temp != NULL) 
    { 
     while(temp->next != NULL) 
      temp = temp->next; 
     temp->next = (node*)malloc(sizeof(node)); 
     temp = temp->next; 
     temp->data = no; 
     temp->next = NULL; 
    }else{ 
     head = (node*)malloc(sizeof(node)); 
     head->data = no; 
     head->next = NULL; 
    } 

} 
+1

'if (temp! = NULL)' не помогает –

+0

Я этого не заметил сейчас.Я думаю, что я не рассматривал условие, когда голова пуста, вы имеете в виду? – ningyuwhut

+0

Да, и похоже, что у вас это обработано сейчас. +1 –