数据结构:链栈

一、介绍

操作受限的链表

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

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

二、功能(把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 小时前
leetcode 2826. 将三个组排序
数据结构·c++·算法·leetcode
Buling_03 小时前
算法-哈希表篇08-四数之和
数据结构·算法·散列表
左灯右行的爱情6 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis
fai厅的秃头姐!6 小时前
C语言03
c语言·数据结构·算法
醉城夜风~6 小时前
[数据结构]单链表详解
数据结构·链表
myprogramc6 小时前
十大排序算法
数据结构·算法·排序算法
计算机小白一个6 小时前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
孤雪心殇6 小时前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
柃歌7 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌7 小时前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法