1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 typedef int ElemType; 6 #define OK 1 7 #define ERROR 0 8 typedef int Status; 9 #define MAXSIZE 100 10 11 typedef struct StackNode 12 { 13 ElemType data; 14 struct StackNode *next; 15 }StackNode, *LinkStackPtr; 16 typedef struct LinkStack 17 { 18 LinkStackPtr top; 19 int count; 20 }LinkStack; 21 22 Status InitStack(LinkStack *S) 23 { 24 S->top = NULL; 25 S->count = 0; 26 return OK; 27 } 28 Status DestroyStack(LinkStack *S) 29 { 30 LinkStackPtr p; 31 while (S->top) 32 { 33 p = S->top; 34 S->top = S->top->next; 35 free(p); 36 } 37 S->count = 0; 38 return OK; 39 } 40 Status StackEmpty(LinkStack S) 41 { 42 if (S.count==0) 43 return OK; 44 return ERROR; 45 } 46 Status GetTop(LinkStack S, ElemType *e) 47 { 48 if (S.top ==NULL) 49 return ERROR; 50 *e = S.top->data; 51 return OK; 52 } 53 Status Push(LinkStack *S, ElemType e) 54 { 55 LinkStackPtr p = (LinkStackPtr)malloc(sizeof(LinkStack)); 56 p->data = e; 57 p->next = S->top; 58 S->top = p; 59 S->count++; 60 return OK; 61 } 62 Status Pop(LinkStack *S, ElemType *e) 63 { 64 if (S->top==NULL) 65 return ERROR; 66 *e = S->top->data; 67 LinkStackPtr p; 68 p = S->top; 69 S->top = S->top->next; 70 free(p); 71 S->count--; 72 return OK; 73 } 74 int StackLength(LinkStack S) 75 { 76 return S.count; 77 } 78 void visit(ElemType n) 79 { 80 printf("%d ", n); 81 } 82 83 void ListTraverse(LinkStack S) 84 { 85 int i; 86 while(S.top) 87 { 88 visit(S.top->data); 89 S.top = S.top->next; 90 } 91 } 92 int main() 93 { 94 LinkStack L; 95 Status i, j; 96 char opp = '-1'; 97 ElemType e; 98 int pos = 1; 99 int k = 0; 100 101 i = InitStack(&L); 102 printf("栈L初始化完毕,StackLength(L)=%d\n\n", StackLength(L)); 103 104 printf("\n1.遍历操作 \n2.插入操作 \n3.删除操作 \n4.获取栈顶数据\n5.栈是否为空 \n6.销毁栈 \n0.退出 \n请选择你的操作:\n"); 105 106 while (opp != '0') { 107 scanf_s("%c", &opp); 108 switch (opp) { 109 case '1': 110 ListTraverse(L); 111 printf("\n"); 112 break; 113 114 case '2': 115 srand((unsigned)time(NULL)); 116 for (j = 1; j <= 10; j++) 117 { 118 i = Push(&L, rand() % 100); 119 } 120 printf("在栈中依次插入10个随机数后:"); 121 ListTraverse(L); 122 printf("\n"); 123 printf("创建完毕,StackLength(L)=%d\n\n", StackLength(L)); 124 break; 125 case '3': 126 e = -1; 127 Pop(&L, &e); 128 printf("弹出栈顶元素%d,现在链表为:\n", e); 129 ListTraverse(L); 130 printf("\n"); 131 break; 132 case '4': 133 GetTop(L, &e); 134 printf("栈顶元素的值为:%d\n", e); 135 printf("\n"); 136 break; 137 case '5': 138 i = StackEmpty(L); 139 printf("栈是否为空?:%d\n", i); 140 printf("\n"); 141 break; 142 143 case '6': 144 i = DestroyStack(&L); 145 printf("\n销毁栈:ListLength(L)=%d\n", StackLength(L)); 146 ListTraverse(L); 147 printf("\n"); 148 break; 149 150 case '0': 151 exit(0); 152 } 153 } 154 }