C语言 数据结构 栈(用链表实现)

疑惑

为什么栈要分两个结构体来创建,而链表只需要一个?
能不能只用一个结构体创建一个栈?

代码

用函数实现了压栈弹栈打印栈的操作

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct tag//定义一个节点
{
	int val;//这个节点的value
	struct tag *pnext;//指向下一个节点的指针
}node, *pnode;

typedef struct//定义一整个栈
{
	pnode phead;//这个栈的栈顶指针,指向一个节点(这个栈顶指针也可以在main函数里用*pnode phead定义,用&phead传参吧?)
	int size;//这个栈的大小
}stack, *pstack;

void push_stack(pstack p, int val)//p是一个栈
{
	pnode pnew = (pnode)calloc(1, sizeof(node));//pnew是新节点
	pnew->val = val;//把想要入栈的值放进新节点pnew的val成员
	if (NULL == p->phead)//如果链表为空(头插法)
	{
		p->phead = pnew;//让p栈的栈顶指针指向pnew节点,也就是把新节点pnew放进p栈
		p->size++;
	}
	else//如果链表非空
	{
		pnew->pnext = p->phead;//让pnew节点的pnext指针指向原来的栈顶节点
		p->phead = pnew;//让p栈的栈顶指针指向pnew节点
		p->size++;
	}
	printf("入栈成功\n");
}
//打印
void print_stack(pstack p)
{
	pnode pcur;
	pcur = p->phead;
	printf("输出:\n");
	while (pcur != NULL)
	{
		printf("%d ", pcur->val);
		pcur = pcur->pnext;//pcur指向下一个节点
	}
	printf("\n\n");
}
//弹栈
int pop_stack(pstack p)//p栈
{
	int val;
	pnode pcur;//pcur指向一个节点,暂存phead,用来free
	if (NULL == p->phead)//如果栈为空
	{
		printf("弹栈失败,因为栈为空...\n");
		return 0;
	}
	else//如果栈非空
	{
		pcur = p->phead;
		val = pcur->val;
		p->phead = pcur->pnext;//头指针指向下一个节点
		free(pcur);
		printf("弹栈成功\n"); if (NULL == p->phead)printf("栈空了...\n");
		return val;
	}
	return 0;
}
int main()
{
	stack s;
	int val;
	memset(&s, 0, sizeof(s));
	push_stack(&s, 5);
	push_stack(&s, 6);
	push_stack(&s, 7);
	push_stack(&s, 8);
	push_stack(&s, 9);
	print_stack(&s);

	val = pop_stack(&s);//1
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	val = pop_stack(&s);//2
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	val = pop_stack(&s);//3
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	val = pop_stack(&s);//4
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	val = pop_stack(&s);//5
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	val = pop_stack(&s);//6
	printf("弹出的数为:%d\n", val);
	print_stack(&s);

	system("pause");
}

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/86560843