学习笔记 通过链表实现栈的功能
本帖最后由 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 代码不错 学习 ✍️ 代码不错
页:
[1]