1、链式栈ADT的定义
#ifndef _link_stack_h
#define _link_stack_h
typedef int elem_type;
struct stack_node;
typedef struct stack_node stack_node;
typedef stack_node * snode_ptr;
typedef stack_node * link_stack;
struct stack_node
{
elem_type data;
snode_ptr next;
};
void init_stack_link( link_stack * ls );
void clear_stack_link( link_stack ls );
void free_stack_link( link_stack * ls );
int stack_size_link( link_stack ls );
int is_stack_empty_link( link_stack ls );
void traverse_stack_link( link_stack ls );
int push_link( link_stack * ls, int e );
int top_link( link_stack * ls, int * e );
int pop_link( link_stack * ls, int * e );
#endif
2、实现
#include "link_stack.h"
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
void init_stack_link( link_stack * ls )
{
*ls = ( snode_ptr )malloc( sizeof( stack_node ) );
(*ls)->data = 0;
(*ls)->next = NULL;
}
void clear_stack_link( link_stack ls )
{
snode_ptr p = ls->next;
while( p != NULL )
{
ls->next = p->next;
free( p );
p = ls->next;
}
}
void free_stack_link( link_stack * ls )
{
clear_stack_link( *ls );
free( *ls );
*ls = NULL;
}
int stack_size_link( link_stack ls )
{
int len = 0;
snode_ptr p = ls->next;
while( p != NULL )
{
++len; p = p->next;
}
return len;
}
int is_stack_empty_link( link_stack ls )
{
return ls->next == NULL;
}
int push_link( link_stack * ls, int e )
{
snode_ptr p = ( snode_ptr )malloc( sizeof( stack_node ) );
if( p == NULL )
return 0;
p->data = e;
p->next = (*ls)->next;
(*ls)->next = p;
return 1;
}
int top_link( link_stack * ls, int * e )
{
if( is_stack_empty_link( *ls ) )
return -1;
*e = (*ls)->next->data;
return 1;
}
int pop_link( link_stack * ls, int * e )
{
snode_ptr p = NULL;
if( is_stack_empty_link( *ls ) )
return -1;
top_link( ls, e );
p = (*ls)->next;
(*ls)->next = p->next;
free( p );
return 1;
}
void traverse_stack_link( link_stack ls )
{
snode_ptr p = ls->next;
while( p != NULL )
{
printf( "%d ", p->data );
p = p->next;
}
putchar( '\n' );
}