数据结构之链栈基本操作(C语言)

数据结构 专栏收录该内容
6 篇文章 1 订阅

链栈

栈的链式储存结构称为链栈。链栈的节点类型与链式线性表的节点类型

定义相同,不同的是它是仅在表头进行操作的单链表。链栈通常用不带头节

点的单链表来实现,栈顶指针就是链表的头指针 ,如图所示:

在这里插入图片描述
程序源代码:

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;

typedef struct stack{
	ElemType data;
	struct stack *next;
}stack,*Linkstack;

/*Function:栈的初始化*/ 
Linkstack Initstack(Linkstack s){
	s=NULL;  //栈顶指向NULL 
	return s; 
} 
/*Function:压栈*/ 
Linkstack Push(Linkstack s,ElemType e){
	Linkstack p; //新结点 
	p=(Linkstack)malloc(sizeof(stack));
	p->data=e; //新结点赋值 
	p->next=s; 
	s=p;
	printf("%d入栈\n",s->data);
	return s;
}
/*Function:出栈 */ 
Linkstack Pop(Linkstack s)
{
	Linkstack p;
	if(s==NULL){
		return;
	}
	printf("%d出栈\n",s->data);
	p=s;s=s->next;free(p);
	return s;
}
/*Function:获取栈顶元素 */ 
ElemType getTop(Linkstack s){
	if(s!=NULL){
		return s->data;
	}
}
/*Function:输出栈中所有元素*/ 
void PrintAll(Linkstack s)
{
	if(s==NULL){
		printf("栈为空!\n");
		return;
	}else{
		printf("顶端[");
	while(s!=NULL){
		printf("%d-",s->data);
		s=s->next;
	   }
	   printf("]底端\n");
	}
}
/*主函数*/ 
void main(){
	Linkstack s;
	s=Initstack(s);
	s=Push(s,3);
	s=Push(s,4);
	s=Push(s,5);
	PrintAll(s);
	s=Pop(s);
	s=Pop(s);
	PrintAll(s);
}

执行结果:

在这里插入图片描述

但是有的同学不理解上面的程序中为什么Push函数和Pop函数中传入的是结构体的地址,为什么还要返回头指针地址值?
这是因为这里头指针的地址发生了改变,我们在回忆一下c语言做过的数值交换问题,我们必须操作这两个数的
地址才能实现正真的交换。这里同样,如果想要保存头指针的地址值,我们就要使用二维指针,这样函数运行
完后头指针的地址值才能保存。以下程序就是用的二维指针来实现头指针地址的保存。(上面的程序能保存头
指针地址是因为我们返回了头指针地址,c语言中可以对返回值保留一次,所以可以正确执行)
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;

typedef struct stack {
	ElemType data;
	struct stack* next;
}stack, * Linkstack;

///*Function:栈的初始化*/
//void Initstack(Linkstack * s) {
//	(*s) = NULL;  //栈顶指向NULL 
//}

/*Function:压栈*/
void Push(Linkstack * s, ElemType e) {
	Linkstack p = NULL; //新结点 
	p = (Linkstack)malloc(sizeof(stack));
	p->data = e; //新结点赋值 
	p->next = *s;
	(*s) = p;
	printf("%d出栈\n", (*s)->data);
}
/*Function:出栈 */
void Pop(Linkstack * s)
{
	Linkstack p;
	if ((*s)== NULL) {
		return;
	}
	printf("%d出栈\n", (*s)->data);
	p = *s; *s = (*s)->next; free(p);
}
/*Function:获取栈顶元素 */
ElemType getTop(Linkstack s) {
	if (s != NULL) {
		return s->data;
	}
}
/*Function:输出栈中所有元素*/
void PrintAll(Linkstack  s)
{
	if (s == NULL) {
		printf("栈为空!\n");
		return;
	}
	else {
		printf("顶端[");
		while (s != NULL) {
			printf("%d-", s->data);
			s = s->next;
		}
		printf("]底端\n");
	}
}
/*主函数*/
void main() {
	Linkstack * s=NULL;
	Push(&s, 3);
	Push(&s, 4);
	Push(&s, 5);
	PrintAll(s);
	Pop(&s);
	Pop(&s);
	PrintAll(s);
}

执行结果:
在这里插入图片描述

以上就是c语言链栈基本操作,如果觉得这篇文章不错的话那就点个赞吧!😀😀
  • 2
    点赞
  • 3
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论3
请先登录 后发表评论~
©️2021 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页

打赏作者

@cth123

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值