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

#c #string #pointers #linked-list

#c #строка #указатели #связанный список

Вопрос:

В настоящее время я создаю программу на C, которая в основном представляет собой связанный список внутри связанного списка. Внутренний список-это символ, а внешний список-слова. К сожалению, у меня возникли проблемы с удалением некоторых внешних узлов (слов) и освобождением их памяти. Моя программа продолжает сбоить, и я понятия не имею, почему. Компилятор не выдает мне никаких предупреждений или ошибок, и я уже несколько часов ищу исправление. Любая помощь будет признательна всем, кто мог бы ознакомиться с кодом! Спасибо!

 *void deleteWord (Node* Node, int index){ int counter = 0; if (Node == NULL)  return;  while (Node-gt;next != NULL amp;amp; counter != (index - 1)){  Node = Node-gt;next;  counter  ; } struct node* wordTemp = Node-gt;next; //Node-gt;next = Node-gt;next-gt;next;  while (wordTemp-gt;word != NULL){  InnerNode* letterTemp = wordTemp-gt;word-gt;next;  free(wordTemp-gt;word);  wordTemp-gt;word = letterTemp; } free(wordTemp); return; }  

Комментарии:

1. почему counter != (index - 1) ? counter Основан ли он на нуле и index на 1?

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

3. хм, хорошо. Но если вы передадите индекс 0, вы получите последний узел в списке, вероятно, не то, что вы хотите. Вам тоже нужно разбираться с угловыми случаями.

Ответ №1:

Похоже, вы освобождаете узел-gt;далее (сохраненный в wordTemp), не переназначая его, по сути, разрывая ссылку в связанном списке, поэтому теперь узел-gt;gt;далее указывает на удаленную память.

Комментарии:

1. я связываю узел current с тем, который идет после того, который я хочу удалить. узел-gt;следующий становится узлом-gt;gt;следующий-gt;gt;gt;следующий, поэтому последовательно связываю предыдущий узел со следующим и делаю копию того, который я хочу освободить, называя его wordTemp