Память не касается, некоторые мысли о том, как сделать списки ссылок быстрее.
Я думаю, что в вашем коде есть некоторая путаница.По своей сути связанный список выглядит так:
typdef struct _node {
...
struct _node *next;
} NODE;
В большинстве реализаций имеется void *
, на котором можно повесить полезную нагрузку.Сейчас это не особенно важно.
Вставка списка должна соединять указатели.Для простого добавления узла (и игнорирования добавления полезной нагрузки) существует 1 назначение, если узел идет в начале или в конце списка, и 2, если он идет в середине.Ничего не поделаешь, чтобы обойти это.
Иногда в простых списках используются только структуры узлов, поэтому вставка хвоста требует обхода.Это дорого.Наличие специальной структуры заголовка со знанием о первом и последнем узле устраняет эту стоимость.
Обходы можно ускорить, реализовав их в виде списка пропусков (http://en.wikipedia.org/wiki/Skip_list). Хотя необходимо соблюдать определенную осторожностьво время вставки узла для оптимизации (и вы получите больше указателей при вставке).