简单的链栈

#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;
}

  

posted @ 2013-03-20 16:01  chapterlin  阅读(112)  评论(0)    收藏  举报