C语言实现栈

#include <stdio.h>
#include <stdlib.h>
/*
    链栈的实现
*/
typedef int ElemType;
typedef struct Node{
    ElemType elem;
    struct Node *next;
}Node;
Node *top = NULL;

void init(Node *node);
void destroy(Node *node);
void push(Node *node, ElemType elem);
int pop(Node  *node);
void traverse(Node *node);

int main()
{
    Node *node = NULL;
    init(node);
    push(node,1);
    push(node,2);
    push(node,3);
    push(node,4);
    traverse(node);
    printf("%d\n",pop(node));
    traverse(node);
    destroy(node);
    return 0;
}

void init(Node *node){
    top = (Node*)malloc(sizeof(Node));
    top->next = NULL;
    top->elem = 0;
}

void destroy(Node *node){
    node = top;
    while(node->next != NULL){
        free(node);
        node = node->next;
    }
    top = NULL;
}
/*
    入栈:使用的是链表的头插法的思想
    1.为需要插入的节点分配内存空间
    2.将需要插入的元素赋给新节点的值域
    3.将头结点的下一个节点赋值给新节点的下一个节点
    4.将新节点赋值给头结点的下一个节点
*/
void push(Node *node, ElemType elem){
    node = (Node*)malloc(sizeof(Node));
    node->elem = elem;
    node->next = top->next;
    top->next = node;
}
/*
    出栈:使用的是链表的头删除思想
    1.将需要删除的节点取出,赋值给一个临时变量
    2.将需要删除的节点的下一个节点赋值给需要删除的节点的上一个节点的下一个
    3.free掉需要删除的节点即可
*/
int pop(Node *node){
    Node *new_node = top->next;
    ElemType elem = new_node->elem;
    top->next = new_node->next;
    free(new_node);
    return  elem;
}

void traverse(Node *node){
        node = top;
    while(node->next != NULL){
        printf("%d ",node->next->elem);
        node = node->next;
    }
}

你可能感兴趣的