[ create a new paste ] login | about

Link: http://codepad.org/n3raxalm    [ raw code | fork ]

C, pasted on Aug 29:
/* btlib.c */
#include <stdio.h>
#include <stdlib.h>
#include "btlib.h"

static void lib_delnode(struct Lib_node *pNdel)
{
    if (pNdel != NULL) {
        xfree(pNdel, MAGICBTLIB);
    }
	return;
}

/*---------------------------------------------------------*/
void lib_init_list(struct Lib_node **root)
{
    *root = NULL;
    return;
}

void *lib_add_list(struct Lib_node **p, void *data, int (*cmp_f)(void *, void *))
{
    struct Lib_node *new;
    int r;

    while (*p != NULL) {
        if ((r = (*cmp_f)(data, (*p)->data)) == 0)
            return (*p)->data;
        if (r < 0)
            p = &((*p)->left);
        else
            p = &((*p)->right);
    }
    new = (struct Lib_node *)xmalloc(sizeof(struct Lib_node), MAGICBTLIB);
    if (new == NULL)
        return NULL;
    new->data = data;
    new->left = new->right = NULL;
    *p = new;
    return data;
}

void *lib_delmin_list(struct Lib_node **p)
{
    struct Lib_node *q;
    void *data;

    if (*p == NULL)
        return NULL;
    while ((*p)->left != NULL)
        p = &((*p)->left);
    
    data = (*p)->data;
    q = *p;
    *p = (*p)->right;
    lib_delnode(q); /* = free(q); */
    return data;
}   

int lib_output(struct Lib_node *p, int (*out_f)(void *))
{
	p->next = NULL;
p_left:
	if (p->right != NULL)
		p->right->next = NULL;

	if (p->left != NULL) {
		p->left->next = p;
		p = p->left;
		goto p_left;
	}
p_right:
	if ((*out_f)(p->data) != OK)
		return ERR;

	if (p->right != NULL) {
		p->right->next = p;
		p = p->right;
		goto p_left;
	}
p_next:
	if (p->next != NULL) {
		p = p->next;
		if (p->right == NULL)
			goto p_right;
		if (p->right->next != p)
			goto p_right;
		else
			goto p_next;
	}
	return OK;
}

void lib_delall_list(struct Lib_node **p, void (*free_f)(void *))
{
    struct Lib_node **q;

	if (*p == NULL)
		return;
	(*p)->next = NULL;
	
p_left:
	if ((*p)->left != NULL) {
		(*p)->left->next = p;
		p = &((*p)->left);
		goto p_left;
	}
p_right:
	if ((*p)->right != NULL) {
		(*p)->right->next = p;
		p = &((*p)->right);
		goto p_left;
	}
p_next:
	if ((*p)->next != NULL) {
		q = (struct Lib_node **)((*p)->next);
		(*free_f)((*p)->data);
		lib_delnode(*p); /* = free(*p); */
		*p = NULL;
		p = q;
		goto p_right;
	}
	(*free_f)((*p)->data);
	lib_delnode(*p); /* free(*p); */
}

void *lib_find_list(struct Lib_node *p, void *data, int (*cmp_f)(void *, void *))
{
    int r;

    if (p == NULL)
        return NULL;
    while ((r = cmp_f(data, p->data)) != 0) {
        if (r < 0)
            p = p->left;
        else
            p = p ->right;
        if (p == NULL)
            return NULL;
    }
    return p->data;
}

/* end */


Create a new paste based on this one


Comments: