C语言--栈的链式存储

上篇博客实现了栈的顺序存储,今天来实现栈的链式存储。

上代码:

includes.h:

#ifndef __INCLUDES_H__
#define __INCLUDES_H__

#ifdef __cpluscplus  
extern "C" {  
#endif  
  
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "chain_stack.h"
#include "test.h"
  
#ifdef __cplusplus  
}  
#endif  

#endif

chain_statck.h:

#ifndef __CHAIN_STACK_H__
#define __CHAIN_STACK_H__

#ifdef __cpluscplus  
extern "C" {  
#endif  

#define STACK_SIZE_MAX   1024
#define EMPTY_STACK_FLAG 0
#define STACK_DATA_ERROR -1
#define STACK_IS_EMPTY   1
#define STACK_NOT_EMPTY  0

struct  stack_node 
{
    //只维护指针域
    struct stack_node *next;
};
//栈的结构体
struct  LStack
{
    struct stack_node pHeader;  //头结点
    int m_size;   //栈的大小
};

typedef void *chain_stack;

//初始化栈
chain_stack init_chain_stack(void);
//入栈
void push_chain_stack(chain_stack stack,void *data);
//出栈
void pop_chain_stack(chain_stack stack);
//获取栈顶元素
void * top_chain_stack(chain_stack stack);
//栈的大小
int size_chain_stack(chain_stack stack);
//判断栈是否为空
int is_empty_chain_stack(chain_stack stack);
//销毁栈
void destroy_chain_stack(chain_stack stack);
  
#ifdef __cplusplus  
}  
#endif  

#endif

chain_statck.c:

#include "includes.h"


//初始化栈
chain_stack init_chain_stack(void)
{
    struct LStack *my_stack = malloc(sizeof(struct LStack));

    if(NULL == my_stack)
    {
        return NULL;
    }

    //头结点指向为空
    my_stack->pHeader.next = NULL;
    //初始化栈的大小
    my_stack->m_size = 0;

    return my_stack;
}
//入栈
void push_chain_stack(chain_stack stack,void *data)
{
    if(NULL == stack)
    {
        return ;
    }

    if(NULL == data)
    {
        return ;
    }

    //入栈就是头插
    struct LStack *my_stack = stack;
    
    //先拿到用户数据的前四个字节
    struct stack_node *my_node = data;
    //入栈
    my_node->next = my_stack->pHeader.next;
    my_stack->pHeader.next = my_node;

    //更新栈的大小
    my_stack->m_size++;   
}
//出栈
void pop_chain_stack(chain_stack stack)
{
    if(NULL == stack)
    {
        return ;
    }

    //如果是空栈,不执行出栈
    struct LStack *my_stack = stack;
    if(my_stack->m_size <= 0)
    {
        return ;
    }
    
    //执行出栈
    //保存第一个有数据的结点(栈顶元素)
    struct stack_node *pFirst = my_stack->pHeader.next;
    my_stack->pHeader.next = pFirst->next;
    //更新栈的大小
    my_stack->m_size--;
}
//获取栈顶元素
void * top_chain_stack(chain_stack stack)
{
    if(NULL == stack)
    {
        return ;
    }

    struct LStack *my_stack = stack;
    //如果是空栈 返回NULL
    if(EMPTY_STACK_FLAG == my_stack->m_size)
    {
        return NULL;
    }

    //将第一个有数据的结点返回
    return my_stack->pHeader.next;
}
//栈的大小
int size_chain_stack(chain_stack stack)
{
    if(NULL == stack)
    {
        return STACK_DATA_ERROR;
    }

    struct LStack *my_stack = stack;

    return my_stack->m_size;
}
//判断栈是否为空
int is_empty_chain_stack(chain_stack stack)
{
    if(NULL == stack)
    {
        return STACK_DATA_ERROR;  //真
    }

    struct LStack *my_stack = stack;
    if(my_stack->m_size <= 0)
    {
        return STACK_IS_EMPTY;    //真
    }
    
    return STACK_NOT_EMPTY;  //返回假,代表不是空栈
}

//销毁栈
void destroy_chain_stack(chain_stack stack)
{
    if(NULL == stack)
    {
        return;
    }

    free(stack);
    stack = NULL;
}

test.h

#ifndef __TESE_H__
#define __TESE_H__

#ifdef __cpluscplus  
extern "C" {  
#endif  

//测试结构体
struct Person
{
    struct stack_node node;
    char name[64];
    int age;
};

//功能测试
void function_test(void);
  
#ifdef __cplusplus  
}  
#endif  

#endif

test.c

#include "includes.h"

void function_test(void)
{ 
    int stack_size;
    //准备出6个person数据
    struct Person p1 ={NULL,"AAA",18};
    struct Person p2 ={NULL,"BBB",20};
    struct Person p3 ={NULL,"CCC",30};
    struct Person p4 ={NULL,"DDD",28};
    struct Person p5 ={NULL,"EEE",43};
    struct Person p6 ={NULL,"FFF",19};

    //初始化栈
    chain_stack stack = init_chain_stack();

    //入栈
    push_chain_stack(stack,&p1);
    push_chain_stack(stack,&p2);
    push_chain_stack(stack,&p3);
    push_chain_stack(stack,&p4);
    push_chain_stack(stack,&p5);
    push_chain_stack(stack,&p6);

    //如果栈不为空 访问栈顶元素并出栈
    while (STACK_NOT_EMPTY == is_empty_chain_stack(stack))
    {
        //栈顶元素
        struct Person *p_top = top_chain_stack(stack);
        printf("栈顶元素:\n 姓名:%s,年龄:%d\n",p_top->name, p_top->age);
    
        //出栈
        pop_chain_stack(stack);
    }

    //当前栈的大小
    stack_size = size_chain_stack(stack);
    printf("栈的大小:%d\n",stack_size);
    
    //销毁栈
    destroy_chain_stack(stack);
}

main.c

#include "includes.h"

//主函数
int main(void)
{
    //功能测试
    function_test();
    
    return 0;
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值