Список: после удаления элемента список не выводится - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ну вот и осталась последняя проблема.(список двунаправленный) после удаления из списка элемента(причем удаляет верно т.к. элементы удаленные выводит правильно).ну после удаления я не могу вывести список.возможно теряется указатель на голову. структура
typedef struct sp{
    bilet bil;
    struct sp *Next;
    struct sp *Prev;
        } Tsp;//по сути узел списка
typedef Tsp *uz; 
typedef struct {
    Tsp *Head;
    Tsp *Tail;
  int Count;    
    } spisok;
функция
bilet DeleteElement(spisok *list, Tsp *delem)
{
bilet tmp1;
if (delem==NULL) return tmp1;
if (delem==list->Head) {
 
    Tsp *tmp=list->Head;
  list->Head=list->Head->Next;
    free(tmp);
    tmp1=delem->bil;
    return tmp1;
    }
if (delem->Prev!=NULL) delem->Prev->Next=delem->Next;
if (delem->Next!=NULL) delem->Next->Prev=delem->Prev;
tmp1=delem->bil;
free(delem);
return tmp1;
}
а вот вывод
int Show(Tsp *Spis)
{
if (Spis!=NULL) 
    {
   printf("%d %s %s %s %d %d\n",Spis->bil.nomer,Spis->bil.seans,Spis->bil.Data,Spis->bil.Time,Spis->bil.place,Spis->bil.red);
     Show(Spis->Next);  
    }
return 0;
}

Решение задачи: «Список: после удаления элемента список не выводится»

textual
Листинг программы
bilet DeleteElement(spisok *list, Tsp *delem)
{
   bilet tmp = delem->bil;
 
   if (delem->prev == delem->next) /* это возможно если в списке остался один элемен и оба
                                        указателя должны быть равны NULL*/
   {
      free(delem);
      list->Head = list->Tail = NULL;
      list->Count--;
      return tmp;
   }
   if (delem->prev)
      delem->prev->next = delem->next;
   else
   {
      delem->next->prev = NULL;
      list->Head = delem->next;
   }
   if (delem->next)
      delem->next->prev = delem->prev;
   else
   {
      delem->prev->next = NULL;
      list->Tail = delem->prev;
   }
   free(delem);
   list->Count--;
   return tmp;
}

Объяснение кода листинга программы

  1. Удаление элемента из списка реализовано в функции DeleteElement.
  2. Входные параметры функции: указатель на начало списка list и указатель на элемент, который необходимо удалить delem.
  3. Значение tmp инициализируется значением элемента, который будет удален.
  4. Проверяется условие, если элемент, который необходимо удалить, является последним элементом списка и единственным элементом, то выполняется освобождение памяти и обнуление всех указателей списка. После чего значение tmp возвращается.
  5. Если элемент, который необходимо удалить, не является последним, то выполняется перестановка указателей на предыдущий и следующий элементы.
  6. Если элемент, который необходимо удалить, является первым элементом списка, то выполняется перестановка указателей на следующий элемент списка.
  7. Если элемент, который необходимо удалить, является последним элементом списка, то выполняется перестановка указателей на предыдущий элемент списка.
  8. Освобождается память, выделенная под элемент, который был удален.
  9. Уменьшается счетчик количества элементов в списке.
  10. Функция возвращает значение tmp.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы