数据结构之链栈(C语言版)

链栈--单链表实现栈

链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出

直接在链表表头进行操作,链表表头相当于栈顶

入栈:头插。 出栈:删除首元结点 

定义链栈:.

以定义单链表的方式来定义链栈

即一个数据域

一个指针域

其中listack==sstack *

使用 listack 声明链栈中的结点指针,意在强调操作对象是栈;

使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点 

typedef struct listackNode{//链栈结点 
	int date;//链栈结点中元素 
	struct listackNode* next;//指针 	
}sstack,*listack;

初始化栈:

先创建一个栈s并且动态内存分配一块空间

再让头结点指向NULL

再返回s的地址

listack initstack()
{
	listack s=(listack)malloc(sizeof(sstack));
	s->next=NULL;
	return s;
 } 

入栈函数:

链表结点个数可以动态调节,无需判满

先创建一个p结点

再将数据写入结点

之后再以单链表的形式进行头插

void Pushh(listack s,int k)
{
	//链表结点个数可以动态调整,无需判满
	//头插法插入结点,实现入栈 
	sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点 
	p->date =k;
	//头插法 插入p 
	p->next =s->next;
	s->next =p;  

出栈函数:

先判空

如果不为空则让p结点指向待删的首元结点

再让头结点指向p结点的下一个结点

p指向NULL

再free掉p结点

void Popp(listack s)
{
	//删除之前判空,还有没有的删
	if(s->next==NULL)
	{
		printf("栈空\n");//栈空报错,不能删除 
	 } 
	 else
	 {
	 sstack *p=s->next ;//让p指向待删除的首元结点
	 
	 s->next =p->next ;
        
     p->NULL;

	 free(p); 
	 } 
} 

读取栈顶元素:

先判定是否为栈空

如果不为空则

将首元结点的数据赋值给x

再打印出x

//读取栈顶元素
void gettop(listack s)
{
	int x;
	//判空,还有没有的读取 
	if(s->next==NULL)
	{
		printf("栈空\n");//栈空报错,不能删除	 
	 } 
	 else
	 {
	 	x=s->next->date;
		printf("%d\n",x); 
	 } 
	 
 } 
in

总代码:

#include<stdio.h>
#include<stdlib.h>
///链栈--单链表实现栈///
typedef struct listackNode{//链栈结点 
	int date;//链栈结点中元素 
	struct listackNode* next;//指针 	
}sstack,*listack;
//此处的listack与链表代码中的 linklist类似
//listack==sstack *;
//使用 listack 声明链栈中的结点指针,意在强调操作对象是栈; 
//使用 sstack* 声明链栈中的结点指针,意在强调操作对象是栈中的某个结点 

 
//链栈中无栈顶指针,如何实现在栈顶操作,实现先进后出
//直接在链表表头进行操作,链表表头相当于栈顶
//入栈:头插。 出栈:删除首元结点 

//--------------------------------------------------------------------- 
//栈操作:初始化,判空,入栈(push),出栈(pop),读取栈顶元素(top)
//以顺序栈为例子 
//初始化 
listack initstack()
{
	listack s=(listack)malloc(sizeof(sstack));
	s->next=NULL;
	return s;
 } 
 
//入栈--对栈进行了修改,指针传递 
void Pushh(listack s,int k)
{
	//链表结点个数可以动态调整,无需判满
	//头插法插入结点,实现入栈 
	sstack *p=(sstack*)malloc(sizeof(sstack));//p是待插入的新结点 
	p->date =k;
	//头插法 插入p 
	p->next =s->next;
	s->next =p;  
	
 } 
//出栈
void Popp(listack s)
{
	//删除之前判空,还有没有的删
	if(s->next==NULL)
	{
		printf("栈空\n");//栈空报错,不能删除 
	 } 
	 else
	 {
	 sstack *p=s->next ;//让p指向待删除的首元结点
	 
	 s->next =p->next ;
	 free(p); 
	 } 
} 
//读取栈顶元素
void gettop(listack s)
{
	int x;
	//判空,还有没有的读取 
	if(s->next==NULL)
	{
		printf("栈空\n");//栈空报错,不能删除	 
	 } 
	 else
	 {
	 	x=s->next->date;
		printf("%d\n",x); 
	 } 
	 
 } 
int main()
{
	int x;
	listack s=initstack();
	Pushh(s,1);
	Pushh(s,2);
	Pushh(s,3);
	gettop(s);
	
	Popp(s);
	gettop(s);
	return 0; 
 } 
  
  
  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值