#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//数据
typedef struct item{
int index;
} Item;
//节点
typedef struct node{
Item item;
struct node *next;
} Node , *linkStackPtr;
//栈
typedef struct{
linkStackPtr top;
int count;
} linkStack;
//初始化
void initLinkStack(linkStack *s);
//进栈
void push(linkStack *s, Item *e);
//出栈
void pop(linkStack *s, Item **e);
//循环显示
void StackTraverse(linkStack *s);
//判断为空
bool stackEmpty(linkStack *s);
//清空栈
void clearStack(linkStack *s);
void initLinkStack(linkStack *s){
/*s->top = (linkStackPtr)malloc( sizeof(Node) );
if(!s->top){
fprintf(stderr, "栈初始化错误.");
exit(EXIT_FAILURE);
}*/
s->top = NULL;
s->count = 0;
}
void push(linkStack *s, Item *e){
Node *node = (Node*)malloc( sizeof(Node) );
if(!node){
fprintf(stderr, "进栈错误.");
exit(EXIT_FAILURE);
}
node->item = *e ;
node->next = s->top;
s->top = node;
s->count++;
}
void pop(linkStack *s, Item **e){
if( !stackEmpty(s) ){
fprintf(stderr, "出栈错误,栈为空");
exit(EXIT_FAILURE);
}
linkStackPtr top = s->top;
linkStackPtr p = top->next;
s->top = p;
s->count--;
**e = top->item;
free(top);
}
void StackTraverse(linkStack *s){
linkStackPtr node = s->top;
while(node != NULL){
printf("%d \n", node->item.index);
node = node->next;
}
}
bool stackEmpty(linkStack *s){
if(s->count == 0){
return false;
}else{
return true;
}
}
void clearStack(linkStack *s){
linkStackPtr top = s->top;
linkStackPtr p;
while(top){
p = top;
top = top->next;
free(p);
}
s->count = 0;
}
int main(void){
linkStack s;
initLinkStack(&s);
Item e = {
e.index = 1
};
Item e1 = {
e1.index = 2
};
push(&s,&e);
push(&s,&e1);
Item *e2 = &e1 ; //Item *e2;错误 e2没有指向任何空间
pop(&s, &e2);
printf("出栈数据为:%d\n", e2->index);
StackTraverse(&s);
clearStack(&s);
return 0;
}