chapter4栈与队列 2.链栈实现

链栈实现

ElementType.h 元素类型定义
#ifndef ELEMENT_H_INCLUDED
#define ELEMENT_H_INCLUDED


#define MAX_SIZE 100
#define  true 1
#define false 0
// 用来定义一些常用的数据元素
typedef struct{
    int id;
    char * name;
}ElementType;



#endif // ELEMENT_H_INCLUDED

LinkedStack.h 顺序栈头文件(包含栈数据结构、函数方法声明)
#ifndef LINKEDSTACK_H_INCLUDED
#define LINKEDSTACK_H_INCLUDED

//链栈头文件:定义链栈数据结构及常用操作

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

//定义链栈的结点
typedef struct StackNode{
    ElementType data;                  //数据元素
    struct StackNode* next;            //指针指向下个节点
}StackNode;

//定义链栈结构
typedef struct LinkedStack{
    StackNode* top;                     //栈顶指针
    int length;                         //链栈长度(元素个数)
}LinkedStack;

//初始化
void InitLinkedStack(LinkedStack* linkedstack);

//压栈操作 返回成功与否
int PushLinkedStack(LinkedStack* linkedstack,ElementType element);

//出栈操作 返回成功与否 用一个指针保存出栈元素
int PopLinkedStack(LinkedStack* linkedstack,ElementType *element);

//清空栈
void ClearLinkedStack(LinkedStack* linkedstack);

//删除整个栈
void DestroyLinkedStack(LinkedStack* linkedstack);
#endif // LINKEDSTACK_H_INCLUDED

SeqStack.c 顺序栈实现文件(包含栈函数方法实现)
#include "LinkedStack.h"


void InitLinkedStack(LinkedStack* linkedstack)
{
    linkedstack->top = NULL;
    linkedstack->length = 0;
}

//压栈操作 返回成功与否
int PushLinkedStack(LinkedStack* linkedstack,ElementType element)
{
    //创建一个新节点
    StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
    newNode->data = element;
    //新节点从链表头部插入,搞定指针域
    newNode->next = linkedstack->top;
    linkedstack->top = newNode;
    //最后长度++
    linkedstack->length++;
    return true;
}

//出栈操作 返回成功与否 用一个指针保存出栈元素
int PopLinkedStack(LinkedStack* linkedstack,ElementType *element)
{
    //首先判断栈是否为空
    if(linkedstack->top == NULL){
        printf("空栈\n");
        return false;
    }
    //保存元素
    *element = linkedstack->top->data;
    //出栈 因为要free 所以先保存一下栈顶元素的地址
    StackNode* tempNode = linkedstack->top;
    linkedstack->top = linkedstack->top->next;
    free(tempNode);

    linkedstack->length--;
    return true;
}

//清空栈
void ClearLinkedStack(LinkedStack* linkedstack)
{
    //遍历元素并释放空间,每次释放一个结点。需要一个变量,防止top丢了
    StackNode* tempNode;
    while(linkedstack->top){
        tempNode = linkedstack->top;
        linkedstack->top = linkedstack->top->next;
        free(tempNode);
        linkedstack->length--;
    }
}

//删除整个栈
void DestroyLinkedStack(LinkedStack* linkedstack)
{
    //先清空栈,再删除栈空间
    ClearLinkedStack(linkedstack);
    free(linkedstack);
    linkedstack = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值