Нужно
Язык C.
typedef struct l2 {
int key;
struct l2* next;
struct l2* prev;
} l1;
l2* head = NULL;
#ifdef TAIL
l2* tail = NULL;
#endif
Реализовать L2-список на базе указанной структуры со следующими функциями:
1) void l2_print(void); -- напечатать ключи всех элементов списка с первого до последнего;
2) void l2_print_rev(void); -- напечатать ключи всех элементов списка с последнего до первого;
3) l1* insert_head(int key); -- создать новый элемент списка с ключом key и вставить его в начало списка;
4) l1* insert_tail(int key); -- создать новый элемент списка с ключом key и вставить его в конец списка;
5) l1* find_and_insert_before(int old, int key); -- найти первый попавшийся элемент с ключом old и вставить перед ним новый элемент с ключом key. Если такого нет, то вставить в начало списка;
6) l1* find_and_insert_after(int old, int key); -- найти первый попавшийся элемент с ключом old и вставить после него новый элемент с ключом key. Если такого нет, то вставить в конец списка;
7) l1* find(int key); -- найти элемент с ключом key и вернуть на него указатель. Если такого элемента нет, то вернуть NULL;
8) void remove_by_ptr(l1* p); -- удалить из списка элемент, на который указывает p;
9) void remove_by_key(int key); -- удалить из списка первый попавшийся элемент с ключом, равным key;
10) void remove_all_by_key(int key); удалить из списка все элементы, у которых ключ равен key.
Переменные head и tail в любой момент времени должны указывать на голову и хвост списка соответственно.
Программа должна работать/компилироваться как с определенной с помощью #define константой TAIL, так и без нее