Основы программирования для автоматизированного проектирования и решения творческих задач - 36 стр.

UptoLike

Составители: 

При удалении любого другого элемента списка необходимо найти элемент, расположенный в спи-
ске перед ним. Далее необходимо обойти указателем текущего элемента удаляемый элемент, перена-
правив его на следующий элемент после удаляемого. Таким образом будет сохранена целостность спи-
ска. После этого найденный элемент можно удалить.
П р и м е р 29
scanf("%d", &key);
other = first;
while (other->next->key != key && other->next != NULL)
other = other->next;
if (other->next->key == key)
{
new = other->next;
other->next = other->next->next;
free(new);
}
После окончания работы со списком необходимо освободить память, которую он занимал.
П р и м е р 30
do
{
other = first->next;
free(first);
}while ((first = other) != NULL);
12.2 Двунаправленный список
Следует заметить, что использование однонаправленных списков не всегда удобно, так как мы мо-
жем перемещаться по списку только в одну сторону. Между тем мы можем в процессе решения задачи
столкнуться с необходимостью перемещаться по цепочке в обратном направлении. Для достижения
этой цели введем в состав описания динамической структуры еще один указатель:
struct lSp1
{
struct lSP1 *next, *last;
int key;
};
В этом случае можно связать указатель next со следующим элементом списка, а указатель last с преды-
дущим.
При создании списка возможны два варианта организации цепочки. Можно при создании первого
элемента обоим указателям присвоить константу NULL. При этом получится линейная структура спи-
ска (рис. 11, а). Если же обоим указателям присвоить адрес созданного элемента, то получится кольце-
вая структура списка (рис. 11, б).
а)
NULL
NULL