Список: после удаления элемента список не выводится - 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; }
Объяснение кода листинга программы
- Удаление элемента из списка реализовано в функции
DeleteElement
. - Входные параметры функции: указатель на начало списка
list
и указатель на элемент, который необходимо удалитьdelem
. - Значение
tmp
инициализируется значением элемента, который будет удален. - Проверяется условие, если элемент, который необходимо удалить, является последним элементом списка и единственным элементом, то выполняется освобождение памяти и обнуление всех указателей списка. После чего значение
tmp
возвращается. - Если элемент, который необходимо удалить, не является последним, то выполняется перестановка указателей на предыдущий и следующий элементы.
- Если элемент, который необходимо удалить, является первым элементом списка, то выполняется перестановка указателей на следующий элемент списка.
- Если элемент, который необходимо удалить, является последним элементом списка, то выполняется перестановка указателей на предыдущий элемент списка.
- Освобождается память, выделенная под элемент, который был удален.
- Уменьшается счетчик количества элементов в списке.
- Функция возвращает значение
tmp
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д