数据结构——链式储存栈(由用户提供指针 )C语言描述

链式储存栈(由用户提供指针 )

模型

数据结构——链式储存栈(由用户提供指针 )C语言描述_第1张图片

C代码

//
//  Chain storage of stacks
// Created by wen on 2021/9/21.
//通过链表模拟出先进后出的栈的结构
//

#include "Chain storage of stacks.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

//设置栈节点的结构体
typedef struct StackNode {
    //只维护一个指针域
    struct StackNode *next;
} StackNode;

//设置栈的结构体
typedef struct LStack {
    //头结点
    StackNode  pHeader;
    int m_size;
} LStack;

//保护栈的安全
typedef void *LinkStack;

//接口
//初始化栈
LinkStack init_LinkStack() {
    //初始化
    LStack *myLStack = malloc(sizeof(LStack));
    if (myLStack == NULL) {
        return NULL;
    }
    //设置初始化头结点
    //栈中头节点的下一指向为NULL
    myLStack->pHeader.next = NULL;
    //初始化大小
    myLStack->m_size = 0;
    //返回初始化栈
    return myLStack;
}

//入栈
void push_LinkStack(LinkStack stack, void *data) {

    //入栈的本质为链表的头插
    //判断有效性
    if (stack == NULL && data == NULL) {
        return;
    }
    //还原栈结构
    LStack *myStack = stack;
    //取出用户给的前四个指针
    StackNode *myNode = data;
    //更新节点信息
    //插入
    //更新节点信息
    myNode->next = myStack->pHeader.next;
    myStack->pHeader.next = myNode;
    //更新链表长度
    myStack->m_size++;
}

//出栈
void *pop_LinkStack(LinkStack Stack) {
    //出栈的本质为链表的头删
    if (Stack == NULL) {
        return NULL;
    }
    //还原链表栈
    LStack *myStack = Stack;
    //判断是否为空栈
    if (myStack->m_size == 0) {
        return NULL;
    }
    //定义出栈元素的节点
    StackNode *delNode = myStack->pHeader.next;
    //更新节点关系
    myStack->pHeader.next = delNode->next;
    //设置值存贮删除节点
    void *tmp_data = delNode;
    //更新栈大小
    myStack->m_size--;
    //返回出栈元素
    return tmp_data;
}

//返回栈顶
void *top_LinkStack(LinkStack Stack) {
    if(Stack == NULL)
    {
        return NULL;
    }
    //还原栈结构
    LStack * myStack = Stack;
    //判断是否为空栈
    if(myStack->m_size == 0)
    {
        printf("empty stack!\n");
        return NULL;
    }
    //直接返回链表的第一个有数据的节点
    return myStack->pHeader.next;
    //注意用户使用的时候用户自己转成自己的数据
}

//返回栈元素的个数
int size_LinkStack(LinkStack Stack) {
    if(Stack == NULL)
    {
        return NULL;
    }
    //还原栈结构
    LStack * myStack = Stack;
    return myStack->m_size;
}

//判断栈是否为空
int isEmpty(LinkStack Stack) {
    if(Stack == NULL)
    {
        return -1;
    }
    LStack *myStack = Stack;
    if(myStack->m_size == 0)
    {
        return 1;
    }
    //其余情况不是空栈
    //返回为0
    return 0;
}

//销毁栈
void destroy_LinkStack(LinkStack * stack) {
    if(stack ==NULL)
    {
        return;
    }
    free(stack);
    stack == NULL;
}

//____________________________________________________________________________________
//测试
typedef struct Person{
    //预留出四个字节的指针
    //预留的目的是开发人员进行维护链表指针
    void *node;
    char name[64];
    int age;
}Person;

//测试接口
void test5(){
    LinkStack *myStack = init_LinkStack();
    Person P1 = {NULL,"tom1", 1};
    Person P2 = {NULL,"tom2", 2};
    Person P3 = {NULL,"tom3", 3};
    Person P4 = {NULL,"tom4", 4};
    Person P5 = {NULL,"tom5", 5};
    Person P6 = {NULL,"tom6", 6};
    Person P7 = {NULL,"tom7", 7};
    Person P8 = {NULL,"tom8", 8};
    Person P9 = {NULL,"tom9", 9};
    Person P10 = {NULL,"tom10", 10};
    Person a[10]={P1,P2,P3,P4,P5,P6,P7,P8,P9,P10};
    for (int i = 0; i < 10; ++i) {
        push_LinkStack(myStack,a+i);
    }

    printf("Stack Size:%d\n", size_LinkStack(myStack));
    //打印元素
    while (isEmpty(myStack)==0){
        Person * p = top_LinkStack(myStack);
        printf("name:%s,age:%d\n",p->name,p->age);
        //出栈
        pop_LinkStack(myStack);
    }
    //销毁元素
    destroy_LinkStack(myStack);
}


int main() {
    test5();
    return 0;
}

运行图例

数据结构——链式储存栈(由用户提供指针 )C语言描述_第2张图片

你可能感兴趣的:(数据结构,C语言学习,数据结构,链表,栈,算法,面向对象编程)