20 链表栈 操作
#include <stdio.h> #include <malloc.h> #include <stdbool.h> #include <stdlib.h> typedef struct node //定义节点类型 { int data; struct node* pNext; }*PNODE, NODE; typedef struct stack //定义栈类型 { PNODE pTop; PNODE pBottom; }*PSTACK, STACK; //操作函数原型 bool init(PSTACK pStack); void push(PSTACK pStack, int val); bool pop(PSTACK pStack, int* val); void show(PSTACK pStack); bool is_empty(PSTACK pStack); //测试程序 main() { int val; STACK Stack; init(&Stack); push(&Stack, 1); push(&Stack, 2); push(&Stack, 3); push(&Stack, -11); show(&Stack); pop(&Stack, &val); printf("\npop %d ", val); pop(&Stack, &val); printf("\npop %d ", val); pop(&Stack, &val); printf("\npop %d ", val); printf("\n"); show(&Stack); printf("\n"); } //操作函数 bool init(PSTACK pStack) { bool is_init = true; pStack->pBottom = (PNODE)malloc(sizeof(NODE)); if (NULL == pStack->pTop) { is_init = false; //printf("Init stack error!!"); exit(-1); } else { pStack->pBottom->pNext = NULL; //这句必须在上面!! pStack->pTop = pStack->pBottom; } return is_init; } void push(PSTACK pStack, int val) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); pNew->data = val; pNew->pNext = pStack->pTop; pStack->pTop = pNew; } bool is_empty(PSTACK pStack) { if (pStack->pBottom == pStack->pTop) return true; else return false; } bool pop(PSTACK pStack, int* val) { bool is_pop = true; if (is_empty(pStack)) { is_pop = false; } else { PNODE q = pStack->pTop; //防止出现内存泄漏 *val = q->data; pStack->pTop = pStack->pTop->pNext; //栈顶下移 free(q); //回收q指向的内存,即pop的node q = NULL; //清空q指针 } return is_pop; } void show(PSTACK pStack) { int len = 0; PNODE p = pStack->pTop; printf("Stack : "); while (NULL != p->pNext) // while ( pStack->pBottom!= p ) { printf("%d ", p->data); p = p->pNext; len++; } printf(" \nStack Lenth = %d ", len); }