链式堆栈【数据结构-朱战立】

/*本程序是链式堆栈程序 数据结构-朱战立 第三版 第三章完整程序*/

/*环境 vs2013+win7*/

/*2018年8月17日 10:19:21*/

//这是一个链式堆栈的判空、压栈、出栈、取栈顶等操作
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


#define MaxSize 100
typedef int bool;
#define T 1
#define F 0

typedef int DataType;
typedef struct stack{
    DataType data;
    struct stack *next;
}ListStack;

//堆栈初始化

void ListStackInit(ListStack **stack)  //输出型  2018年8月16日 14:35:35  更正
{
    if (((*stack)=(ListStack*)malloc(sizeof(ListStack)))==NULL)
    {
        exit(1);
    }
    (*stack)->next = NULL;
}

//堆栈判断是否为空

int ListStackEmpty(ListStack *stack)
{
    if (stack->next == NULL)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

//堆栈进栈

int ListStackPush(ListStack *stack, DataType x)
{
    ListStack *pTemp;
    if ((pTemp = (ListStack*)malloc(sizeof(ListStack))) == NULL)
    {
        return 0;
    }
    pTemp->data = x;
    /*pTemp->next = NULL;*/

    pTemp->next = stack->next;
    stack->next = pTemp;
    return 1;
}

//堆栈出栈

int ListStackPop(ListStack *stack, DataType *x)
{
    ListStack *del=stack->next;//赋值
    if (del==NULL)
    {
        return 0;
    }
    
    stack->next = del->next;
    *x = del->data;
    free(del);
    return 1;
}

//堆栈取出栈顶

int ListStackTopPop(ListStack *stack,DataType *n)
{
    ListStack *temp=stack->next;

    if (temp==NULL)
    {
        return 0;
    }
    *n=temp->data;
    return 1;
}

//链表销毁

void ListDestroy(ListStack *stack)
{
    ListStack *pTemp, *del;
    //if ((del = (ListStack*)malloc(sizeof(ListStack))) == NULL)
    //{
    //    return 0;
    //}
    pTemp = stack;
    //pTemp = pTemp->next;   //2018年8月16日 14:35:09   更正
    while (pTemp!=NULL)
    {
        del = pTemp;
        pTemp = pTemp->next;
        free(del); //2018年8月16日 08:59:48  出现中断?
        
        del = NULL;           //2018年8月16日 14:34:56   更正
    }
    /*stack->next = NULL;*/
}
//主函数

int main()
{
    ListStack *head;
    int i;
    DataType m, x;

    ListStackInit(&head);
    for ( i = 0; i < 10; i++)
    {
        if ((ListStackPush(head, i + 1)) == 0)
        {
            printf("插入错误\n");
            getchar();
            return ;
        }
    }
    ListStackTopPop(head, &m);
    printf("栈顶=%d\n",m );
    //for ( i = 0; i < 10; i++)
    while (ListStackEmpty(head)!=0/*head.next!=NULL*/)     //替换for循环在ListStackPop()中出现中断
    {
        if ((ListStackPop(head,&x)==0))
        {
            printf("取出错误\n");
            getchar();
            return;
        }
        else
        {
            printf("%d   ", x);
        }
    }
    ListDestroy(head);
    getchar();
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值