数据结构:链栈

一、介绍

操作受限的链表

如果进行头插,就只能头删

如果进行尾插,就只能进行尾删

二、功能(把T->ptop当做头节点用)

链栈的结构体

cs 复制代码
#ifndef __LINK_STACK_H__
#define __LINK_STACK_H__
#include <stdio.h>
#include <stdlib.h>
typedef struct link_stack{
	int data;
	struct link_stack *next;
}link_stack,*link_p;

//桟顶指针的类型
//桟顶指针应该独立于桟存在,为了和桟中元素不同
typedef struct top_t{
	int len;//记录链桟的长度
	link_p ptop;//桟顶指针
}top_t,*top_p;

//申请桟顶指针
top_p creat_top();
//申请节点的函数
link_p creat_node(int data);
//判空
int empty(top_p T);
//入桟
void push_stack(top_p T,int data);
//出桟
void pop_stack(top_p T);
//遍历
void show_stack(top_p T);
//销毁链桟
void free_stack(top_p T);

#endif

1.申请栈顶指针

cs 复制代码
//申请桟顶指针
top_p creat_top(){
	top_p top=(top_p)malloc(sizeof(top_t));
	if(top==NULL){
		printf("空间申请失败\n");
		return NULL;
	}
	top->len=0;
	top->ptop=NULL;//刚申请桟指针没有指向元素
	return top;
}

2.申请节点

cs 复制代码
//申请节点的函数
link_p creat_node(int data){
	link_p new=(link_p)malloc(sizeof(link_stack));
	if(new==NULL){
		printf("申请空间失败\n");
		return NULL;
	}
	new->data=data;
	return new;
}

3.判空

cs 复制代码
//判空
int empty(top_p T){
		if(T==NULL){
		printf("申请空间失败\n");
		return 0;
	}
		return T->ptop==NULL?1:0;

}

4.入栈

cs 复制代码
//入桟
void push_stack(top_p T,int data){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	link_p new=creat_node(data);
	new->next=T->ptop;
	T->ptop=new;
	T->len++;
}

5.出栈

cs 复制代码
void pop_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	if(empty(T)){
printf("链桟为空,无需出桟\n");
return;
	}
	link_p p=T->ptop;
	while(p->next->next!=NULL){
		p=p->next;
	}
	link_p del=p->next;
	p->next=del->next;
	free(del);
	T->len--;
}

6.遍历

cs 复制代码
//遍历
void show_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
if(empty(T)){
	printf("链桟为空\n");
	return;
}
link_p p=T->ptop;
while(p!=NULL){
	printf("%d ",p->data);
	p=p->next;
}
putchar(10);
}

7.销毁链栈

复制代码
//销毁链桟
void free_stack(top_p T){
	if(T==NULL){
		printf("入参为空\n");
		return;
	}
	if(empty(T)){
		printf("链桟为空\n");
		return;
	}
	//循环出桟
	link_p p=T->ptop->next;
	link_p del;
	while(p!=NULL){
		del=p;
		p=p->next;
		free(del);
		del=NULL;
	}

}
相关推荐
兰令水3 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
cpp_25014 小时前
P10098 [ROIR 2023] 地铁建设 (Day 2)
数据结构·c++·算法·贪心·二分答案·洛谷题解
米尔的可达鸭7 小时前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana27 小时前
hot100 课程表(207)
java·数据结构·算法·leetcode
Frostnova丶8 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面9 小时前
顺序表的按值查找
数据结构·c++·算法
延凡科技9 小时前
延凡科技 - 发生器设备管理控制系统:AI 驱动的全生命周期智能管控方案
大数据·数据结构·人工智能·算法
小肝一下10 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~11 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石11 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构