" Могу ли я go вперед и назад в списке только с помощью алгебры указателей и удалить указатели на предыдущий / следующий? "
" Возможно, если я удалю указанным указателям не гарантируется, что узлы будут смежными друг с другом в том порядке, в котором они были размещены?"
Вы можете go туда и обратно, если у вас есть stati c или динамически выделяемый массив struct node
. Тогда гарантируется, что каждый элемент сохраняется в последующем порядке, и вы можете использовать arithmeti указателя c.
К сожалению, в большинстве случаев при использовании связанных списков это не так, поскольку каждый узел выделяется отдельно.
" Поэтому мне было интересно, могу ли я просто удалить указатели на предыдущий / следующий из структуры и перемещаться по списку, добавляя / вычитая к struct node *cursor
, чтобы сэкономить на выделенном память."
Как сказано выше, только когда вы выделили массив node
. Иначе, если каждый node
выделяется отдельно, то вы не можете или лучше сказать, что это неопределенное поведение при любой попытке.
Стандарт C запрещает приращение указателя после того, как он прошел агрегат или скалярный объект.
Не говоря уже о том, что, конечно, разыменование указателя, который указывает после агрегированного или скалярного объекта, также не допускается.
" Я надеюсь, что что если я malloc()
десять структур, а затем возьму struct node*
курсор на адрес заголовка списка и сделаю cursor = cursor + 7
, я получу 7-й узел списка, но, может быть, я ошибаюсь и так не работаю?"
Работает только если вы malloc()
все десять структур за один вызов malloc
. Затем структуры сохраняются рядом в памяти, и арифметические значения указателя c гарантированно работают.
Также обратите внимание, что вам нужно использовать cursor = cursor + 6;
, чтобы добраться до 7
-го узла, а не cursor = cursor + 7;
в качестве индексации начинается с 0
, а не с 1
.