【链式栈】链式栈的封装<源代码>

本文详细介绍了如何使用C语言实现链式栈的基本操作,包括初始化、压栈、出栈和释放所有节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//编译环境 VS3013
/
//头文件 stacklinknode.h
#include<stdio.h>
#include<stdlib.h>

#define  datatype int

struct STACKNODE
{
	int num;//编号
	datatype data;//数据
	struct STACKNODE *pNext;
};
typedef struct STACKNODE stackNode;

stackNode * initStack(stackNode * pHead);
stackNode * push(stackNode * pHead, int num, datatype data);//压栈
stackNode * pop(stackNode * pHead, stackNode * pOutData);//出栈
stackNode * freeAll(stackNode * pHead);
void printfAllMember(stackNode *pHead);

//C文件   stacklinknode.c
//#include<stdio.h>
#include<stdlib.h>
#include "stacklinknode.h"


stackNode * initStack(stackNode * pHead) //初始化
{
	return NULL;
}
stackNode * push(stackNode * pHead, int num, datatype data)//压栈
{
	stackNode *pNewNode = (stackNode *)malloc(sizeof(stackNode));
	pNewNode->num = num;
	pNewNode->data = data;
	pNewNode->pNext = NULL; //开辟节点并赋值
	
	if (pHead == NULL)
	{
		pHead = pNewNode; 
		//本来没有节点,在头部插入一个节点之后,让pHead指着
	}
	else //已经存在节点
	{
		stackNode *p = pHead;
		while (p->pNext != NULL)
		{
			p = p->pNext;//一直向前
		}
		p->pNext = pNewNode; //插入新节点
	}
	return pHead;
}

stackNode * pop(stackNode * pHead, stackNode * pOutData)//出栈
{
	if (pHead == NULL)
	{
		return NULL;
	}
	else if (pHead->pNext == NULL)//只有一个节点
	{
		pOutData->num = pHead->num;
		pOutData->data = pHead->data;
		free(pHead);
		pHead = NULL;
		return pHead;
	}
	else
	{
		stackNode *p = pHead;
		while (p->pNext->pNext != NULL)
		{
			p = p->pNext;//循环到倒数第二个节点
		}
		pOutData->num = p->pNext->num;
		pOutData->data = p->pNext->data;
		free(p->pNext);
		p->pNext = NULL;

		return pHead;
	}
}
stackNode * freeAll(stackNode * pHead)
{
	if (pHead == NULL)
	{
		return NULL;
	}
	else
	{
		stackNode *p1 = NULL, *p2 = NULL;
		p1 = pHead;
		while (p1->pNext != NULL)//有超过一个节点的情况
		{
			p2 = p1->pNext;
			p1->pNext = p2->pNext;
			free(p2);
		}
		free(pHead);  //释放头结点
		return NULL;


		//对于上边释放代码的改进,上述代码每一次删除第二个节点
		//改进之后每次直接删除第一个节点。
		/*stackNode * p1 = pHead;
		stackNode *p2 = NULL;
		if (p1->pNext == NULL)
		{
		free(pHead);
		return NULL;
		}
		else
		{
		while (p1->pNext != NULL)
		{
		p2 = p1;
		p1 = p2->pNext;
		free(p2);

		}
		return NULL;
		}*/
		
	}
}

//递归实现
void printfAllMember(stackNode *pHead)
{
	if (pHead == NULL)
	{
		return NULL;
	}
	else
	{
		printf("%d, %d\n", pHead->num, pHead->data);//打印数据
		//printf("%p, %p\n", pHead, pHead->pNext);  //打印地址
		printfAllMember(pHead->pNext);
	}
}


//测试文件 
#include<stdio.h>
#include<stdlib.h>
#include "stacklinknode.h"

void main()
{
	stackNode *pHead = NULL;//创建一个链式栈的头结点
	pHead = initStack(pHead);

	pHead = push(pHead, 1, 1);
	pHead = push(pHead, 2, 2);
	pHead = push(pHead, 3, 3);
	pHead = push(pHead, 4, 4);
	pHead = push(pHead, 5, 5);
	printf("压栈之后:\n");
	printfAllMember(pHead);

	pHead = freeAll(pHead);
	if (pHead == NULL)
	{
		printf("释放完成");

		printfAllMember(pHead);
	}

	printf("出栈:\n");
	while (NULL != pHead)
	{
		//保存出栈数据
		stackNode *pout = (stackNode *)malloc(sizeof(stackNode));
		pHead = pop(pHead, pout);
		//printfAllMember(pHead);
		printf("%d,%d\n", pout->num, pout->data);

	}
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值