Cool_Breeze 发表于 2022-6-27 19:09

学习笔记 通过链表实现栈的功能

本帖最后由 Cool_Breeze 于 2022-6-28 13:51 编辑

代码:#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>


typedef struct stack {
       
        uint32_t count;        // 当前节点 从1开始
        stack *next; // 下一个节点
        void *data;// 数据
}stack, *stackp;

// 初始化 创建底层栈
stackp initStack(void *data){
       
        stackp p = NULL;
        p = (stackp)malloc(sizeof(stack));
        if (p == NULL) return p;
        p->count = 1;
        p->data = data;
        p->next = NULL;
        return p;       
}

// 打印一层栈信息
// 根据自己定义的数据类型重写该方法
void showFram(const stackp p){
       
        printf("count = %d\tdata = %s\t next = %p\r\n",
                p->count, (char*)p->data, p->next);
}

// 释放一层栈内存
void freeStack(stackp p){
       
        if (p == NULL) return;
        puts("释放内存空间");
        showFram(p);
        free(p);
}

// 显示栈上所有信息
void showAllFram(const stackp p){
       
        stackp pp = p;
        while(pp->next != NULL){
                showFram(pp);
                pp = pp->next;
        }
        showFram(pp);
}

// 释放栈上所有内存
// 为了省事使用了递归 (会限制栈的最大层数)
void destroyStack(stackp p){
       
//        if (p == NULL) return;
//        if (p->next == NULL) freeStack(p);
//        else
//                destroyStack(p->next);

// 非递归
        stackp tmp = NULL;
        if (p == NULL) return;
        while (1){
                tmp = p->next;
                freeStack(p);
                if (tmp == NULL) break;
                p = tmp;
        }
}

// 入栈
stackp stackPush(const stackp p, void *data){
       
        stackp newp = NULL;
        newp = (stackp)malloc(sizeof(stack)); // 创建一层栈
        if (newp == NULL) return newp; // 申请空间失败 返回 NULL
        newp->count = p->count + 1; //计数加1
        newp->data = data; // 绑定数据
        newp->next = p; // 使用新栈用做头节点
        return newp; // 返回新栈
}

// 出栈
stackp stackPop(stackp *p){
       
        stackp cur = *p;
        if (cur == NULL) return NULL;
        if (cur->next == NULL){ // 到达最底层栈
       
                *p = NULL; // 指向空
        }
        *p = cur->next; // 改变当前栈节点
        return cur; // 返回被弹出的栈
}


int main(int argv, char *args[]){
       
        int n = 0;
        const char *test[] = {
                "第1层",
                "第2层",
                "第3层",
                "第4层",
                "第5层",
                "第6层",
                (char*)NULL,
        };
        stackp ptmp = NULL;
        stackp p = initStack((void*)*test); // 返回栈头部
        if (p == NULL){
                printf("error");
                exit(1);
        }
        for (n=1; *(test+n) != NULL; n++){
                ptmp = stackPush(p, (void*)*(test+n));
                if (ptmp == NULL){
                        puts("内存申请失败");
                        destroyStack(p); // 出错 释放内存空间
                }
                p = ptmp; // 无错误,指向头节点
        }
               
        showAllFram(p);
        while (1){
                ptmp = stackPop(&p); // 弹出一层栈
                if (ptmp == NULL) break; // 到达栈底
                freeStack(ptmp); // 释放内存
        }
       
        exit(0);
}
执行结果:count = 6       data = 第6层   next = 0000000000467480
count = 5       data = 第5层   next = 0000000000467460
count = 4       data = 第4层   next = 0000000000467440
count = 3       data = 第3层   next = 0000000000467420
count = 2       data = 第2层   next = 0000000000467400
count = 1       data = 第1层   next = 0000000000000000
释放内存空间
count = 6       data = 第6层   next = 0000000000467480
释放内存空间
count = 5       data = 第5层   next = 0000000000467460
释放内存空间
count = 4       data = 第4层   next = 0000000000467440
释放内存空间
count = 3       data = 第3层   next = 0000000000467420
释放内存空间
count = 2       data = 第2层   next = 0000000000467400
释放内存空间
count = 1       data = 第1层   next = 0000000000000000

--------------------------------
Process exited after 0.01617 seconds with return value 0

wycdd 发表于 2022-6-27 21:14

代码不错

Pipi2018 发表于 2022-6-27 21:41

学习 ✍️

wqsk001 发表于 2022-6-28 12:05

代码不错
页: [1]
查看完整版本: 学习笔记 通过链表实现栈的功能