linkedliststack.h

/**
* @file         : linkedliststack
* @brief        : 创建链式结构体,实现链式结构体的入栈和出栈       
* @author       : TingFengLuo@126.com 
* @date         : 2026-1-1
* @version      : V1.0
* @note         : NULL
*/
#ifndef __LINKEDLISTSTACK_H_
#define __LINKEDLISTSTACK_H_

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//将int重命名DataType_t,便于用户修改数据类型
#define DataType_t int

//创建链式结构体节点
typedef struct linkedliststack{
    DataType_t data;
    struct linkedliststack* next;
}LLStack;

//创建链式结构体
LLStack *LLStack_create(void);
//判断链式栈是否为空 
bool LLStack_IsEmpty(LLStack * head);
//创建新节点
LLStack *LLStack_NewNode(DataType_t data);
//压栈
bool LLStack_Push(LLStack * head,DataType_t data);
//出栈
DataType_t LLStack_Pop(LLStack * head);

#endif

linkedliststack.c

#include "linkedliststack.h"
/**
* @file         : LLStack_create
* @brief        : 实现创建空链式结构体,并对链式结构体初始化
* @param        : NULL
* @date         : 2026-1-1
* @version      : V1.0
* @note         :在链式栈创建一个头节点,并将头节点作为栈顶
**/
LLStack *LLStack_create(void)
{
    //创建head变量,作为哨兵,用于管理链式栈
    LLStack *head = (LLStack *)calloc(1,sizeof(LLStack));
    //判断链式栈是否创建成功
    if(NULL == head){
        printf("Linked list create head failed\n");
        return NULL;
    }

    head->next = NULL;
    return head;
}

/**
* @file         : LLStack_IsEmpty
* @brief        : 判断链表是否为空,为之后的出栈做准备
* @param     
            @head:需要操作的链式结构体
* @date         : 2026-1-1
* @version      : V1.0
* @note         :在链式栈创建一个头节点,并将头节点作为栈顶
**/
bool LLStack_IsEmpty(LLStack * head)
{
    return head->next==NULL ? true : false;
}


/**
* @file         : LLStack_NewNode
* @brief        : 创建新节点,便于后续压栈
* @param     
            @data:需要发送的数据
* @date         : 2026-1-1
* @version      : V1.0
* @note         :在链式栈创建一个头节点,并将头节点作为栈顶
**/
LLStack *LLStack_NewNode(DataType_t data)
{
    //创建变量用于存储新节点地址
    LLStack *new_node = (LLStack *)calloc(1,sizeof(LLStack));
    //判断新节点出否创建成功
    if(NULL == new_node){
        printf("Linked list stack create memory failed for new_node\n");
        return NULL;
    }

    //初始化新节点数据
    new_node->data = data;
    new_node->next = NULL;

    return new_node;
}

/**
* @file         : LLStack_Push
* @brief        : 压栈,按照栈的顺序,后进先出
* @param     
            @head:表示需要操作的链表栈
            @data:需要压入栈的数据
* @date         : 2026-1-1
* @version      : V1.0
* @note         :用头部表示栈顶
**/
bool LLStack_Push(LLStack * head,DataType_t data)
{
    //创建变量用于存储新节点地址;
    LLStack *new_node = LLStack_NewNode(data);
    //判断顺序栈是否存在
    if(NULL == head){
        printf("Linked list create head failed\n");
        return false;;
    }

    //判断链表是否为空
    if(LLStack_IsEmpty(head)){
         head->next = new_node;
         return true;
    }

    new_node->next = head->next;
    head->next = new_node;
    return true;

}

/**
* @file         : LLStack_Pop
* @brief        : 出栈,按照栈的顺序,后进先出
* @param     
            @head:表示需要操作的链表栈
* @date         : 2026-1-1
* @version      : V1.0
* @note         :用头部表示栈顶
**/
DataType_t LLStack_Pop(LLStack * head)
{
    //判断链式栈是否存在
    if(NULL == head){
        printf("Linked list create head failed\n");
        return -1;
    }

    //判断链表是否为空
    if(LLStack_IsEmpty(head)){
         printf("current Linked List Stack is Empty\n");
         return -1;
    }

    LLStack *phead = head->next;
    DataType_t data = phead->data;

    head->next = phead->next;
    free(phead);
    phead = NULL;

    return data;
}

main.c

#include "linkedliststack.h"

int main(int argc,const char *argv[]){
    LLStack *head = LLStack_create();
    if(head == NULL){
        printf("create head node failed\n");
        return -1;
    }

    LLStack_Push(head,10);
    DataType_t data = LLStack_Pop(head);
    printf("%d ",data);
    LLStack_Push(head,20);
    LLStack_Push(head,30);
    LLStack_Push(head,40);
    LLStack_Push(head,50);

    while(!LLStack_IsEmpty(head)){
        data = LLStack_Pop(head);
        printf("%d ",data);
    }
    printf("\n");

    return 0;

}

显示效果如下: