Код связанного списка C зависает, не возвращаясь из функции «освобождения» - PullRequest
0 голосов
/ 14 октября 2011

Для программы, над которой я работаю, у меня есть двусвязный список. Теперь мне нужно выяснить конкретный узел, в котором определенные данные (называемые id) становятся отрицательными, а затем разыменовать следующие узлы, а также освободить память. Когда я вызываю эту функцию (вставлено ниже), последний оператор print выполняется и печатается на экране. Однако программа не возвращается в главное. Это просто висит. (Сразу после этого вызова функции у меня есть другой оператор print, который не выполняется, и программа бесконечно зависает)

static void clear_ghosts(particles *plist)
{
  particles * temp = plist;

  while(temp!=NULL) {
      if(temp->p->id < 0)
      {
          break;
      }
  temp = temp->next;

 }

 if(temp)
 {
     particles * current = temp;
     particles * next;
     while(current !=NULL)
     {
         next = current->next;
         free(current);
         current = next;
     }
     temp = NULL;
 }

 printf("\n Finished Clearing \n");
 return;

}

Здесь plist является связанным списком типа struct particle *. plist имеет данные p, которые сами по себе являются структурой и содержат данные-члены, такие как id и т. Д. Мне нужно пройтись по списку и завершить список, когда встречается отрицательный идентификатор элемента. Я получаю вывод «Завершенная очистка», но функция не возвращается к основной.

Что может быть не так?

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

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

if (temp)
{
   if ( temp != plist )
   {
     temp->prev->next = NULL;
   }
...
0 голосов
/ 14 октября 2011

Вы уверены, что все элементы, которые вы пытаетесь free(), были выделены с malloc()? Если, например, некоторые из этих указателей указывают на память в стеке, при попытке free() их могут произойти всевозможные ужасные вещи.

...