#c #linked-list
#c #связанный список
Вопрос:
Вот фрагмент. В принципе, когда я пытаюсь запустить этот код, он завершается сбоем. Эта исправленная функция, скорее всего, является виновником (раньше я писал ее по-другому, и она работала просто отлично).
Link *add_after(Link *p, Link *n,const stringamp; s )
{
Link *current = p; //No 'previous' needed.
/* empty list */
if(p == 0){
cout<<"List is empty so string not found so nothing is added after it. n";
return 0;
}
else if(p->value == s){ //Checks first Link.
cout << s << " was found in the Linked List. The new Link will be added.n";
n->next = p->next;
p->next = n;
return p;
}
else{
current = current->next;
while(current != 0){ //Check the rest of the Linked List.
if(current->value == s){
cout << s << " was found in the Linked List. The new Link will be added.n"; n->next = current->next;
current->next = n;
return p;
}
current = current->next; }
return 0;
}
} // end of function
Комментарии:
1. Не следует ли вам проверять наличие NULL перед разыменованием ваших указателей? Если в любом из таких случаев указатель равен нулю, то Ка-бум!
2. Напишите код, который мы можем скомпилировать и запустить, который воспроизводит сбой.
Ответ №1:
Я не вижу в этом ничего плохого, за исключением того, что в вашем «текущем» цикле вы возвращаете «p», если найдено совпадение. Но обработка связанного списка мне кажется правильной. Однако эту функцию действительно можно упростить:
Link *add_after (Link *p,Link *n,const string amp;s)
{
for ( ; p != NULL; p = p->next) {
if (p->value == s) {
n->next = p->next;
p->next = n;
break;
}
}
return p;
}
Ответ №2:
Неверные данные параметров могут привести к сбою:
- Если
n
равно нулю, программа завершит работу - Если нет элемента
e
,p
гдеe->next == null
произойдет сбой программы