数据结构 线性链表栈

#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");
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/5697502.html