用链表摸拟栈

链式栈,用链表摸拟栈。

stack.h

#include<stdio.h>
#include<stdlib.h>

struct LinkStack
{
	int id;		//编号
	int data;	//数值
	struct LinkStack *pNext;
};

struct LinkStack *phead;	//全局变量
typedef struct LinkStack node, *PNODE;

PNODE push(PNODE phead, int id, int data);	//进栈
PNODE pup(PNODE phead);		//出栈
void showAll(PNODE phead);	//显示所有栈的信息
PNODE clearStack(PNODE phead);	//清空栈信息

stack.c

#include"stack.h"


PNODE push(PNODE phead, int id, int data)	//进栈
{
	PNODE pnew = malloc(sizeof(node));
	pnew->data = data;
	pnew->id = id;
	pnew->pNext = NULL;

	if (phead == NULL)
	{
		phead = pnew;		
	}
	else
	{
		PNODE ptemp = phead;
		while (ptemp->pNext != NULL)
		{
			ptemp = ptemp->pNext;
		}
		ptemp->pNext = pnew;
	}
	return phead;
}

PNODE pup(PNODE phead)		//出栈
{
	//出栈是从尾部出栈
	if (phead == NULL)
	{
		return phead;
	}
	else if (phead->pNext == NULL)	//只有一个节点时出栈
	{
		printf("%d %d\n", phead->id, phead->data);
		phead = NULL;  
	}
	else
	{
		PNODE p1 = phead;
		while (p1->pNext->pNext != NULL)
		{
			p1 = p1->pNext;	//循环到倒数第二个,这时 p1->pNext->pNext就指向最后一个
		}
		printf("%d %d\n", p1->pNext->id, p1->pNext->data);
		//这时可以删除最后一个 即:p1->pNext->pNext
		free(p1->pNext->pNext);
		p1->pNext = NULL;

	}
	return phead;
}

void showAll(PNODE phead)	//显示所进栈顺序
{
	if (phead == NULL)
	{
		return;
	}
	else
	{
		while (phead != NULL)
		{
			printf("%d %d\n", phead->id, phead->data);
			phead = phead->pNext;
		}
	}
}

PNODE clearStack(PNODE phead)	//清空栈信息
{
	PNODE p1 = NULL;
	PNODE p2 = NULL;
	p1 = phead;
	if (phead == NULL)
	{
		return phead;
	}
	else
	{
	
	while (p1->pNext != NULL)
	{
		p2 = p1->pNext;	//使用 p2 保存 p1 的值,这样就可以删除 p2
		p1->pNext = p2->pNext;	//让p1->pNext 指向 p2 的下个节点,这样可以把链表连起来
		free(p2);
	}
	//最后删除头节点
	free(phead);
	phead = NULL;
	return phead;
	}
}

main.c

#include"stack.h"

void to(int num)
{
	printf("num: %d\n ", num);
	if (num == 0 )
	{
		return;
	}
	else
	{// 1: num /2 与 num /= 2 有什么区别?
		//to(m /= 2);//这儿是把 m/=2 的值当做参数传递给形参,而且改变了m的值在程序中。
		to(num / 2); //这儿是把 m/2 的值当做参数传递给形参。
		//如果是先把印,后调用这两种写法都没问题,而如果是先调用,后打印这样打印中使用的 m 值就不同了 
		//一个是 m ,一个是 m = m/2 (m 除以 2 )后的值,所以先调用后打印有区别。
		printf("%3d", num % 2);	
		
	}
}

void main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		phead = push(phead, i, 100 + i);
	}

	showAll(phead);

	//printf("\n\n");
	//while (phead != NULL)
	//{
	//	phead = pup(phead);
	//}

	phead = clearStack(phead);

	printf("\n\n");
	while (phead != NULL)
	{
		phead = pup(phead);
	}


	system("pause");
}

void main1()
{
	to(10);

	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值