栈的链式存储

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

typedef int ElemType;
#define MAXSIZE 20

typedef struct LinkStackNode
{
    ElemType data;
    struct LinkStackNode *next;
}LinkStackNode;

typedef struct LinkStack
{
    //不应该是头结点,而是头结点地址
    //栈就是指向栈顶(头)
    LinkStackNode *top;//只保存头节点的位置
    int length;
}LinkStack;


LinkStack* Create_Stack()
{
    LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));
    if(stack == NULL)
    {
        return NULL;
    }

    stack->top = NULL;
    stack->length = 0;

    return stack;
}


int Push_Stack(LinkStack *stack,ElemType data)
{
    if(stack == NULL)
    {
        return -1;
    }

    LinkStackNode *node = malloc(sizeof(LinkStackNode));
    if(node == NULL)
    {
        return -1;
    }

    node->data = data;
    node->next = NULL;

    //注意都是在栈顶操作,
    //头插法
    node->next = stack->top;
    stack->top = node;

    stack->length++;
    return 0;
}

int Pop_Stack(LinkStack *stack,ElemType *value)
{
    LinkStackNode *tmp = NULL;
    if(stack == NULL || value == NULL)
    {
        return -1;
    }

    if(stack->length < 0)
    {
    //没有数据,无法弹出
        return -2;
    }

    if(stack->length == 1)
    {
        //只有一个的特殊情况
        //直接free
        *value = stack->top->data;
        free(stack->top);
        stack->top = NULL;

        return 0;
    }

    //到这一定有大于1的数据
    //  1       2     3
    // .(切断)  .
    //top   .
    *value = stack->top->data;
    tmp = stack->top;
    stack->top = tmp->next;

    stack->length--;

    return 0;
}

int Top_Stack(LinkStack *stack,ElemType *value)
{
    if(stack == NULL || value == NULL)
    {
        return -1;
    }

    if(stack->length <= 0)
    {
        return -2;
    }

    *value = stack->top->data;

    return 0;
}

void Destroy_Stack(LinkStack *stack)
{
    LinkStackNode *tmp = NULL;
    if(stack == NULL)
    {
        return;
    }

    //1   2    3  NULL
    while(stack->top)
    {
        tmp = stack->top->next;
        free(stack->top);
        stack->top = tmp;
    }

    free(stack);
}

int main()
{
    int i = 0,value = 0;
    LinkStack *stack = Create_Stack();

    for(i=0;i<=20;i++)  //故意多一个
    {
        if(Push_Stack(stack,i) != 0)
        {
            printf("push %d error\n",i);
        }
        else
        {
            Top_Stack(stack,&value);
            printf("top:%d  ",value);
        }
    }


    Pop_Stack(stack,&value);
    printf("\ndelete num:%d\n",value);

    Destroy_Stack(stack);

    return 0;
}

结果:
top:0 top:1 top:2 top:3 top:4 top:5 top:6 top:7 top:8 top:9 top:10 to
p:11 top:12 top:13 top:14 top:15 top:16 top:17 top:18 top:19 top:20
delete num:20

从结果来看,由于链式存储不存在数量的限制,可以插入第20个。同时要注意这里的Destroy函数,看看我是如何释放内存的。不过,只要是malloc出来的,你就得free。初学者的易错点在于只是free掉了stack,却忘了stack里面的结点都是都是你malloc出来的,也要释放,借助top指针进行逐一释放。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值