[库]C实现的泛型栈[1]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 avalonbbs 的 blog

/*
  name:         stack.h
  copyright:    1.0
  author:       avalon
  date: 02-10-04 19:48
  description:  泛型设计的栈
*/
#ifndef avalon_stack_h
#define avalon_stack_h
#include <stdio.h>

#ifndef avalon_bool
#define avalon_bool
#define true    1
#define false   0
typedef int     bool;/*自定义的bool型*/
#endif

typedef struct stack * stackhandle;/* 栈handle */

/*******
  接口
*******/ 
stackhandle initstack(size_t size);
/*构造一个空栈*/
bool gettop(stackhandle s,void * elem);
/*若栈不空,则用elem返回s的栈顶元素,并返回true*/
bool push(stackhandle s,void * elem);
/*插入元素,elem为新的栈顶元素*/
bool pop(stackhandle s, void * elem);
/*若栈不空,则删除s的栈顶元素,并用elem返回其值,
并返回true.elem也可取null值,则仅做弹出动作*/
bool clearstack(stackhandle s);
/*把s置为空栈*/
bool destroystack(stackhandle * s);
/*销毁栈s*/
bool stackempty(stackhandle s);
/*栈空?*/
int stacklength(stackhandle s);
/*栈长*/

#endif

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*
  name:         stack.c
  copyright:    1.0
  author:       avalon
  date: 02-10-04 19:48
  description:  泛型设计的栈
*/
#include <stdio.h>
#include <assert.h>
#include <mem.h>

#ifndef avalon_bool
#define avalon_bool
#define   true    1
#define   false   0
typedef   int     bool;
#endif

/*******
数据结构
*******/
typedef struct node{
    struct node  * prior      ;/*前位置*/
    void         * data       ;/**/
}node, * nodehandle;

typedef struct stack{
    nodehandle   base         ;/*栈底*/
    nodehandle   top          ;/*栈顶*/
    int          size_of_stack;/*栈长*/
    size_t       size_of_data ;/**/
}stack, * stackhandle;

/******
内部函数
******/
nodehandle allocnode(stackhandle s,void * elem)
{/*仅供内部使用专为分配空间*/
    nodehandle temp ;
    size_t size;
    assert( null!=s && null != elem);/**/
    size = s->size_of_data;
   
    temp= (nodehandle)malloc(sizeof(node));
    assert( null != temp);
    (temp->data) = (void *)malloc( size);
   
    memcpy( temp->data, elem , size);   
    return temp;
}
bool freenode(nodehandle * n)
{/*删除结点*/
    assert( null != *n && null !=n);/**/   
    free( (*n)->data);
    free( *n);
    return true;
}

/*******
 外部接口
*******/      
stackhandle initstack( size_t size)
{/*构造一个空栈*/
    stackhandle s = (stackhandle)malloc(sizeof(stack));
    assert( null !=s);/**/   
    s->top = s->base = null;
    s->size_of_stack = 0;
    s->size_of_data  = size;
    return s;
}
bool gettop(stackhandle s,void * elem)
{/*若栈不空,则用elem返回s的栈顶元素,并返回true*/   
    if(s==null || s->base == s->top)
        return false;
    memcpy( elem,s->top->data, s->size_of_data);
    return true;
}
bool push(stackhandle s,void * elem)
{/*插入元素,elem为新的栈顶元素*/
    nodehandle temp;
    assert(null !=s);
    assert(null !=elem);
   
    temp= allocnode(s,elem);/*分配一个结点*/
    (s->size_of_stack)++;
   
    temp->prior = s->top;
    s->top = temp;
    return true;
}
bool pop(stackhandle s, void * elem)
{/*若栈不空,则删除s的栈顶元素,并用elem返回其值,并返回true
  elem也可取null值,仅做弹出动作*/
    nodehandle temp;
  

本文关键:[库]C实现的泛型栈
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top