#ifndef LINKSTACK_H_INCLUDED
#define LINKSTACK_H_INCLUDED #include <stdlib.h>
#include <stdio.h> //链式栈的结点
typedef struct LINKNODE {
struct LINKNODE *next;
}LinkNode; //链式栈
typedef struct LINKSTACK {
LinkNode head;
int size;
}LinkStack; //初始化函数
LinkStack *Init_LinkStack(); //入栈
void Push_LinkStack(LinkStack *stack, LinkNode *data); //出栈
void Pop_LinkStack(LinkStack *stack); //返回栈顶元素
LinkNode* Top_LinkStack(LinkStack *stack); //返回栈元素的个数
int Size_LinkStack(LinkStack *stack); //清空栈
void Clear_LinkStack(LinkStack *stack); //销毁
void FreeSpace_LinkStack(LinkStack *stack); #endif // LINKSTACK_H_INCLUDED
#include "LinkStack.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h> //初始化函数
LinkStack *Init_LinkStack() {
LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));
stack->head.next = NULL;
stack->size = 0;
return stack;
} //入栈
void Push_LinkStack(LinkStack *stack, LinkNode *data) {
if(stack == NULL){
return;
}
if(data == NULL){
return;
}
data->next = stack->head.next;
stack->head.next = data;
stack->size++;
} //出栈
void Pop_LinkStack(LinkStack *stack) {
if(stack == NULL){
return;
}
if(stack->size == 0){
return;
} //第一个有效结点
LinkNode *pNext = stack->head.next;
stack->head.next = pNext->next;
stack->size--;
} //返回栈顶元素
LinkNode* Top_LinkStack(LinkStack *stack) {
if(stack == NULL){
return NULL;
}
if(stack->size == 0){
return NULL;
}
//返回头结点后面的第一个元素
return stack->head.next;
} //返回栈元素的个数
int Size_LinkStack(LinkStack *stack) {
if(stack == NULL){
return 0;
}
return stack->size;
} //清空栈
void Clear_LinkStack(LinkStack *stack) {
if(stack == NULL){
return;
}
stack->head.next = NULL;
stack->size = 0;
} //销毁
void FreeSpace_LinkStack(LinkStack *stack) {
if(stack == NULL) {
return;
}
free(stack); }
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #include "LinkStack.h" typedef struct PERSON {
LinkNode node;
char name[64];
int age;
}Person; int main()
{
printf("链式栈!\n"); //创建栈
LinkStack *stack = Init_LinkStack(); Person p1, p2, p3, p4, p5;
strcpy(p1.name, "Jarvis1");
strcpy(p2.name, "Jarvis2");
strcpy(p3.name, "Jarvis3");
strcpy(p4.name, "Jarvis4");
strcpy(p5.name, "Jarvis5"); p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50; Push_LinkStack(stack, (LinkNode*)&p1);
Push_LinkStack(stack, (LinkNode*)&p2);
Push_LinkStack(stack, (LinkNode*)&p3);
Push_LinkStack(stack, (LinkNode*)&p4);
Push_LinkStack(stack, (LinkNode*)&p5); //输出
while(Size_LinkStack(stack) > 0) {
Person *p = (Person *)Top_LinkStack(stack);
printf("Name : %s, Age : %d \n", p->name, p->age);
Pop_LinkStack(stack);
} //销毁
FreeSpace_LinkStack(stack);
system("pause");
return 0;
}

链表栈C语言实现的更多相关文章

  1. C语言 复杂的栈(链表栈)

    //复杂的栈--链表栈 #include<stdio.h> #include<stdlib.h> #define datatype int//定义链表栈数据类型 //定义链表栈 ...

  2. 基于链表的C语言堆内存检测

    说明 本文基于链表实现C语言堆内存的检测机制,可检测内存泄露.越界和重复释放等操作问题. 本文仅提供即视代码层面的检测机制,不考虑编译链接级的注入或钩子.此外,该机制暂未考虑并发保护. 相关性文章参见 ...

  3. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...

  4. 数据结构与算法之顺序栈C语言实现

    顺序栈是一种特殊的顺序表,主要操作是入栈和出栈.将顺序表加一些特定限制,就成了顺序栈. 注: 1.顺序栈C语言实现: 2.按较简单的方式实现,主要帮助理解,可在此基础上修改,更加完善: 3.提供几个简 ...

  5. java——链表、链表栈 LinkedListStack、链表队列 LinkedListQueue

    LikedList: package Date_pacage; public class LinkedList<E> { public static void main(String[] ...

  6. 【数据结构】之链表(Java语言描述)

    以前写过一篇帖子,记录了链表在C语言中的描述代码.C语言中没有链表的直接实现,因此,我们需要自己编写代码实现.请参考[我的这篇文章]. Java中默认为我们提供了链表的API—— LinkedList ...

  7. 链表栈的C语言实现

    #ifndef _CONST_H_#define _CONST_H_ #include <stdio.h>#include <stdlib.h> typedef enum { ...

  8. 指针与数据结构算法_链表(C语言)

    一.变量: 声明一个变量系统是没有给这个变量分配内存空间的: 例: int j;//编译的时候是没有分配内存空间的 ;//计算机在编译的时候就会给这个i分配4个字节的内存空间 二.malloc动态分配 ...

  9. 数据结构入门之链表(C语言实现)

    这篇文章主要是根据<数据结构与算法分析--C语言描述>一书的链表章节内容所写,该书作者给出了链表ADT的一些方法,但是并没有给出所有方法的实现.在学习的过程中将练习的代码记录在文章中,并添 ...

随机推荐

  1. MySql查询进阶

    1.1 as关键字 用于 给显示结果中字段 或者 表 起别名 select 别名.字段名 from 表名 as 别名 where 条件语句 # 对字段起别名 select id as '编号', na ...

  2. 关于redis的几件小事(三)redis的数据类型与使用场景

    1.string 这是最基本的类型了,就是普通的set和get,做简单的kv缓存. 2.hash 这个是类似map的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是这个对象没嵌套其他的对 ...

  3. 两种表复制语句(SQL)

    select into select语句和select into from语句 1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field ...

  4. linux系统awk命令

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息awk处理过程:?依次对每一行进行处理,然后输出awk命令形式:awk [-F|-f ...

  5. Redis位操作介绍

    在学习redis的过程了,看到了redis还能用于大数据处理,具体场景如下:腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需 ...

  6. target_link_libraries每次能连接1个???

    target_link_libraries(usb-1.0)target_link_libraries(cyusb)

  7. ffmpeg函数04__v_register_output_format()

    注册复用器,编码器等的函数av_register_all() 注册编解码器avcodec_register_all() 注册复用器的函数是av_register_output_format(). 注册 ...

  8. tomcat访问日志

    * %a - Remote IP address # 远程ip地址 * %A - Local IP address # 本地ip地址 * %b - Bytes sent, excluding HTTP ...

  9. pidstat 命令详解(转载)

    转自https://www.jianshu.com/p/3991c0dba094 pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备I ...

  10. grunt-contrib-jshint js代码检查

    grunt-contrib-jshint:用于javascript代码检查(并会给出建议),发布js代码前执行jshint任务, 可以避免出现一些低级语法问题jshint拥有非常丰富的配置,可以自由控 ...