亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? btree.c

?? MPEG-4編解碼的實現(包括MPEG4視音頻編解碼)
?? C
字號:
/*
 * FILE:     btree.c
 * PROGRAM:  RAT
 * AUTHOR:   O.Hodson
 * MODIFIED: C.Perkins
 * 
 * Binary tree implementation - Mostly verbatim from:
 *
 * Introduction to Algorithms by Corman, Leisserson, and Rivest,
 * MIT Press / McGraw Hill, 1990.
 *
 */

#include "config_unix.h"
#include "config_win32.h"
#include "debug.h"
#include "memory.h"
#include "btree.h"

typedef struct s_btree_node {
        uint32_t       		 key;
        void         		*data;
        struct s_btree_node 	*parent;
        struct s_btree_node 	*left;
        struct s_btree_node 	*right;
	uint32_t		 magic;
} btree_node_t;

struct s_btree {
        btree_node_t   *root;
	uint32_t	magic;
	int		count;
};

/*****************************************************************************/
/* Debugging functions...                                                    */
/*****************************************************************************/

#define BTREE_MAGIC      0x10101010
#define BTREE_NODE_MAGIC 0x01010101

static int btree_count;

static void
btree_validate_node(btree_node_t *node, btree_node_t *parent)
{
	ASSERT(node->magic  == BTREE_NODE_MAGIC);
	ASSERT(node->parent == parent);
	btree_count++;
	if (node->left != NULL) {
		btree_validate_node(node->left, node);
	}
	if (node->right != NULL) {
		btree_validate_node(node->right, node);
	}
}

static void
btree_validate(btree_t *t)
{
	ASSERT(t->magic == BTREE_MAGIC);
#ifdef DEBUG
	btree_count = 0;
	if (t->root != NULL) {
		btree_validate_node(t->root, NULL);
	}
	ASSERT(btree_count == t->count);
#endif
}

/*****************************************************************************/
/* Utility functions                                                         */
/*****************************************************************************/

static btree_node_t*
btree_min(btree_node_t *x)
{
        if (x == NULL) {
                return NULL;
        }
        while(x->left) {
                x = x->left;
        }
        return x;
}

static btree_node_t*
btree_max(btree_node_t *x)
{
        if (x == NULL) {
                return NULL;
        }
        while(x->right) {
                x = x->right;
        }
        return x;
}

static btree_node_t*
btree_successor(btree_node_t *x)
{
        btree_node_t *y;

        if (x->right != NULL) {
                return btree_min(x->right);
        }

        y = x->parent;
        while (y != NULL && x == y->right) {
                x = y;
                y = y->parent;
        }

        return y;
}

static btree_node_t*
btree_search(btree_node_t *x, uint32_t key)
{
        while (x != NULL && key != x->key) {
                if (key < x->key) {
                        x = x->left;
                } else {
                        x = x->right;
                }
        }
        return x; 
}

static void
btree_insert_node(btree_t *tree, btree_node_t *z) {
        btree_node_t *x, *y;

	btree_validate(tree);
        y = NULL;
        x = tree->root;
        while (x != NULL) {
                y = x;
                ASSERT(z->key != x->key);
                if (z->key < x->key) {
                        x = x->left;
                } else {
                        x = x->right;
                }
        }

        z->parent = y;
        if (y == NULL) {
                tree->root = z;
        } else if (z->key < y->key) {
                y->left = z;
        } else {
                y->right = z;
        }
	tree->count++;
	btree_validate(tree);
}

static btree_node_t*
btree_delete_node(btree_t *tree, btree_node_t *z)
{
        btree_node_t *x, *y;

	btree_validate(tree);
        if (z->left == NULL || z->right == NULL) {
                y = z;
        } else {
                y = btree_successor(z);
        }

        if (y->left != NULL) {
                x = y->left;
        } else {
                x = y->right;
        }

        if (x != NULL) {
                x->parent = y->parent;
        }

        if (y->parent == NULL) {
                tree->root = x;
        } else if (y == y->parent->left) {
                y->parent->left = x;
        } else {
                y->parent->right = x;
        }

        z->key  = y->key;
        z->data = y->data;

	tree->count--;

	btree_validate(tree);
        return y;
}

/*****************************************************************************/
/* Exported functions                                                        */
/*****************************************************************************/

int
btree_create(btree_t **tree)
{
        btree_t *t = (btree_t*)xmalloc(sizeof(btree_t));
        if (t) {
		t->count = 0;
		t->magic = BTREE_MAGIC;
                t->root  = NULL;
                *tree = t;
                return TRUE;
        }
        return FALSE;
}

int
btree_destroy(btree_t **tree)
{
        btree_t *t = *tree;

	btree_validate(t);
        if (t->root != NULL) {
                debug_msg("Tree not empty - cannot destroy\n");
                return FALSE;
        }

        xfree(t);
        *tree = NULL;
        return TRUE;
}

int
btree_find(btree_t *tree, uint32_t key, void **d)
{
        btree_node_t *x;

	btree_validate(tree);
        x = btree_search(tree->root, key);
        if (x != NULL) {
                *d = x->data;
                return TRUE;
        }
        return FALSE;
}

int 
btree_add(btree_t *tree, uint32_t key, void *data)
{
        btree_node_t *x;

	btree_validate(tree);
        x = btree_search(tree->root, key);
        if (x != NULL) {
                debug_msg("Item already exists - key %ul\n", key);
                return FALSE;
        }

        x = (btree_node_t *)xmalloc(sizeof(btree_node_t));
        x->key    = key;
        x->data   = data;
        x->parent = NULL;
	x->left   = NULL;
	x->right  = NULL;
	x->magic  = BTREE_NODE_MAGIC;
        btree_insert_node(tree, x);

        return TRUE;
}

int
btree_remove(btree_t *tree, uint32_t key, void **data)
{
        btree_node_t *x;

	btree_validate(tree);
        x = btree_search(tree->root, key);
        if (x == NULL) {
                debug_msg("Item not on tree - key %ul\n", key);
                *data = NULL;
                return FALSE;
        }

        /* Note value that gets freed is not necessarily the the same
         * as node that gets removed from tree since there is an
         * optimization to avoid pointer updates in tree which means
         * sometimes we just copy key and data from one node to
         * another.  
         */

        *data = x->data;
        x = btree_delete_node(tree, x);
        xfree(x);

        return TRUE;
}

int 
btree_get_min_key(btree_t *tree, uint32_t *key)
{
        btree_node_t *x;

	btree_validate(tree);
        if (tree->root == NULL) {
                return FALSE;
        }

        x = btree_min(tree->root);
        if (x == NULL) {
                return FALSE;
        }
        
        *key = x->key;
        return TRUE;
}

int 
btree_get_max_key(btree_t *tree, uint32_t *key)
{
        btree_node_t *x;

	btree_validate(tree);
        if (tree->root == NULL) {
                return FALSE;
        }

        x = btree_max(tree->root);
        if (x == NULL) {
                return FALSE;
        }
        
        *key = x->key;
        return TRUE;
}

int
btree_get_next_key(btree_t *tree, uint32_t cur_key, uint32_t *next_key)
{
        btree_node_t *x;

	btree_validate(tree);
        x = btree_search(tree->root, cur_key);
        if (x == NULL) {
                return FALSE;
        }
        
        x = btree_successor(x);
        if (x == NULL) {
                return FALSE;
        }
        
        *next_key = x->key;
        return TRUE;
}

/*****************************************************************************/
/* Test code                                                                 */
/*****************************************************************************/

#ifdef TEST_BTREE

static int
btree_depth(btree_node_t *x)
{
        int l, r;

        if (x == NULL) {
                return 0;
        }

        l = btree_depth(x->left);
        r = btree_depth(x->right);

        if (l > r) {
                return l + 1;
        } else {
                return r + 1;
        }
}

#include <curses.h>

static void
btree_dump_node(btree_node_t *x, int depth, int c, int w)
{
        if (x == NULL) {
                return;
        }
        
        move(depth * 2, c);
        printw("%lu", x->key);
        refresh();

        btree_dump_node(x->left,  depth + 1, c - w/2, w/2);
        btree_dump_node(x->right, depth + 1, c + w/2, w/2);

        return;
}

static void
btree_dump(btree_t *b)
{
        initscr();
        btree_dump_node(b->root, 0, 40, 48);
        refresh();
        endwin();
}

#include "stdlib.h"

int 
main()
{
        btree_t *b;
        uint32_t i, *x;
        uint32_t v[] = {15, 5, 16, 3, 12, 20, 10, 13, 18, 23, 6, 7}; 
        uint32_t nv = sizeof(v) / sizeof(v[0]);

        btree_create(&b);

        for(i = 0; i < nv; i++) {
                x = (uint32_t*)xmalloc(sizeof(uint32_t));
                *x = (uint32_t)random();
                if (btree_add(b, v[i], (void*)x) != TRUE) {
                        printf("Fail Add %lu %lu\n", v[i], *x);
                }
        }
    
        printf("depth %d\n", btree_depth(b->root));
        btree_dump(b);

        sleep(3);
        btree_remove(b, 5, (void*)&x);
        btree_dump(b);
        sleep(3);
        btree_remove(b, 16, (void*)&x);
        btree_dump(b);
        sleep(3);
        btree_remove(b, 13, (void*)&x);
        btree_dump(b);

        while (btree_get_root_key(b, &i)) {
                if (btree_remove(b, i, (void*)&x) == FALSE) {
                        fprintf(stderr, "Failed to remove %lu\n", i);
                }
                btree_dump(b);
                sleep(1); 
        }

        if (btree_destroy(&b) == FALSE) {
                printf("Failed to destroy \n");
        }
                
        return 0;
}

#endif /* TEST_BTREE*/


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区在线播放视频| 精品制服美女久久| 精品国产乱码久久久久久浪潮| 国产suv精品一区二区6| 日韩精品中文字幕在线一区| 美女一区二区在线观看| 欧美一级高清片| 久久9热精品视频| 久久综合色播五月| 国产成人亚洲综合a∨猫咪| 久久久精品tv| 91麻豆swag| 日本成人中文字幕| 国产亚洲精品久| 91一区在线观看| 丝瓜av网站精品一区二区| 亚洲免费色视频| 一二三四区精品视频| 色婷婷综合久久久久中文一区二区| 经典三级在线一区| 亚洲视频图片小说| 久久久久久**毛片大全| 激情综合五月婷婷| 国产精品理论片| 久久久久久97三级| 欧美xxxxxxxxx| 在线成人免费视频| 欧美欧美午夜aⅴ在线观看| 不卡的av电影| 国产成人av电影| 91丝袜呻吟高潮美腿白嫩在线观看| 久久精品国产精品亚洲精品| 亚洲成人免费观看| 午夜欧美大尺度福利影院在线看 | 亚洲欧美日韩久久精品| 欧美日韩国产欧美日美国产精品| 久久99精品国产| 日韩成人精品视频| 亚洲高清免费观看| 久久精品在线观看| 日韩欧美一区中文| 91精品国产欧美一区二区| 欧美精品久久一区二区三区| 91视频在线看| 喷白浆一区二区| 91精品国产免费| 91精品黄色片免费大全| 欧美日产国产精品| 这里是久久伊人| 3atv一区二区三区| 日韩欧美亚洲国产精品字幕久久久| 91精品国产综合久久久久久久| 国产欧美一区二区三区在线老狼 | 久久69国产一区二区蜜臀| 日韩精品欧美精品| 久久精品二区亚洲w码| 韩国成人福利片在线播放| 国产呦萝稀缺另类资源| 成人免费看黄yyy456| 91在线视频18| 欧美另类久久久品| 精品久久久久99| 国产精品欧美精品| 亚洲免费av高清| 日韩高清不卡一区| 国产麻豆精品在线| 91丝袜国产在线播放| 欧美性极品少妇| 日韩欧美在线网站| 国产精品久久久久9999吃药| 一区二区三区在线视频观看| 肉肉av福利一精品导航| 国产乱理伦片在线观看夜一区| 成人a区在线观看| 欧美性一级生活| 久久久一区二区三区捆绑**| 亚洲欧洲精品天堂一级| 三级一区在线视频先锋| 东方aⅴ免费观看久久av| 在线亚洲高清视频| 亚洲美女在线一区| 午夜精品成人在线视频| 国产高清久久久久| 欧美午夜一区二区三区免费大片| 精品国产污污免费网站入口 | 色噜噜久久综合| 日韩视频免费观看高清在线视频| 亚洲国产激情av| 婷婷综合五月天| 成人福利视频网站| 在线91免费看| 国产精品久久久久久久久免费丝袜| 亚洲午夜日本在线观看| 国产成人一区在线| 欧美日韩国产美女| 综合激情成人伊人| 国产自产2019最新不卡| 欧美伦理电影网| 亚洲人精品午夜| 国内精品伊人久久久久av一坑| 欧美在线视频不卡| 国产精品视频yy9299一区| 七七婷婷婷婷精品国产| 欧美午夜精品理论片a级按摩| 久久欧美一区二区| 日本系列欧美系列| 日本高清不卡一区| 国产精品久久精品日日| 美女一区二区久久| 91精品国产综合久久久久久久久久 | 亚洲午夜私人影院| 亚洲综合图片区| 成人中文字幕电影| 欧美大胆一级视频| 亚洲成人先锋电影| 色国产综合视频| 国产精品色婷婷久久58| 国产九九视频一区二区三区| 69久久99精品久久久久婷婷 | 1024成人网色www| 国产成人精品亚洲午夜麻豆| 日韩精品中文字幕在线一区| 日韩va欧美va亚洲va久久| 欧美在线观看18| 亚洲精品欧美激情| 91网站视频在线观看| 国产精品国产三级国产aⅴ原创| 韩国精品久久久| 久久久久久久久久久久久夜| 精品一二线国产| 精品国产91亚洲一区二区三区婷婷| 图片区小说区国产精品视频| 欧美日韩一区小说| 亚洲大片免费看| 欧美色涩在线第一页| 午夜欧美在线一二页| 制服.丝袜.亚洲.中文.综合| 天天综合天天综合色| 中文字幕永久在线不卡| 国产精品123| 国产精品视频在线看| aaa亚洲精品| 亚洲丝袜美腿综合| 欧美专区亚洲专区| 五月天国产精品| 日韩欧美在线综合网| 黄色精品一二区| 久久亚洲免费视频| 99精品在线免费| 一区二区三区美女视频| 欧美高清激情brazzers| 美女尤物国产一区| 国产女人水真多18毛片18精品视频| 成人av免费观看| 一区二区三区精品视频在线| 欧美日韩国产免费一区二区| 美女视频一区在线观看| 久久久久久久久久久99999| a在线播放不卡| 亚洲国产欧美在线人成| 91精品国产色综合久久不卡蜜臀| 免费在线欧美视频| 欧美高清在线视频| 欧美在线观看一区| 久久不见久久见中文字幕免费| 国产亚洲一二三区| 欧美亚洲国产一区二区三区va| 免费人成黄页网站在线一区二区| 久久亚洲私人国产精品va媚药| 成人久久久精品乱码一区二区三区 | 国产精品亚洲第一区在线暖暖韩国 | 国产一区二区三区在线观看免费视频| 国产欧美综合色| 肉肉av福利一精品导航| 国产一区中文字幕| 日韩视频免费观看高清完整版 | 国产成人av资源| 亚洲日本在线天堂| 欧美一区二区三区在线电影| 国产大陆精品国产| 亚洲精品视频自拍| 久久男人中文字幕资源站| 色屁屁一区二区| 国产精品99久久久久久似苏梦涵| 亚洲精品日韩专区silk| 欧美精品一区二区三| 在线视频亚洲一区| 国产成人av一区二区三区在线| 五月婷婷久久综合| 国产精品拍天天在线| 欧美一级高清大全免费观看| 播五月开心婷婷综合| 久久超碰97中文字幕| 亚洲一区二区黄色| 国产精品网友自拍| 欧美xxxxx裸体时装秀| 欧美色老头old∨ideo| 成人性生交大片免费看视频在线 | 国产一区二区三区高清播放| 亚洲国产精品一区二区尤物区|