Stack ADT实现中难以理解的表达

Incomprehensible expression in Stack ADT implementation

下面有一个堆栈ADT实现。在这个实现中,程序员使用了链表。

struct Node {
    char *elem;
    struct Node *next;
};

static struct Node *new_node(void *elem, int elem_size)
{
    struct Node *n = malloc(sizeof(struct Node));
    n->elem = malloc(elem_size);
    memcpy(n->elem, elem, elem_size);
    n->next = NULL;

    retrun n;
}

struct Stack {
    int elem_size;
    int n_elems;
    struct Node *top;
}

我明白了,除了如下所示的代码块。

void stack_push(struct Stack *s, void *elem)
{
    struct Node *n = new_node(elem, s->elem_size);
    n->next = s->top;
    s->top = n;

    s->n_elems++;
}

我不明白

n->next = s->top;
s->top = n;

有没有人愿意帮助我理解这个语句。我会感激的。

推送操作将一个新项目添加到堆栈的顶部。在这个实现中,栈顶是s->top。堆栈中的第二项是 s->top->next,第三项是 s->top->next->next,依此类推。

我觉得比较容易想到

n->next = s->top;
s->top = n;

作为

s->top = n;
n->next = s->top;

第一个语句是使新节点n成为堆栈的顶部。但是堆栈的第二项是 NULL 而它应该是堆栈的旧顶部。第二条语句解决了这个问题,使旧的堆栈顶部成为堆栈的第二项。

让我们试试我的绘画技巧z:

之前:

之后:


NULL表示该节点不指向任何内容,即它是最后插入的节点。 请注意,next 指向下一个 节点 ,而不是那个节点的 next,我只是没有更好的方式在这里显示它。