链式堆栈【数据结构-朱战立】
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 }