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 }