C语言数据结构-链式栈

头文件:stack.h

#ifndef STACK_H

#define STACK_H

#include <stdio.h>

#include <stdlib.h>

typedef int DataType;

/* 链式栈节点类型 */

typedef struct staNode

{

DataType data;

struct staNode *pNext;

}StackNode;

/* 链式栈标签类型 */

typedef struct list

{

StackNode *pTop; //指向栈顶指针

int cLen;

}StackList;

extern StackList *createSatckList();

extern int isEmptyStackList(StackList *);

extern int pushStackList(StackList *, DataType );

extern int popStackList(StackList *, DataType *);

extern DataType getStackTop(StackList *);

extern void clearStackList(StackList *);

extern void destroyStackList(StackList **);

extern void showStackList(StackList *pList);

#endif

源文件:stack.c main.c

stack.c

#include "stack.h"

StackList *createSatckList()

{

StackList *pList = malloc(sizeof(StackList));

if (NULL == pList)

{

perror("fail to malloc");

return NULL;

}

pList->pTop = NULL;

pList->cLen = 0;

return pList;

}

int isEmptyStackList(StackList *pList)

{

return pList->cLen == 0;

}

入栈:

int pushStackList(StackList *pList, DataType data)

{

StackNode *pTmpNode = malloc(sizeof(StackNode));

if (NULL == pTmpNode)

{

perror("fail to malloc");

return -1;

}

pTmpNode->data = data;

pTmpNode->pNext = NULL;

pTmpNode->pNext = pList->pTop;

pList->pTop = pTmpNode;

pList->cLen++;

return 0;

}

遍历:

void showStackList(StackList *pList)

{

StackNode *pTmpNode = pList->pTop;

while (pTmpNode != NULL)

{

printf("%d ", pTmpNode->data);

pTmpNode = pTmpNode->pNext;

}

printf("\n");

}

出栈:

int popStackList(StackList *pList, DataType *pOutData)

{

if (isEmptyStackList(pList))

{

return 0;

}

StackNode *pTmpNode = pList->pTop;

if (NULL != pOutData)

{

*pOutData = pTmpNode->data;

}

pList->pTop = pTmpNode->pNext;

free(pTmpNode);

pList->cLen--;

return 0;

}

DataType getStackTop(StackList *pList)

{

if (!isEmptyStackList(pList))

{

return pList->pTop->data;

}

}

void clearStackList(StackList *pList)

{

while (pList->pTop != NULL)

{

popStackList(pList, NULL);

}

}

销毁:

void destroyStackList(StackList **ppList)

{

clearStackList(*ppList);

free(*ppList);

*ppList = NULL;

}

main.c

#include "stack.h"

int main(int argc, const char *argv[])

{

StackList *pList = NULL;

DataType OutData;

pList = createSatckList();

pushStackList(pList, 1);

pushStackList(pList, 2);

pushStackList(pList, 3);

pushStackList(pList, 4);

showStackList(pList);

popStackList(pList, &OutData);

printf("pop data = %d\n", OutData);

showStackList(pList);

destroyStackList(&pList);

return 0;

}

相关推荐
胖咕噜的稞达鸭1 分钟前
AVL树手撕,超详细图文详解
c语言·开发语言·数据结构·c++·算法·visual studio
CSCN新手听安2 分钟前
【linux】多线程(六)生产者消费者模型,queue模拟阻塞队列的生产消费模型
linux·运维·服务器·c++
Wang's Blog4 分钟前
Linux小课堂: 软件安装与源码编译实战之从 RPM 到源码构建的完整流程
linux·运维·服务器
超级大福宝6 分钟前
在 Linux 下修改百度网盘的缩放比例
linux·运维·服务器·ubuntu
smileNicky6 分钟前
AI+Linux 命令高效提取大量日志数据
linux·人工智能·firefox
Wang's Blog10 分钟前
Linux小课堂: 深入理解前后台进程控制机制——基于 &、nohup、Ctrl+Z、bg 与 fg 的完整实践体系
linux·运维·服务器
-SGlow-11 分钟前
Linux相关概念和易错知识点(48)(epoll的底层原理、epoll的工作模式、反应堆模式)
linux·服务器·c语言·网络·c++
秉承初心11 分钟前
Linux中Expect脚本和Shell的脚本核心特点解析、以及比对分析和应用场景
linux·运维·服务器·sh·exp
脏脏a12 分钟前
【Linux】Linux:sudo 白名单配置与 GCC/G++ 编译器使用指南
linux·运维·服务器
---学无止境---12 分钟前
Linux中初始化字符设备子系统chrdev_init的实现
linux