C语言实现基于链表的链式栈

C语言实现基于顺序表的顺序栈
代码实现:
linkStack.h文件

#pragma once

#include<stddef.h>

typedef char linkType;

typedef struct linkNode
{
    linkType data;
    struct linkNode *next;
}linkNode;

linkNode *stackhead;
//初始化函数
void linkStackInit(linkNode **stackhead);
//销毁函数
void linkStackDestroy(linkNode **stackhead);
//入栈函数
void linkStackPush(linkNode **stackhead,linkType value);
//出栈函数
void linkStackPop(linkNode **stackhead);
//取栈顶元素函数
int linkStackGetTop(linkNode *stackhead,linkType *value);

linkStack.c文件

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

#define Test_Header printf("\n============%s============\n",__FUNCTION__);


linkNode *CreateNode(linkType value)
{
    linkNode *new_node = (linkNode *)malloc(sizeof(linkNode));
    new_node->data = value;
    new_node->next = NULL;
    return new_node;
}
//初始化函数
void linkStackInit(linkNode **stackhead)
{
    if(stackhead == NULL)
    {
        //非法输入
        return;
    }
    *stackhead = NULL;
}
//销毁函数
void linkStackDestroy(linkNode **stackhead)
{
    if(stackhead == NULL)
    {
        //非法输入
        return;
    }
    //循环遍历链式栈,释放每一个节点
    linkNode *cur = *stackhead;
    for(;cur != NULL;cur = cur->next)
    {
        free(cur);
    }
    *stackhead = NULL;
}
//入栈函数
void linkStackPush(linkNode **stackhead,linkType value)
{
    if(stackhead == NULL)
    {
        //非法输入
        return;
    }
    //每一次入栈操作就相当于链表的头插操作
    linkNode *new_node = CreateNode(value);
    new_node->next = *stackhead;
    *stackhead = new_node;
}
//出栈函数
void linkStackPop(linkNode **stackhead)
{
    if(stackhead == NULL)
    {
        //非法输入
        return;
    }
    if(*stackhead == NULL)
    {
        //空栈
        return;
    }
    //每一次出栈操作就相当于链表的头删操作
    linkNode *to_delete = *stackhead;
    *stackhead = to_delete->next;
    free(to_delete);
}
//取栈顶元素函数
int linkStackGetTop(linkNode *stackhead,linkType *value)
{
    if(stackhead == NULL)
    {
        //非法输入
        return 0;
    }
    //相当于读取链表第一个节点的值
    *value = stackhead->data;
    return 1;
}
void Print(linkNode *stackhead,const char *msg)
{
    printf("[%s]\n",msg);
    if(stackhead == NULL)
    {
        //空栈
        return;
    }
    linkNode *cur = stackhead;
    for(;cur != NULL;cur = cur->next)
    {
        printf("%c ",cur->data);
    }
    printf("\n\n");
}
//以下为测试函数
void TestLinkStack()
{
    Test_Header;
    linkStackInit(&stackhead);
    //入栈函数测试
    linkStackPush(&stackhead,'a');
    linkStackPush(&stackhead,'b');
    linkStackPush(&stackhead,'c');
    linkStackPush(&stackhead,'d');
    Print(stackhead,"入栈四个元素:a b c d");
    //出栈函数测试
    linkStackPop(&stackhead);
    linkStackPop(&stackhead);
    Print(stackhead,"出栈两个元素");
    linkStackPop(&stackhead);
    linkStackPop(&stackhead);
    Print(stackhead,"再出栈两次");
    //取栈顶元素函数测试
    linkStackPush(&stackhead,'a');
    linkStackPush(&stackhead,'b');
    Print(stackhead,"入栈两个元素:a b");
    linkType value;
    int ret = linkStackGetTop(stackhead,&value);
    printf("expected top:b , actual top:%c\n",value);
    printf("expected ret:1 , actual ret:%d\n",ret);
    linkStackPop(&stackhead);
    linkStackPop(&stackhead);
    Print(stackhead,"将所有元素出栈");
    ret = linkStackGetTop(stackhead,&value);
    printf("expected ret:0 , actual ret:%d\n",ret);
}
//主函数调用测试函数
int main()
{
    TestLinkStack();
    return 0;
}

测试结果如下图:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值