#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define MAXSIZE 20
typedef struct LinkStackNode
{
ElemType data;
struct LinkStackNode *next;
}LinkStackNode;
typedef struct LinkStack
{
//不应该是头结点,而是头结点地址
//栈就是指向栈顶(头)
LinkStackNode *top;//只保存头节点的位置
int length;
}LinkStack;
LinkStack* Create_Stack()
{
LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));
if(stack == NULL)
{
return NULL;
}
stack->top = NULL;
stack->length = 0;
return stack;
}
int Push_Stack(LinkStack *stack,ElemType data)
{
if(stack == NULL)
{
return -1;
}
LinkStackNode *node = malloc(sizeof(LinkStackNode));
if(node == NULL)
{
return -1;
}
node->data = data;
node->next = NULL;
//注意都是在栈顶操作,
//头插法
node->next = stack->top;
stack->top = node;
stack->length++;
return 0;
}
int Pop_Stack(LinkStack *stack,ElemType *value)
{
LinkStackNode *tmp = NULL;
if(stack == NULL || value == NULL)
{
return -1;
}
if(stack->length < 0)
{
//没有数据,无法弹出
return -2;
}
if(stack->length == 1)
{
//只有一个的特殊情况
//直接free
*value = stack->top->data;
free(stack->top);
stack->top = NULL;
return 0;
}
//到这一定有大于1的数据
// 1 2 3
// .(切断) .
//top .
*value = stack->top->data;
tmp = stack->top;
stack->top = tmp->next;
stack->length--;
return 0;
}
int Top_Stack(LinkStack *stack,ElemType *value)
{
if(stack == NULL || value == NULL)
{
return -1;
}
if(stack->length <= 0)
{
return -2;
}
*value = stack->top->data;
return 0;
}
void Destroy_Stack(LinkStack *stack)
{
LinkStackNode *tmp = NULL;
if(stack == NULL)
{
return;
}
//1 2 3 NULL
while(stack->top)
{
tmp = stack->top->next;
free(stack->top);
stack->top = tmp;
}
free(stack);
}
int main()
{
int i = 0,value = 0;
LinkStack *stack = Create_Stack();
for(i=0;i<=20;i++) //故意多一个
{
if(Push_Stack(stack,i) != 0)
{
printf("push %d error\n",i);
}
else
{
Top_Stack(stack,&value);
printf("top:%d ",value);
}
}
Pop_Stack(stack,&value);
printf("\ndelete num:%d\n",value);
Destroy_Stack(stack);
return 0;
}
结果:
top:0 top:1 top:2 top:3 top:4 top:5 top:6 top:7 top:8 top:9 top:10 to
p:11 top:12 top:13 top:14 top:15 top:16 top:17 top:18 top:19 top:20
delete num:20
从结果来看,由于链式存储不存在数量的限制,可以插入第20个。同时要注意这里的Destroy函数,看看我是如何释放内存的。不过,只要是malloc出来的,你就得free。初学者的易错点在于只是free掉了stack,却忘了stack里面的结点都是都是你malloc出来的,也要释放,借助top指针进行逐一释放。