栈的链式存储实现
采用分文件的形式使用VS2013 C语言 编写
1 栈的链式存储头文件ListStack.h
#ifndef LISTSTACK_H
#define LISTSTACK_H
#include <stdio.h>
#include <stdlib.h>
#define LISTSTACK_TURE 1
#define LISTSTACK_FALSE 0
//创建链接结点
typedef struct LINKNODE
{
struct LINKNODE* next;
}LinkNode;
//创建链表
typedef struct LISTSTACK
{
LinkNode head;
int size;
}ListStack;
//初始化
ListStack* Init_ListStack();
//入栈
void Push_ListStack(ListStack* lstack,LinkNode* data);
//提取栈顶元素
LinkNode* Top_ListStack(ListStack* lstack);
//出栈
void Pop_ListStack(ListStack* lstack);
//返回元素个数
int Size_ListStack(ListStack* lstack);
//判断是否为空
int IsEmpty_ListStack(ListStack* lstack);
//清空
void Clrea_ListStack(ListStack* lstack);
//销毁
void Free_ListStack(ListStack* lstack);
#endif
2 实现这些函数功能ListStack.c
#include "ListStack.h"
//初始化
ListStack* Init_ListStack()
{
ListStack* lstack = (ListStack*)malloc(sizeof(ListStack));
if (lstack == NULL)
{
printf("Init_ListStack err: -1\n");
return NULL;
}
//初始化
lstack->head.next = NULL;
lstack->size = 0;
return lstack;
}
//入栈
void Push_ListStack(ListStack* lstack, LinkNode* data)
{
if (lstack == NULL)
{
printf("Push_ListStack err: -1\n");
return ;
}
if (data == NULL)
{
printf("Push_ListStack err: -2\n");
return;
}
//插入到头结点之后
data->next = lstack->head.next;
lstack->head.next = data;
//size++
lstack->size++;
}
//提取栈顶元素
LinkNode* Top_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("Top_ListStack err: -1\n");
return NULL;
}
if (lstack->size == 0)
{
printf("Top_ListStack err: -2\n");
return NULL;
}
return lstack->head.next;
}
//出栈
void Pop_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("Pop_ListStack err: -1\n");
return ;
}
if (lstack->size == 0)
{
printf("Pop_ListStack err: -2\n");
return ;
}
//头结点直接指向第一个元素的next,size--
lstack->head.next = lstack->head.next->next;
lstack->size--;
}
//返回元素个数
int Size_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("Pop_ListStack err: -1\n");
return -1;
}
return lstack->size;
}
//判断是否为空
int IsEmpty_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("IsEmpty_ListStack err: -1\n");
return -1;
}
if (lstack->size == 0)
{
return LISTSTACK_TURE;
}
if (lstack->size > 0)
{
return LISTSTACK_FALSE;
}
else
{
printf("IsEmpty_ListStack err: -2\n");
return -2;
}
}
//清空
void Clrea_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("Clrea_ListStack err: -1\n");
return ;
}
//直接将头结点的head->next 指向NULL即可
lstack->head.next = NULL;
lstack->size = 0;
}
//销毁
void Free_ListStack(ListStack* lstack)
{
if (lstack == NULL)
{
printf("Free_ListStack err: -1\n");
return ;
}
free(lstack);
}
3 在main.c中测试
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ListStack.h"
typedef struct PERSON
{
LinkNode * node;
char name[64];
int age;
}Person;
int main(void)
{
//创建链表
ListStack* lstack = Init_ListStack();
//创建元素
Person p1, p2, p3, p4, p5;
strcpy(p1.name, "aaa");
strcpy(p2.name, "bbb");
strcpy(p3.name, "ccc");
strcpy(p4.name, "ddd");
strcpy(p5.name, "eee");
p1.age = 10;
p2.age = 20;
p3.age = 30;
p4.age = 40;
p5.age = 50;
//入栈
Push_ListStack(lstack, (LinkNode*)&p1);
Push_ListStack(lstack, (LinkNode*)&p2);
Push_ListStack(lstack, (LinkNode*)&p3);
Push_ListStack(lstack, (LinkNode*)&p4);
Push_ListStack(lstack, (LinkNode*)&p5);
//打印元素个数 5
printf("元素个数为 %d:\n", Size_ListStack(lstack));
//打印栈中所有元素
while (IsEmpty_ListStack(lstack) == LISTSTACK_FALSE)//当不为空时
{
//返回栈顶元素
Person* pTop = (Person*)Top_ListStack(lstack);
//打印栈顶元素
printf("name = %s ,age = %d\n ", pTop->name, pTop->age);
//栈顶元素出栈
Pop_ListStack(lstack);
}
//打印元素个数 0
printf("元素个数为 %d:\n", Size_ListStack(lstack));
//销毁
Free_ListStack(lstack);
printf("\n");
system("pause");
return 0;
}
4文件结构和结果
文件结构为
运行完成的结果为