吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 925|回复: 3
收起左侧

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

[复制链接]
Cool_Breeze 发表于 2022-6-27 19:09
本帖最后由 Cool_Breeze 于 2022-6-28 13:51 编辑

代码:
[C] 纯文本查看 复制代码
#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);
}

执行结果:
[C] 纯文本查看 复制代码
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
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 09:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表