Ваш пример - стек, подкрепленный связанным списком.Таким образом, в этом случае вам нужно только сохранить указатель на голову;
struct stack {
node *head;
};
При каждой операции обновляйте head
по мере необходимости.
void stack_push(stack *s, int val) {
node *node = (node *) malloc(sizeof(node));
node->item = val;
node->next = s->head;
s->head = node;
}
EDIT
@ Осирис спрашивает в комментариях:
стек * узел * будет работать нормально, или нет?
Причина, по которой это плохая идеяэто из-за псевдонимов указателей:
/* Declare the stack using Osiris' type */
node *stack1 = ...;
node *stack2 = stack1;
stack_pop(&stack1);
stack_push(&stack2, 0); /* Crash accessing freed memory */
Очевидно, что эти ссылки могут быть многочисленными и разбросанными по разным модулям.Нет способа гарантировать отсутствие наложения указателя.Вы не сможете узнать, был ли ваш node *
действительным в любой момент времени.Вот почему представление стека просто как node *
как предложено не работает.
Однако, используя структуру, невозможно, чтобы операции, выполняемые с помощью одной ссылки, могли конфликтовать с операциями с другой ссылкой:
stack *stack1 = ...;
stack *stack2 = stack1;
stack_pop(stack1);
stack_push(stack2, 0); /* No crash */