Проблемы
Давайте предположим, что у вас есть список с уникальным элементом «д» в нем: first
и last
бы оба указывают на этот единый узел. И указателем next
узла будет nullptr
.
Когда вы выполните insert_before()
, вы начинаете с c=first
. Таким образом, c
указывает на этот уникальный узел, у которого next
есть nullptr
. К сожалению, эта инструкция: if (c->next->character==val_search)
будет разыменовывать nullptr. Это неопределенное поведение и может вызывать симптомы, которые вы описываете.
Если ваше искомое значение не является первым элементом, ваш код будет работать в принципе. К сожалению, после того, как вы вставили элемент, вы продолжаете цикл: вы должны зациклиться на новом элементе, и условие будет истинным снова, так что вы снова введете новый элемент и так далее, бесконечно зацикливая, пока ваш список не исчерпает всю память. Это также приведет к замораживанию. Кстати, вы действительно хотите вставить 'p' перед всеми 'q в списке?
Первая поправка
Просто исправить петлю, быть более осторожным:
void insert_before(char val_search,char val_inserted)
{
node *c,*a;
for (c=first; c && c->next; c=c->next) {
if (c->next->character==val_search)
{
a= new node ;
a->character=val_inserted ;
a->next=c->next;
c->next=a;
c=a;
}
}
}
Обратите внимание, что этот код, точно так, как ваш код, не обрабатывает должным образом вставку в передней части списка ,
Второе исправление:
Чтобы иметь возможность вставить впереди, вам нужно что-то вроде этого:
void insert_before(char val_search,char val_inserted)
{
node *c,*a, *prev=nullptr;
for (c=first; c ; prev=c, c=c->next) {
if (c->character==val_search)
{
a= new node ;
a->character=val_inserted ;
a->next=c;
if (prev)
prev->next=a;
else first=a;
}
}
}
Live demo
Правильный инструмент для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –