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);
}

 

posted @ 2020-06-03 03:35  abel2020  阅读(92)  评论(0编辑  收藏  举报