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;

}

相关推荐
一直C2 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
fish_zzzz2 小时前
笔记-论数据结构1
数据结构
承渊政道2 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
雯宝2 小时前
usb_serial_init/tty_driver/alloc_tty_driver/tty_register_driver/usb_register
linux
Felven2 小时前
B. Collecting Game
c语言
Felven3 小时前
C. Removing Smallest Multiples
c语言·开发语言
澜山奕秋3 小时前
Rhcsa 二
linux·运维·服务器
小此方3 小时前
Linux网络(三十三):告别O(n)噩梦:从select/poll的挣扎到epoll红黑树+回调的降维打击,一文打通IO多路复用
linux·网络·驱动开发
2301_777998343 小时前
Linux 网络:数据链路层
linux·服务器·网络
迷途之人不知返3 小时前
【文件系统】-1-磁盘与扇区的定位方法
linux