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

  1 //这是一个链式堆栈的判空、压栈、出栈、取栈顶等操作
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <malloc.h>
  5 
  6 
  7 #define MaxSize 100
  8 typedef int bool;
  9 #define T 1
 10 #define F 0
 11 
 12 typedef int DataType;
 13 typedef struct stack{
 14     DataType data;
 15     struct stack *next;
 16 }ListStack;
 17 
 18 //堆栈初始化
 19 
 20 void ListStackInit(ListStack **stack)  //输出型  2018年8月16日 14:35:35  更正
 21 {
 22     if (((*stack)=(ListStack*)malloc(sizeof(ListStack)))==NULL)
 23     {
 24         exit(1);
 25     }
 26     (*stack)->next = NULL;
 27 }
 28 
 29 //堆栈判断是否为空
 30 
 31 int ListStackEmpty(ListStack *stack)
 32 {
 33     if (stack->next == NULL)
 34     {
 35         return 0;
 36     }
 37     else
 38     {
 39         return 1;
 40     }
 41 }
 42 
 43 //堆栈进栈
 44 
 45 int ListStackPush(ListStack *stack, DataType x)
 46 {
 47     ListStack *pTemp;
 48     if ((pTemp = (ListStack*)malloc(sizeof(ListStack))) == NULL)
 49     {
 50         return 0;
 51     }
 52     pTemp->data = x;
 53     /*pTemp->next = NULL;*/
 54 
 55     pTemp->next = stack->next;
 56     stack->next = pTemp;
 57     return 1;
 58 }
 59 
 60 //堆栈出栈
 61 
 62 int ListStackPop(ListStack *stack, DataType *x)
 63 {
 64     ListStack *del=stack->next;//赋值
 65     if (del==NULL)
 66     {
 67         return 0;
 68     }
 69     
 70     stack->next = del->next;
 71     *x = del->data;
 72     free(del);
 73     return 1;
 74 }
 75 
 76 //堆栈取出栈顶
 77 
 78 int ListStackTopPop(ListStack *stack,DataType *n)
 79 {
 80     ListStack *temp=stack->next;
 81 
 82     if (temp==NULL)
 83     {
 84         return 0;
 85     }
 86     *n=temp->data;
 87     return 1;
 88 }
 89 
 90 //链表销毁
 91 
 92 void ListDestroy(ListStack *stack)
 93 {
 94     ListStack *pTemp, *del;
 95     //if ((del = (ListStack*)malloc(sizeof(ListStack))) == NULL)
 96     //{
 97     //    return 0;
 98     //}
 99     pTemp = stack;
100     //pTemp = pTemp->next;   //2018年8月16日 14:35:09   更正
101     while (pTemp!=NULL)
102     {
103         del = pTemp;
104         pTemp = pTemp->next;
105         free(del); //2018年8月16日 08:59:48  出现中断?
106         
107         del = NULL;           //2018年8月16日 14:34:56   更正
108     }
109     /*stack->next = NULL;*/
110 }
111 //主函数
112 
113 int main()
114 {
115     ListStack *head;
116     int i;
117     DataType m, x;
118 
119     ListStackInit(&head);
120     for ( i = 0; i < 10; i++)
121     {
122         if ((ListStackPush(head, i + 1)) == 0)
123         {
124             printf("插入错误\n");
125             getchar();
126             return ;
127         }
128     }
129     ListStackTopPop(head, &m);
130     printf("栈顶=%d\n",m );
131     //for ( i = 0; i < 10; i++)
132     while (ListStackEmpty(head)!=0/*head.next!=NULL*/)     //替换for循环在ListStackPop()中出现中断
133     {
134         if ((ListStackPop(head,&x)==0))
135         {
136             printf("取出错误\n");
137             getchar();
138             return;
139         }
140         else
141         {
142             printf("%d   ", x);
143         }
144     }
145     ListDestroy(head);
146     getchar();
147     return 0;
148 }

 

posted @ 2018-08-16 16:57  蓝莓派Alex  阅读(420)  评论(0编辑  收藏  举报