数据结构:链栈

一、介绍

操作受限的链表

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

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

二、功能(把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;
	}

}
相关推荐
Fine姐3 分钟前
数据结构01——栈
数据结构
hweiyu005 分钟前
数据结构:有向无环图
数据结构
liu****24 分钟前
10.排序
c语言·开发语言·数据结构·c++·算法·排序算法
利刃大大32 分钟前
【JavaSE】十一、Stack && Queue && Deque && PriorityQueue && Map && Set
java·数据结构·优先级队列··哈希表·队列·集合类
fufu031135 分钟前
Linux环境下的C语言编程(三十九)
c语言·数据结构·算法·链表
前端小L37 分钟前
回溯算法专题(十):二维递归的完全体——暴力破解「解数独」
数据结构·算法
AI科技星1 小时前
姬无烦科幻与张祥前统一场论的完美融合
数据结构·人工智能·算法·机器学习·重构
TL滕2 小时前
从0开始学算法——第十四天(数组与搜索)
数据结构·笔记·学习·算法
好易学·数据结构3 小时前
可视化图解算法73:跳台阶(爬楼梯)
数据结构·算法·leetcode·动态规划·笔试
长安er3 小时前
LeetCode 98. 验证二叉搜索树 解题总结
java·数据结构·算法·leetcode·二叉树·力扣