栈-链表的实现

3 篇文章 0 订阅
1 篇文章 0 订阅
</pre><pre name="code" class="cpp"><pre name="code" class="cpp"># include <stdio.h>
# include <malloc.h>
# include <stdlib.h>


typedef struct NODE                   // 创建结点的结构体 
{
	int data;
	struct NODE *next;
}node,*pnode;


typedef struct STRACK					//创建头指针和尾指针的结构体 
{
	pnode ptop;
	pnode pbottom;
}stack,*pstack;


void traverse(pstack ps);				//遍历栈输出 
void init(pstack ps);					// 建立头指针和尾指针 
void push(pstack ps,int val);			//压栈 
void clear(pstack ps);					//释放栈 
void pop(pstack ps,int * val);			//栈顶元素出栈   (出栈) 




int main (void)
{
	int val;
	pstack ps;
	ps = (pstack)malloc(sizeof(stack));			//为头指针和尾指针分配空间 


	init(ps);
	push(ps,1);
	push(ps,2);
	push(ps,3);
	traverse(ps);
	pop(ps,&val);
	traverse(ps);
	pop(ps,&val);
	traverse(ps);
	clear(ps);
	traverse(ps);


	
	return 0;
}


void init(pstack ps)
{
	pnode ptr;
	ptr = (pnode)malloc(sizeof(node));		
	ptr = ps->ptop;


	ps->pbottom = ps->ptop;						//将头指针和尾指针初始化
	ps->ptop->next = NULL;						 
	
}


void push(pstack ps,int val)
{
	pnode ptr;
	ptr = (pnode)malloc(sizeof(node));		//为结点分配空间 
	ptr->data = val;						//将目标元素存入结点 
	ptr->next = ps->ptop;					//指向上一节点 
	ps->ptop = ptr;							//将头指针上移 


}


void clear(pstack ps)
{
	pnode p,q;
	p = ps->ptop;							//将p指向头结点 
	q = NULL;
	while(p != ps->pbottom)   				//遍历栈 
	{
		q = p->next;						//将q指向上一节点 
		free(p);							//释放p 
		p = q;
	}
	ps->ptop = ps->pbottom;					//将头指针初始化 
}


void pop(pstack ps,int * val)
{
	pnode ptr;


	ptr = ps->ptop;							//将ptr指向头指针 
	*val = ptr->data;						//指针*val指向ptr中的元素 
	ps->ptop = ptr->next;					//将头指针下移 
	free(ptr);								//释放ptr结点 
	ptr=NULL;


}


void traverse(pstack ps)
{
	pnode ptr;
	ptr = ps->ptop;						//将ptr指向头指针 
	while(ptr != ps->pbottom)			//遍历栈 
	{
		printf ("%d ",ptr->data);		//输出栈中元素 
		ptr = ptr->next;				//指向上一结点 
	}
	printf ("\n");


}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值