zoukankan      html  css  js  c++  java
  • 数据结构 线性链表栈

    #ifndef _MY_LINKSTACK_H_
    #define _MY_LINKSTACK_H_
    
    typedef void LinkStack;
    
    //创建链表栈
    LinkStack* LinkStack_Create();
    
    //销毁链表栈
    int LinkStack_Destroy(LinkStack** stack);
    
    //清空链表栈
    int LinkStack_Clear(LinkStack* stack);
    
    //压栈
    int LinkStack_Push(LinkStack* stack, void* item);
    
    //出栈
    void* LinkStack_Pop(LinkStack* stack);
    
    //获取栈顶元素
    void* LinkStack_Top(LinkStack* stack);
    
    //获取栈的大小
    int LinkStack_Size(LinkStack* stack);
    
    #endif //_MY_LINKSTACK_H_
    //链式栈代码实现
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"LinkList.h"//调用链表动态库
    #include"linkstack.h"
    
    /*
    自己构造结构体的必要性
    链表栈是调用线性链表动态库实现的  线性链表必须要求结构体中有LinkNode类型的属性
    但是用户未必会让自己的结构体带这个属性,必须由栈实现方法里带上
    */
    typedef struct _TLinkStack{
        LinkNode node;
        void * item;
    }TLinkStack;
    
    //创建链表栈
    LinkStack* LinkStack_Create(){
        return (LinkStack*)LinkList_Create();
    }
    
    //销毁链表栈
    int LinkStack_Destroy(LinkStack** stack){
        int ERRO_MSG = 0;
        /*
        删除的时候,先清空链表,然后再删除
        */
        ERRO_MSG=LinkStack_Clear(*stack);
        //销毁链表
        ERRO_MSG = LinkList_Destroy(stack);
        return ERRO_MSG;
    }
    
    //清空链表栈
    /*
    因为TLinkStack是我们帮用户创建的,不是用户自己的结构体,所以用户不可能会释放,只能由我们来实现
    
    必须循环遍历  一个个的删除
    */
    int LinkStack_Clear(LinkStack* stack){
        int ERRO_MSG = 0;
        while (LinkList_Length(stack)){
            //一个个删除元素  从第一个开始删除  减少遍历次数
            TLinkStack * temp = (TLinkStack *)LinkList_Delete(stack, 0);
            if (temp!=NULL)
            {
                free(temp);
                temp = NULL;
            }
        }
        //将元素个数置零
        ERRO_MSG = LinkList_Clear(stack);
        return ERRO_MSG;
    }
    
    //压栈
    /*
    对于链表而言,从尾部插入,需要遍历前面的所有节点,还是从头结点插入比较效率
    */
    int LinkStack_Push(LinkStack* stack, void* item){
        int ERRO_MSG = 0;
        //临时变量必须malloc
        TLinkStack * tstack = (TLinkStack *)malloc(sizeof(TLinkStack));
        if (tstack==NULL)
        {
            ERRO_MSG = -1;
            printf("分配内存失败!erro msg:%d 
    ", ERRO_MSG);
            return ERRO_MSG;
        }
        //初始化内存
        memset(tstack, 0, sizeof(TLinkStack));
        //将用户数据赋值到内存中
        tstack->item = item;
        //用头插法插入元素
        ERRO_MSG=LinkList_Insert(stack, (LinkNode *)tstack, 0);
        return ERRO_MSG;
    }
    
    //出栈
    void* LinkStack_Pop(LinkStack* stack){
        //删除栈顶元素
        TLinkStack *tstack = (TLinkStack *)LinkList_Delete(stack, 0);
        //定义返回变量
        void * ret = NULL;
        if (tstack!=NULL)
        {
            ret = tstack->item;
            free(tstack);
            tstack = NULL;
        }
        return ret;
    }
    
    //获取栈顶元素
    void* LinkStack_Top(LinkStack* stack){
        //定义返回变量
        void * ret = NULL;
        //获取第0个节点元素
        TLinkStack *tstack = (TLinkStack *)LinkList_Get(stack, 0);
        if (tstack!=NULL)
        {
            ret = tstack->item;
        }
        return ret;
    }
    
    //获取栈的大小
    int LinkStack_Size(LinkStack* stack){
        return LinkList_Length(stack);
    }
    //链表栈的测试代码
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include"linkstack.h"
    
    typedef struct _Student{
        char name[30];
        int age;
    }Student;
    
    void Test(){
        Student s1, s2, s3, s4, s5;
        int numx = 0, i = 0, ret = 0;
        strcpy(s1.name, "小米");
        s1.age = 11;
        strcpy(s2.name, "小刚");
        s2.age = 12;
        strcpy(s3.name, "小红");
        s3.age = 10;
        strcpy(s4.name, "啸天");
        s4.age = 13;
        strcpy(s5.name, "莲华");
        s5.age = 12;
        LinkStack *stack = NULL;
        //创建栈
        stack = LinkStack_Create();
        //压栈
        ret = LinkStack_Push(stack, &s1);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = LinkStack_Push(stack, &s2);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = LinkStack_Push(stack, &s3);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = LinkStack_Push(stack, &s4);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        ret = LinkStack_Push(stack, &s5);
        if (ret != 0)
        {
            printf("入栈失败!
    ");
            return;
        }
        numx = LinkStack_Size(stack);
        //出栈
        for (i = 0; i < numx; i++)
        {
            Student *temp = (Student *)LinkStack_Pop(stack);
            printf("我的名字是%s;我的年龄是%d
    ", temp->name, temp->age);
        }
        //清空栈
        ret = LinkStack_Clear(stack);
        if (ret != 0)
        {
            printf("销毁链表失败!
    ");
            return;
        }
        //销毁栈
        LinkStack_Destroy(&stack);
    }
    
    
    
    void main(){
        Test();
        system("pause");
    }
  • 相关阅读:
    超级管理员登录后如果连续XX分钟没有操作再次操作需要重新登录
    linux下连接本地的navicate
    linux 日常中会用到的命令(持续更新)
    关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案
    VMware Workstation 14 激活码
    破解phpstorm
    redis五种数据类型的使用场景
    关于Nginx负载均衡的6种策略
    PHP和PHP-FPM 配置文件优化
    redis配置文件详解
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5697502.html
Copyright © 2011-2022 走看看