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

链栈:

链栈的结构与链表相似

插入与删除等操作都是在链表的头部

所以:链栈是一个以top为头结点,从栈顶指向栈底的单链表

typedef struct node
{
    Element element;       //数据域
    struct node* next;     //指向下一个结点
}Stacknode;



typedef struct
{
    Stacknode* top;        //栈顶指针
    int length;            //节点个数
}Linkstack;

接下来是代码实现:

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

typedef struct Element
{
	int id;
	char name[50];
}Element;


typedef struct node
{
    Element element;       //数据域
    struct node* next;     //指向下一个结点
}Stacknode;


typedef struct Linkstack
{
    Stacknode* top;        //栈顶指针
    int length;            //节点个数
}Linkstack;

Element elements[]={
	{1,"大帅比1"},
	{2,"大帅比2"},
	{3,"大帅比3"},
	{4,"大帅比4"}
};




//初始化栈 
void Initlinkstack(Linkstack* linkstack);

//入栈 
void Pushlinkstack(Linkstack* linkstack,Element element);

//出栈 
void Poplinkstack(Linkstack* linkstack);

//输出 
void Printlinkstack(Linkstack* linkstack);

//清空栈 
void Clearlinkstack(Linkstack* linkstack);

int main(void) 
{
	Linkstack linkstack;
	Initlinkstack(&linkstack);
	int i;
	for(i=0;i<4;i++)
	{
		Pushlinkstack(&linkstack,elements[i]);
	}
	Printlinkstack(&linkstack);
	//出栈 
	Poplinkstack(&linkstack);
	Printlinkstack(&linkstack);
	//清空栈 
	Clearlinkstack(&linkstack);
	Printlinkstack(&linkstack);
	return 0;
}

//初始化栈 
void Initlinkstack(Linkstack* linkstack)
{
	linkstack->top = NULL;
	linkstack->length = 0;
}

//初始化栈 
void Pushlinkstack(Linkstack* linkstack,Element element)
{
	//创建一个新节点
	Stacknode* newnode = (Stacknode*)malloc(sizeof(Stacknode));
	//元素赋值 
	newnode->element = element;
	//新结点的next指向当前栈顶
	newnode->next = linkstack->top;
	linkstack->top = newnode; 
	linkstack->length++;
}

//出栈 
void Poplinkstack(Linkstack* linkstack)
{
	//判断栈是否为空
	if(linkstack->length == 0)
	{
		printf("栈为空\n");
		return;
	} 
	//记录出栈前的指针 
	Stacknode* tempnode = linkstack->top;
	//栈顶指针下移一位 
	linkstack->top = linkstack->top->next;
	//释放原来的空间
	free(tempnode);
	linkstack->length--; 
}

//清空栈 
void Clearlinkstack(Linkstack* linkstack)
{
	while(linkstack->length != 0)
	{	
		if(linkstack->length == 0)//判断栈是否为空
		{
			printf("栈为空\n");
			return;
		} 
		//记录出栈前的指针 
		Stacknode* tempnode = linkstack->top;
		//栈顶指针下移一位 
		linkstack->top = linkstack->top->next;
		//释放原来的空间
		free(tempnode);
		linkstack->length--; 
	}
}

//输出 
void Printlinkstack(Linkstack* linkstack)
{
	Stacknode* temp = linkstack->top;
	while(temp)
	{
		printf("%d %s\n",temp->element.id,temp->element.name);
		temp = temp->next;
	}
	
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值