栈的链式存储结构(企业级链表)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct StackNode{
	struct StackNode * next;//只维护指针域
};
//栈的链式结构体
struct Lstack{
	struct StackNode  header;//头结点
	int m_size;//栈的大小
};
typedef void* LinkStack;
//初始化栈
LinkStack Init_stack()
{
	struct Lstack * stack = (struct Lstack *)malloc(sizeof(struct Lstack));
	if (stack == NULL)
	{
		return NULL;
	}
	stack->header.next = NULL;
	stack->m_size = 0;
	return stack;
}
//入栈
void Push_stack(LinkStack stack, void * data)
{
	if (stack == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	//入栈就是头插法
	struct Lstack * mystack = (struct Lstack *)stack;
	//把用户数据转换成“挂钩”,就是连接用的指针
	struct StackNode * mynode = (struct StackNode *)data;
	//插入节点
	mynode->next = mystack->header.next;
	mystack->header.next = mynode;
	mystack->m_size++;

}
//出栈
void Pop_stack(LinkStack stack)
{
	if (stack == NULL)
	{
		return;
	}
	struct Lstack * mystack = (struct Lstack *)stack;
	if (mystack->m_size == 0)
	{
		return ;
	}
	//保存第一个有数据的节点——栈顶元素
	struct StackNode * pFirst = mystack->header.next;
	mystack->header.next = pFirst->next;

	mystack->m_size--;
}
//返回栈顶元素
LinkStack Top_stack(LinkStack stack)
{
	if (stack == NULL)
	{
		return NULL;
	}
	struct Lstack * mystack = (struct Lstack *)stack;
	if (mystack->m_size == 0)
	{
		return NULL;
	}
	return mystack->header.next;//将第一个有数据的节点返回
}
//返回栈大小
int Size_stack(LinkStack stack)
{
	if (stack == NULL)
	{
		return -1;
	}
	struct Lstack * mystack = (struct Lstack *)stack;
	return mystack->m_size;
}
//判断是否为空
int Isempty_stack(LinkStack stack)
{
	if (stack == NULL)
	{
		return -1;
	}
	struct Lstack * mystack = (struct Lstack *)stack;
	if (mystack->m_size == 0)
	{
		return 1;
	}
	return 0;
}
//销毁栈
void Destroy_stack(LinkStack stack)
{
	if (stack == NULL)
	{
		return;
	}
	free(stack);
	stack = NULL;
}
typedef struct person{
	struct StackNode node;
	char name[40];
	int age;
}person;
void test()
{
	//prepare datas
	person p1 = { NULL, "aaa", 12 };
	person p2 = { NULL, "bbb", 13 };
	person p3 = { NULL, "ccc", 14 };
	person p4 = { NULL, "ddd", 15 };
	person p5 = { NULL, "eee", 16 };

	//初始化栈
	LinkStack stack = Init_stack();
	//入栈
	Push_stack(stack, &p1);
	Push_stack(stack, &p2);
	Push_stack(stack, &p3);
	Push_stack(stack, &p4);
	Push_stack(stack, &p5);

	int size = Size_stack(stack);
	printf("栈的大小为:%d\n", size);
	while (Isempty_stack(stack) == 0)
	{
		person * pTop = (person *)Top_stack(stack);
		printf("姓名是:%s,年龄是:%d\n", pTop->name, pTop->age);
		Pop_stack(stack);
	}
	int size_t = Size_stack(stack);
	printf("栈的大小为:%d\n", size_t);

	Destroy_stack(stack);

}
int main()
{
	test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值