【2023王道数据结构】链栈-不带头结点

思路:s指向第一个进栈的元素,其余的按头插法插入
另一个刚刚想到 假设栈顶指针为top 初始化为null 插入节点x的操作应该是
x-next=top
top =x

#include <iostream>
#include <stdlib.h>

using namespace std;

typedef struct LinkNode {
	int data;
	struct LinkNode *next;
}*LinkStack;

void init(LinkStack &s);
void push(LinkStack &s, int x);
void pop(LinkStack &s, int &e);
int getTop(LinkStack s);
void Destory(LinkStack &s);

int main(void) {
	LinkStack s;
	init(s);
	
	push(s,1);
	push(s,2);
	push(s,3);
	
	//int e;
	//pop(s,e);
	//cout << "main:" << e << endl;
	//pop(s,e);
	//cout << "main:" << e << endl;
	//pop(s,e);
	//cout << "main:" << e << endl;
	cout << "main:" << getTop(s) << endl; 
	
	Destory(s);
	getTop(s);
}

void init(LinkStack &s) {
	s = NULL; //不带头结点 
}
//s指向最先进来的元素 
void push(LinkStack &s, int x) {
	LinkNode *t = (LinkNode*)malloc(sizeof(LinkNode));
	t->data = x;
	//如果此时栈是空栈,令s指向t 
	if (s == NULL) {
		t->next = NULL;
		s = t; 
	} 
	else {
	 	t->next = s->next;
		s->next = t; 
	}
} 
void pop(LinkStack &s, int &e) {
	if (s == NULL) {
		printf("栈空\n");
		return;
	}
	//如果此时表中只剩s,输出s 
	if (s->next == NULL) {
		e = s->data;
		s = NULL; //空栈 
		return;
	}
	
	LinkNode *t = s->next;
	e = t->data;
	
	s->next = t->next;
	free(t);
} 

int getTop(LinkStack s) {
	if (s == NULL) {
		printf("栈空!\n");
		exit(0);
	}
	if (s->next == NULL) return s->data;
	return s->next->data;
}
void Destory(LinkStack &s) {
	if (s == NULL) {
		printf("栈已经空了!\n");
		exit(0);
	}
	LinkNode *t;
	while(s->next != NULL) {
		t = s->next;
		
		s->next = t->next;
		free(t);
	}
	t = s;
	free(t);
	s = NULL;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值