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;
}
显示效果如下:

发表回复