Функция в моем односвязном списке (которая добавляет новый узел после нахождения определенного узла) приводит к сбою моей программы

#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 произойдет сбой программы