2016-10-13 4 views
0

Этот код должен вставить символ 'p' перед символом 'q', сколько раз «q» появляется в списке.Программа списка C++ замерзает, когда я вызываю функцию

Когда я вызываю функцию insert_before (insert_before('q','p')) моя программа зависает. Здесь я не пишу весь код. Остальная часть программы работает нормально.

struct node 
{ 
    char character; 
    node* next; 
}; 
node *fisrt , *end; 
void insert_before(char val_search,char val_inserted) 
{ 
    node *c,*a; 
    c=first; 
    do { 
     if (c->next->character==val_search) 
     { 
      a= new node ; 
      a->character=val_inserted ; 
      a->next=c->next; 
      c->next=a; 
      c=c->next; 
     } 
     else 
      c=c->next; 
    } while (c) ; 
} 
+1

Правильный инструмент для решения таких проблем является ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

0

Проблемы

Давайте предположим, что у вас есть список с уникальным элементом «д» в нем: 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

+0

. Второе исправление работает отлично. Благодаря ! –

0

Внутри, если {}, измените c = c-> рядом с c = a-> next.

+0

программа все еще замораживает –

+0

Изменение, которое я сказал вам сделать, это решить очевидную ошибку, проиллюстрированную @Olaf Dietsche. Если код замерзает, есть и другая ошибка. К сожалению, вы не указали дополнительный код, который содержит другие ошибки. Я бы сказал, что ответил на ваш вопрос, исходя из того, что вы опубликовали. Для других ошибок используйте отладчик или отправьте больше кода –

1

Когда вы найдете значение p, вы вносите новую запись до найденной записи.

Это означает, что в следующий раз вы увидите тот же элемент снова и вставить другую новую запись перед тем найденную запись

+---+ +---+ 
| x |->| p | 
+---+ +---+ 
    c 

станет

+---+ +---+ +---+ 
| x |->| q |->| p | 
+---+ +---+ +---+ 
     c 

, а затем он станет

+---+ +---+ +---+ +---+ 
| x |->| q |->| q |->| p | 
+---+ +---+ +---+ +---+ 
       c 

и так далее.

Поскольку это никогда не закончится (пока не закончится память), программа, похоже, замерзнет.

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