Задача «Двусвязные списки»

Реализовать модуль работы с двусвязными списками.

Взять структуру и набор функций из задачи «Связанные списки», изменив интерфейс с учетом большей симметричности двусвязного списка (пара функций изменят семантику, пару функций можно добавить — подумайте, какие именно).

В отличии от односвязного списка, потребуется дополнительная структура, содержащая указатели на голову и хвост списка. Именно эта структура будет видна пользователю,

Функциям дать префикс dlist: dlist_length(), dlist_free() и т.д.

Тесты на все функции с помощью assert.

Пример использования:

DList dl;
dlist_create(&dl);
dlist_prepend(&dl, "bb");
dlist_prepend(&dl, "aa");
dlist_append(&dl, "yy");
dlist_append(&dl, "zz");
dlist_nth(&dl, 0); // => aa
dlist_nth(&dl, 1); // => bb
dlist_nth(&dl, 2); // => yy
dlist_nth(&dl, 3); // => zz
dlist_destroy(&dl);