数据结构——链栈的基本操作实现(带头结点)

该文介绍如何使用C语言实现链栈的初始化、进栈、出栈、取栈顶、判断链栈空以及遍历等操作,同时利用C++的引用特性辅助理解。示例代码包括链栈结构体定义、相关函数实现及测试用例。
摘要由CSDN通过智能技术生成

C语言实现链栈的初始化、进栈、出栈、取栈顶、判链栈空,遍历等基本操作(另外使用了C++中的引用知识,以便小白更好的入手)

//链栈的基本实现(带头结点)
#include <stdio.h>
#include <cstdlib>
typedef int Element;
//链栈的存储类型
typedef struct LinkNodeStack{
    //定义数据域
    Element data;
    //定义指针域
    struct LinkNodeStack *next;
}LinkedNodeStack,*LinkedStack;//这里LinkedNodeStack只想表示链栈结点,LinkedStack想表示栈链
//初始化链栈
bool InitLinkedStack(LinkedStack &S){
    S = (LinkedStack) malloc (sizeof (LinkedNodeStack));
    //判断链栈头结点内存是否申请成功
    if(!S){
        return false;
    }
    S->next = NULL;
    return true;
}
//链栈进栈
bool PushLinkedStack(LinkedStack &S,Element e){
    LinkedNodeStack *p;
    //为p结点分配内存
    p = (LinkedNodeStack*) malloc(sizeof (LinkedNodeStack));
    //判断p结点是否分配成功
    if(!p){
        return false;
    }
    //将e元素放入p结点中的数据域中
    p->data = e;
    //链栈栈顶元素链入新结点,p结点变成栈顶
    p->next = S->next;
    //p结点链入链栈头结点
    S->next = p;
    return true;
}
//链栈出栈
bool PopLinkedStack(LinkedStack &S,Element &e){
    //判断链栈空
    if(!S->next){
        return false;
    }
    //让p指针指针指向链栈顶
    LinkedNodeStack *p = S->next;
    //将链栈顶元素取出,放入e
    e = p->data;
    //让头结点指针跳过p结点,指向p结点的下一个结点
    S->next = p->next;
    //释放p结点内存
    free(p);
    return true;
}
//读取链栈顶元素
bool GetTopLinkedStack(LinkedStack S,Element &e){
    if(!S->next){
        return false;
    }
    //将头结点指向的第一个结点中的数据域取出
    e = S->next->data;
    return true;
}
//判链栈空
bool LinkedStackEmpty(LinkedStack S){
    if(S->next == NULL){
        printf("链栈为空!!!");
        return false;
    }else{
        printf("链栈不为空!!!");
        return true;
    }
}
//打印链栈元素
void PrintLinkedStack(LinkedStack S){
    //判断链栈空
    if(!S->next){
        return;
    }
    LinkedNodeStack *p = S->next;
    while(p){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}
//测试
int main(){
    LinkedStack s;
    Element e;
    InitLinkedStack(s);
    PushLinkedStack(s,23);
    PushLinkedStack(s,2);
    PushLinkedStack(s,14);
    PushLinkedStack(s,9);
    PopLinkedStack(s,e);
    printf("PopLinkedStack:%d\n",e);
    GetTopLinkedStack(s,e);
    printf("GetTopLinkedStack:%d\n",e);
    printf("PrintLinkedStack:");
    PrintLinkedStack(s);
    LinkedStackEmpty(s);
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值