Недавно я читал книгу, и это объяснение для реализации стека в Связанном списке. Далее следует объяснение:Двойные указатели в реализации стека связанного списка
typedef struct Element {
struct Element *next;
void *data;
} Element;
Соответствующие прототипы нажимной и поп следуют:
void push(Element *stack, void *data);
void *pop(Element *stack);
Теперь рассмотрим, что происходит в этих процедур с точки зрения правильной работы и обработки ошибок. Обе операции меняют первый элемент списка. Указатель стека вызывающей процедуры должен быть изменен, чтобы отразить это изменение, но любое изменение, которое вы делаете на указатель, который передается этим функциям, не будет передаваться обратно в вызывающую процедуру. Вы можете решить эту проблему, если обе подпрограммы возьмут указатель на указатель на стек. Таким образом, вы можете изменить указатель вызывающей подпрограммы так, чтобы он продолжал указывать на первый элемент списка. Реализация этой результаты изменений в следующем:
void push(Element **stack, void *data);
void *pop(Element **stack);
Однако, что интересно, это то, что есть необходимость ставить двойные указатели на стек? Я понимаю понятие двойных указателей, но, однако, когда новый узел создается с использованием Element *node1 = (Element *) malloc (sizeof(Element));
, у нас уже есть указатель на узел. Почему бы просто не отправить этот указатель сам, а не использовать двойной указатель?
Вы были настолько успешны в объяснении, почему требуется «двойной» указатель, что неясно, о чем вы действительно задумываетесь. Ключевым аргументом, похоже, является «Указатель стека вызывающей подпрограммы должен быть изменен, чтобы отразить это изменение». –
Вы можете прочитать это как: любое изменение, которое вы делаете на указатель, переданный этим функциям, будет передаваться обратно в вызывающую подпрограмму –
Тогда, я думаю, я не совсем понимаю «вызов указателя стека подпрограмм». Может кто-нибудь объяснить? – House