【数据结构】-链栈(带头结点)

本文介绍了链栈的基本操作,包括初始化、判空、入栈、出栈和读取栈顶元素。讨论了带头结点和不带头结点的链栈在实现和使用上的差异,通常链栈不带头结点,因为其只在头部进行插入和删除,而单链表通常需要头结点以简化首元素操作。

1.头文件及类型定义

#include<stdio.h>
#include<stdlib.h>
#define ElemType int			

2.链栈类型定义

typedef struct LinkStackNode {
   
   		//链栈类型定义
	ElemType data;					//数据域
	struct LinkStackNode* next;		//指针域
}SNode,*LiStack;

3.函数声明

/*函数声明*/
bool InitLinkStack(LiStack& S);			//1.初始化链栈
bool LiStackEmpty(LiStack S);			//2.判空
bool Push(LiStack& S, ElemType e);		//3.入栈
bool Pop(LiStack& S, ElemType& e);		//4.出栈
bool GetTop(LiStack S, ElemType& e);	//5.读取栈顶元素

4.基本操作

4.1 初始化链栈

//1.初始化栈(带头结点)
bool InitLinkStack(LiStack& S) {
   
   
	S = (SNode*)malloc(sizeof(SNode
### 带头结点 Push 操作实现 在带有头结点中,Push 操作的核心思想是通过头插法将新节点插入到头结点之后。这种方法能够保证每次插入操作的时间复杂度为 O(1),并且实现的后进先出(LIFO)特性。 以下是带头结点 Push 操作的具体实现方法和代码示例: #### 1. 新节点的创建 首先需要为新节点分配内存,并初始化其数据域和指针域。这一步确保了新节点能够正确存储数据并接到表中。 ```c LinkList p = (LinkList)malloc(sizeof(LNode)); // 创建新节点并分配内存 p->data = e; // 将传入的数据赋值给新节点的数据域 p->next = NULL; // 初始化新节点的指针域为 NULL ``` #### 2. 插入新节点 接下来,将新节点插入到头结点之后。具体步骤包括: - 将新节点的 `next` 指针指向当前头结点的 `next` 节点。 - 更新头结点的 `next` 指针,使其指向新节点。 以下是完整的 Push 操作代码实现: ```c Status Push(LinkList L, ElemType e) { LinkList p = (LinkList)malloc(sizeof(LNode)); // 分配新节点内存 if (p == NULL) return ERROR; // 如果内存分配失败,返回错误 p->data = e; // 设置新节点的数据域 p->next = L->next; // 将新节点的 next 指针指向当前头结点的下一个节点 L->next = p; // 更新头结点的 next 指针,使其指向新节点 return OK; // 返回成功状态 } ``` #### 3. 代码解析 - **内存分配**:通过 `malloc` 函数为新节点分配内存[^1]。 - **数据赋值**:将传入的元素值 `e` 赋值给新节点的数据域 `data`[^2]。 - **指针调整**:新节点的 `next` 指针指向当前头结点的 `next` 节点,然后更新头结点的 `next` 指针指向新节点[^3]。 #### 4. 注意事项 - 确保在调用 `malloc` 时检查内存分配是否成功。如果内存分配失败,函数应返回 `ERROR`[^5]。 -结点本身不存储实际数据,仅作为辅助节点使用,因此其 `next` 指针始终指向顶节点[^4]。 ### 示例运行 假设初始为空,头结点的 `next` 指针为 `NULL`。依次执行以下操作: - `Push(L, 1)`:新节点 `1` 被插入到头结点之后,表结构为 `Head -> 1 -> NULL`。 - `Push(L, 2)`:新节点 `2` 被插入到头结点之后,表结构为 `Head -> 2 -> 1 -> NULL`。 - `Push(L, 3)`:新节点 `3` 被插入到头结点之后,表结构为 `Head -> 3 -> 2 -> 1 -> NULL`。 最终表的顺序反映了的后进先出特性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值