#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int value;
struct Node *prev;
struct Node *next;
} Node;
typedef struct {
Node *head;
Node *tail;
} List;
// Создание нового узла
Node *create_node(int value)
{
Node
*node
= malloc(sizeof(Node
));
if (node == NULL) {
return NULL;
}
node->value = value;
node->prev = NULL;
node->next = NULL;
return node;
}
// Добавление в конец
void push_back(List *list, int value)
{
Node *node = create_node(value);
if (node == NULL) {
return;
}
if (list->tail == NULL) {
// Список пуст
list->head = node;
list->tail = node;
return;
}
node->prev = list->tail;
list->tail->next = node;
list->tail = node;
}
// Вывод слева направо
void print_forward(const List *list)
{
Node *current = list->head;
while (current != NULL) {
printf("%d ", current
->value
); current = current->next;
}
}
// Вывод справа налево
void print_backward(const List *list)
{
Node *current = list->tail;
while (current != NULL) {
printf("%d ", current
->value
); current = current->prev;
}
}
// Удаление узла
void remove_node(List *list, Node *node)
{
if (node == NULL) {
return;
}
// Если есть предыдущий узел,
// связываем его со следующим.
if (node->prev != NULL) {
node->prev->next = node->next;
} else {
// Удаляется head
list->head = node->next;
}
// Если есть следующий узел,
// связываем его с предыдущим.
if (node->next != NULL) {
node->next->prev = node->prev;
} else {
// Удаляется tail
list->tail = node->prev;
}
}
// Поиск узла
Node *find_node(const List *list, int value)
{
Node *current = list->head;
while (current != NULL) {
if (current->value == value) {
return current;
}
current = current->next;
}
return NULL;
}
// Освобождение списка
void free_list(List *list)
{
Node *current = list->head;
while (current != NULL) {
Node *next = current->next;
current = next;
}
list->head = NULL;
list->tail = NULL;
}
int main(void)
{
List list = {
.head = NULL,
.tail = NULL
};
push_back(&list, 10);
push_back(&list, 20);
push_back(&list, 30);
push_back(&list, 40);
print_forward(&list);
// Удаление узла из середины
// находим узел 30
Node *node = find_node(&list, 30);
// удаляем его
remove_node(&list, node);
print_backward(&list);
free_list(&list);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgc3RydWN0IE5vZGUgewogICAgaW50IHZhbHVlOwoKICAgIHN0cnVjdCBOb2RlICpwcmV2OwogICAgc3RydWN0IE5vZGUgKm5leHQ7Cn0gTm9kZTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIE5vZGUgKmhlYWQ7CiAgICBOb2RlICp0YWlsOwp9IExpc3Q7CgoKLy8g0KHQvtC30LTQsNC90LjQtSDQvdC+0LLQvtCz0L4g0YPQt9C70LAKTm9kZSAqY3JlYXRlX25vZGUoaW50IHZhbHVlKQp7CiAgICBOb2RlICpub2RlID0gbWFsbG9jKHNpemVvZihOb2RlKSk7CgogICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7CiAgICBub2RlLT5wcmV2ID0gTlVMTDsKICAgIG5vZGUtPm5leHQgPSBOVUxMOwoKICAgIHJldHVybiBub2RlOwp9CgoKLy8g0JTQvtCx0LDQstC70LXQvdC40LUg0LIg0LrQvtC90LXRhgp2b2lkIHB1c2hfYmFjayhMaXN0ICpsaXN0LCBpbnQgdmFsdWUpCnsKICAgIE5vZGUgKm5vZGUgPSBjcmVhdGVfbm9kZSh2YWx1ZSk7CgogICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAobGlzdC0+dGFpbCA9PSBOVUxMKSB7CiAgICAgICAgLy8g0KHQv9C40YHQvtC6INC/0YPRgdGCCiAgICAgICAgbGlzdC0+aGVhZCA9IG5vZGU7CiAgICAgICAgbGlzdC0+dGFpbCA9IG5vZGU7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG5vZGUtPnByZXYgPSBsaXN0LT50YWlsOwogICAgbGlzdC0+dGFpbC0+bmV4dCA9IG5vZGU7CiAgICBsaXN0LT50YWlsID0gbm9kZTsKfQoKCi8vINCS0YvQstC+0LQg0YHQu9C10LLQsCDQvdCw0L/RgNCw0LLQvgp2b2lkIHByaW50X2ZvcndhcmQoY29uc3QgTGlzdCAqbGlzdCkKewogICAgTm9kZSAqY3VycmVudCA9IGxpc3QtPmhlYWQ7CgogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIHByaW50ZigiJWQgIiwgY3VycmVudC0+dmFsdWUpOwogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQoKICAgIHByaW50ZigiXG4iKTsKfQoKCi8vINCS0YvQstC+0LQg0YHQv9GA0LDQstCwINC90LDQu9C10LLQvgp2b2lkIHByaW50X2JhY2t3YXJkKGNvbnN0IExpc3QgKmxpc3QpCnsKICAgIE5vZGUgKmN1cnJlbnQgPSBsaXN0LT50YWlsOwoKICAgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwpIHsKICAgICAgICBwcmludGYoIiVkICIsIGN1cnJlbnQtPnZhbHVlKTsKICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+cHJldjsKICAgIH0KCiAgICBwcmludGYoIlxuIik7Cn0KCi8vINCj0LTQsNC70LXQvdC40LUg0YPQt9C70LAKdm9pZCByZW1vdmVfbm9kZShMaXN0ICpsaXN0LCBOb2RlICpub2RlKQp7CiAgICBpZiAobm9kZSA9PSBOVUxMKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vINCV0YHQu9C4INC10YHRgtGMINC/0YDQtdC00YvQtNGD0YnQuNC5INGD0LfQtdC7LAogICAgLy8g0YHQstGP0LfRi9Cy0LDQtdC8INC10LPQviDRgdC+INGB0LvQtdC00YPRjtGJ0LjQvC4KICAgIGlmIChub2RlLT5wcmV2ICE9IE5VTEwpIHsKICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8g0KPQtNCw0LvRj9C10YLRgdGPIGhlYWQKICAgICAgICBsaXN0LT5oZWFkID0gbm9kZS0+bmV4dDsKICAgIH0KCiAgICAvLyDQldGB0LvQuCDQtdGB0YLRjCDRgdC70LXQtNGD0Y7RidC40Lkg0YPQt9C10LssCiAgICAvLyDRgdCy0Y/Qt9GL0LLQsNC10Lwg0LXQs9C+INGBINC/0YDQtdC00YvQtNGD0YnQuNC8LgogICAgaWYgKG5vZGUtPm5leHQgIT0gTlVMTCkgewogICAgICAgIG5vZGUtPm5leHQtPnByZXYgPSBub2RlLT5wcmV2OwogICAgfSBlbHNlIHsKICAgICAgICAvLyDQo9C00LDQu9GP0LXRgtGB0Y8gdGFpbAogICAgICAgIGxpc3QtPnRhaWwgPSBub2RlLT5wcmV2OwogICAgfQoKICAgIGZyZWUobm9kZSk7Cn0KCi8vINCf0L7QuNGB0Log0YPQt9C70LAKTm9kZSAqZmluZF9ub2RlKGNvbnN0IExpc3QgKmxpc3QsIGludCB2YWx1ZSkKewogICAgTm9kZSAqY3VycmVudCA9IGxpc3QtPmhlYWQ7CgogICAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCkgewogICAgICAgIGlmIChjdXJyZW50LT52YWx1ZSA9PSB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgICB9CgogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwogICAgfQoKICAgIHJldHVybiBOVUxMOwp9CgovLyDQntGB0LLQvtCx0L7QttC00LXQvdC40LUg0YHQv9C40YHQutCwCnZvaWQgZnJlZV9saXN0KExpc3QgKmxpc3QpCnsKICAgIE5vZGUgKmN1cnJlbnQgPSBsaXN0LT5oZWFkOwoKICAgIHdoaWxlIChjdXJyZW50ICE9IE5VTEwpIHsKICAgICAgICBOb2RlICpuZXh0ID0gY3VycmVudC0+bmV4dDsKICAgICAgICBmcmVlKGN1cnJlbnQpOwogICAgICAgIGN1cnJlbnQgPSBuZXh0OwogICAgfQoKICAgIGxpc3QtPmhlYWQgPSBOVUxMOwogICAgbGlzdC0+dGFpbCA9IE5VTEw7Cn0KCgppbnQgbWFpbih2b2lkKQp7CiAgICBMaXN0IGxpc3QgPSB7CiAgICAgICAgLmhlYWQgPSBOVUxMLAogICAgICAgIC50YWlsID0gTlVMTAogICAgfTsKCiAgICBwdXNoX2JhY2soJmxpc3QsIDEwKTsKICAgIHB1c2hfYmFjaygmbGlzdCwgMjApOwogICAgcHVzaF9iYWNrKCZsaXN0LCAzMCk7CiAgICBwdXNoX2JhY2soJmxpc3QsIDQwKTsKCiAgICBwcmludGYoIkZvcndhcmQ6ICAiKTsKICAgIHByaW50X2ZvcndhcmQoJmxpc3QpOwogICAgCiAgICAvLyDQo9C00LDQu9C10L3QuNC1INGD0LfQu9CwINC40Lcg0YHQtdGA0LXQtNC40L3RiwogICAgLy8g0L3QsNGF0L7QtNC40Lwg0YPQt9C10LsgMzAKICAgIE5vZGUgKm5vZGUgPSBmaW5kX25vZGUoJmxpc3QsIDMwKTsKICAgIC8vINGD0LTQsNC70Y/QtdC8INC10LPQvgogICAgcmVtb3ZlX25vZGUoJmxpc3QsIG5vZGUpOwoKICAgIHByaW50ZigiQmFja3dhcmQ6ICIpOwogICAgcHJpbnRfYmFja3dhcmQoJmxpc3QpOwoKICAgIGZyZWVfbGlzdCgmbGlzdCk7CgogICAgcmV0dXJuIDA7Cn0=