头文件

#include "mln_stack.h"

模块名

stack

函数/宏

mln_stack_init

mln_stack_t *mln_stack_init(stack_free free_handler, stack_copy copy_handler);

typedef void (*stack_free)(void *);
typedef void *(*stack_copy)(void *, void *);

描述:

初始化栈结构。

free_handler:是入栈数据的释放函数,由于入栈数据可能为自定义数据结构,因此若需释放,可对此进行设置否则置NULL

copy_handler:复制栈节点数据。

stack_free的参数为用户自定义数据的数据结构指针。

stack_copy的参数分别为:被复制的栈节点数据的数据结构指针 和 mln_stack_dup函数的第二个参数(即用户自定义数据),这个回调函数仅在mln_stack_dup函数中被调用。

返回值:成功则返回栈指针,否则为NULL

mln_stack_destroy

void mln_stack_destroy(mln_stack_t *st);

描述:销毁栈结构,并释放栈节点内数据资源。

返回值:无

mln_stack_push

int mln_stack_push(mln_stack_t *st, void *data);

描述:将数据data压入栈st中。

返回值:成功返回0,否则返回-1

mln_stack_pop

void *mln_stack_pop(mln_stack_t *st);

描述:将栈st的栈顶元素数据弹出。

返回值:若栈内无元素则为NULL,否则为栈节点内的数据指针

mln_stack_empty

mln_stack_empty(s)

描述:判断栈是否为空。

返回值:空为非0,否则为0

mln_stack_top

mln_stack_top(st)

描述:获取栈顶元素数据。

返回值:若栈st为空则返回NULL,否则为栈顶节点内的数据指针

mln_stack_dup

mln_stack_t *mln_stack_dup(mln_stack_t *st, void *udata);

描述:完全复制栈studata为用户提供的额外数据。

返回值:若成功则返回新栈指针,否则返回NULL

mln_stack_iterate

int mln_stack_iterate(mln_stack_t *st, stack_iterate_handler handler, void *data);

typedef int (*stack_iterate_handler)(void *, void *);

描述:

从栈顶向栈底遍历栈st的每一个栈内元素数据。handler为数据访问函数,data为遍历时的额外用户数据。

stack_iterate_handler有两个参数,分别为:栈节点内数据指针 和 data参数。

返回值:

  • mln_stack_iterate:全部遍历完则返回0,否则返回-1
  • stack_iterate_handler:若想中断遍历则返回小于0的值,否则返回值大于等于0

示例

#include "mln_stack.h"
#include <stdlib.h>
#include <assert.h>

typedef struct {
    void *data1;
    void *data2;
} data_t;

static void *copy(data_t *d, void *data)
{
    data_t *dup;
    assert((dup = (data_t *)malloc(sizeof(data_t))) != NULL);
    *dup = *d;
    return dup;
}

int main(void)
{
    int i;
    data_t *d;
    mln_stack_t *st1, *st2;

    assert((st1 = mln_stack_init((stack_free)free, (stack_copy)copy)) != NULL);

    for (i = 0; i < 3; ++i) {
        assert((d = (data_t *)malloc(sizeof(data_t))) != NULL);
        assert(mln_stack_push(st1, d) == 0);
    }

    assert((st2 = mln_stack_dup(st1, NULL)) != NULL);

    assert((d = mln_stack_pop(st1)) != NULL);
    free(d);

    mln_stack_destroy(st1);
    mln_stack_destroy(st2);

    return 0;
}

results matching ""

    No results matching ""