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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tree.c

?? package of develop dns
?? C
字號(hào):
#ifndef LINTstatic const char rcsid[] = "$Id: tree.c,v 1.2.206.1 2004/03/09 08:33:43 marka Exp $";#endif/* * tree - balanced binary tree library * * vix 05apr94 [removed vixie.h dependencies; cleaned up formatting, names] * vix 22jan93 [revisited; uses RCS, ANSI, POSIX; has bug fixes] * vix 23jun86 [added delete uar to add for replaced nodes] * vix 20jun86 [added tree_delete per wirth a+ds (mod2 v.) p. 224] * vix 06feb86 [added tree_mung()] * vix 02feb86 [added tree balancing from wirth "a+ds=p" p. 220-221] * vix 14dec85 [written] *//* * This program text was created by Paul Vixie using examples from the book: * "Algorithms & Data Structures," Niklaus Wirth, Prentice-Hall, 1986, ISBN * 0-13-022005-1.  Any errors in the conversion from Modula-2 to C are Paul * Vixie's. *//* * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") * Portions Copyright (c) 1996-1999 by Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *//*#define		DEBUG	"tree"*/#include "port_before.h"#include <stdio.h>#include <stdlib.h>#include "port_after.h"#include <isc/memcluster.h>#include <isc/tree.h>#ifdef DEBUGstatic int	debugDepth = 0;static char	*debugFuncs[256];# define ENTER(proc) { \			debugFuncs[debugDepth] = proc; \			fprintf(stderr, "ENTER(%d:%s.%s)\n", \				debugDepth, DEBUG, \				debugFuncs[debugDepth]); \			debugDepth++; \		}# define RET(value) { \			debugDepth--; \			fprintf(stderr, "RET(%d:%s.%s)\n", \				debugDepth, DEBUG, \				debugFuncs[debugDepth]); \			return (value); \		}# define RETV { \			debugDepth--; \			fprintf(stderr, "RETV(%d:%s.%s)\n", \				debugDepth, DEBUG, \				debugFuncs[debugDepth]); \			return; \		}# define MSG(msg)	fprintf(stderr, "MSG(%s)\n", msg);#else# define ENTER(proc)	;# define RET(value)	return (value);# define RETV		return;# define MSG(msg)	;#endif#ifndef TRUE# define TRUE		1# define FALSE		0#endifstatic tree *	sprout(tree **, tree_t, int *, int (*)(), void (*)());static int	delete(tree **, int (*)(), tree_t, void (*)(), int *, int *);static void	del(tree **, int *, tree **, void (*)(), int *);static void	bal_L(tree **, int *);static void	bal_R(tree **, int *);voidtree_init(tree **ppr_tree) {	ENTER("tree_init")	*ppr_tree = NULL;	RETV}	tree_ttree_srch(tree **ppr_tree, int (*pfi_compare)(tree_t, tree_t), tree_t	p_user) {	ENTER("tree_srch")	if (*ppr_tree) {		int i_comp = (*pfi_compare)(p_user, (**ppr_tree).data);		if (i_comp > 0)			RET(tree_srch(&(**ppr_tree).right,				      pfi_compare,				      p_user))		if (i_comp < 0)			RET(tree_srch(&(**ppr_tree).left,				      pfi_compare,				      p_user))		/* not higher, not lower... this must be the one.		 */		RET((**ppr_tree).data)	}	/* grounded. NOT found.	 */	RET(NULL)}tree_ttree_add(tree **ppr_tree, int (*pfi_compare)(tree_t, tree_t),	 tree_t p_user, void (*pfv_uar)()){	int i_balance = FALSE;	ENTER("tree_add")	if (!sprout(ppr_tree, p_user, &i_balance, pfi_compare, pfv_uar))		RET(NULL)	RET(p_user)}inttree_delete(tree **ppr_p, int (*pfi_compare)(tree_t, tree_t),	    tree_t p_user, void	(*pfv_uar)()){	int i_balance = FALSE, i_uar_called = FALSE;	ENTER("tree_delete");	RET(delete(ppr_p, pfi_compare, p_user, pfv_uar,		   &i_balance, &i_uar_called))}inttree_trav(tree **ppr_tree, int (*pfi_uar)(tree_t)) {	ENTER("tree_trav")	if (!*ppr_tree)		RET(TRUE)	if (!tree_trav(&(**ppr_tree).left, pfi_uar))		RET(FALSE)	if (!(*pfi_uar)((**ppr_tree).data))		RET(FALSE)	if (!tree_trav(&(**ppr_tree).right, pfi_uar))		RET(FALSE)	RET(TRUE)}voidtree_mung(tree **ppr_tree, void	(*pfv_uar)(tree_t)) {	ENTER("tree_mung")	if (*ppr_tree) {		tree_mung(&(**ppr_tree).left, pfv_uar);		tree_mung(&(**ppr_tree).right, pfv_uar);		if (pfv_uar)			(*pfv_uar)((**ppr_tree).data);		memput(*ppr_tree, sizeof(tree));		*ppr_tree = NULL;	}	RETV}static tree *sprout(tree **ppr, tree_t p_data, int *pi_balance,       int (*pfi_compare)(tree_t, tree_t), void (*pfv_delete)(tree_t)){	tree *p1, *p2, *sub;	int cmp;	ENTER("sprout")	/* are we grounded?  if so, add the node "here" and set the rebalance	 * flag, then exit.	 */	if (!*ppr) {		MSG("grounded. adding new node, setting h=true")		*ppr = (tree *) memget(sizeof(tree));		if (*ppr) {			(*ppr)->left = NULL;			(*ppr)->right = NULL;			(*ppr)->bal = 0;			(*ppr)->data = p_data;			*pi_balance = TRUE;		}		RET(*ppr);	}	/* compare the data using routine passed by caller.	 */	cmp = (*pfi_compare)(p_data, (*ppr)->data);	/* if LESS, prepare to move to the left.	 */	if (cmp < 0) {		MSG("LESS. sprouting left.")		sub = sprout(&(*ppr)->left, p_data, pi_balance,			     pfi_compare, pfv_delete);		if (sub && *pi_balance) {	/* left branch has grown */			MSG("LESS: left branch has grown")			switch ((*ppr)->bal) {			case 1:				/* right branch WAS longer; bal is ok now */				MSG("LESS: case 1.. bal restored implicitly")				(*ppr)->bal = 0;				*pi_balance = FALSE;				break;			case 0:				/* balance WAS okay; now left branch longer */				MSG("LESS: case 0.. balnce bad but still ok")				(*ppr)->bal = -1;				break;			case -1:				/* left branch was already too long. rebal */				MSG("LESS: case -1: rebalancing")				p1 = (*ppr)->left;				if (p1->bal == -1) {		/* LL */					MSG("LESS: single LL")					(*ppr)->left = p1->right;					p1->right = *ppr;					(*ppr)->bal = 0;					*ppr = p1;				} else {			/* double LR */					MSG("LESS: double LR")					p2 = p1->right;					p1->right = p2->left;					p2->left = p1;					(*ppr)->left = p2->right;					p2->right = *ppr;					if (p2->bal == -1)						(*ppr)->bal = 1;					else						(*ppr)->bal = 0;					if (p2->bal == 1)						p1->bal = -1;					else						p1->bal = 0;					*ppr = p2;				} /*else*/				(*ppr)->bal = 0;				*pi_balance = FALSE;			} /*switch*/		} /*if*/		RET(sub)	} /*if*/	/* if MORE, prepare to move to the right.	 */	if (cmp > 0) {		MSG("MORE: sprouting to the right")		sub = sprout(&(*ppr)->right, p_data, pi_balance,			     pfi_compare, pfv_delete);		if (sub && *pi_balance) {			MSG("MORE: right branch has grown")			switch ((*ppr)->bal) {			case -1:				MSG("MORE: balance was off, fixed implicitly")				(*ppr)->bal = 0;				*pi_balance = FALSE;				break;			case 0:				MSG("MORE: balance was okay, now off but ok")				(*ppr)->bal = 1;				break;			case 1:				MSG("MORE: balance was off, need to rebalance")				p1 = (*ppr)->right;				if (p1->bal == 1) {		/* RR */					MSG("MORE: single RR")					(*ppr)->right = p1->left;					p1->left = *ppr;					(*ppr)->bal = 0;					*ppr = p1;				} else {			/* double RL */					MSG("MORE: double RL")					p2 = p1->left;					p1->left = p2->right;					p2->right = p1;					(*ppr)->right = p2->left;					p2->left = *ppr;					if (p2->bal == 1)						(*ppr)->bal = -1;					else						(*ppr)->bal = 0;					if (p2->bal == -1)						p1->bal = 1;					else						p1->bal = 0;					*ppr = p2;				} /*else*/				(*ppr)->bal = 0;				*pi_balance = FALSE;			} /*switch*/		} /*if*/		RET(sub)	} /*if*/	/* not less, not more: this is the same key!  replace...	 */	MSG("FOUND: Replacing data value")	*pi_balance = FALSE;	if (pfv_delete)		(*pfv_delete)((*ppr)->data);	(*ppr)->data = p_data;	RET(*ppr)}static intdelete(tree **ppr_p, int (*pfi_compare)(tree_t, tree_t), tree_t p_user,       void (*pfv_uar)(tree_t), int *pi_balance, int *pi_uar_called){	tree *pr_q;	int i_comp, i_ret;	ENTER("delete")	if (*ppr_p == NULL) {		MSG("key not in tree")		RET(FALSE)	}	i_comp = (*pfi_compare)((*ppr_p)->data, p_user);	if (i_comp > 0) {		MSG("too high - scan left")		i_ret = delete(&(*ppr_p)->left, pfi_compare, p_user, pfv_uar,			       pi_balance, pi_uar_called);		if (*pi_balance)			bal_L(ppr_p, pi_balance);	} else if (i_comp < 0) {		MSG("too low - scan right")		i_ret = delete(&(*ppr_p)->right, pfi_compare, p_user, pfv_uar,			       pi_balance, pi_uar_called);		if (*pi_balance)			bal_R(ppr_p, pi_balance);	} else {		MSG("equal")		pr_q = *ppr_p;		if (pr_q->right == NULL) {			MSG("right subtree null")			*ppr_p = pr_q->left;			*pi_balance = TRUE;		} else if (pr_q->left == NULL) {			MSG("right subtree non-null, left subtree null")			*ppr_p = pr_q->right;			*pi_balance = TRUE;		} else {			MSG("neither subtree null")			del(&pr_q->left, pi_balance, &pr_q,			    pfv_uar, pi_uar_called);			if (*pi_balance)				bal_L(ppr_p, pi_balance);		}		if (!*pi_uar_called && pfv_uar)			(*pfv_uar)(pr_q->data);		/* Thanks to wuth@castrov.cuc.ab.ca for the following stmt. */		memput(pr_q, sizeof(tree));		i_ret = TRUE;	}	RET(i_ret)}static voiddel(tree **ppr_r, int *pi_balance, tree **ppr_q,    void (*pfv_uar)(tree_t), int *pi_uar_called){	ENTER("del")	if ((*ppr_r)->right != NULL) {		del(&(*ppr_r)->right, pi_balance, ppr_q,		    pfv_uar, pi_uar_called);		if (*pi_balance)			bal_R(ppr_r, pi_balance);	} else {		if (pfv_uar)			(*pfv_uar)((*ppr_q)->data);		*pi_uar_called = TRUE;		(*ppr_q)->data = (*ppr_r)->data;		*ppr_q = *ppr_r;		*ppr_r = (*ppr_r)->left;		*pi_balance = TRUE;	}	RETV}static voidbal_L(tree **ppr_p, int *pi_balance) {	tree *p1, *p2;	int b1, b2;	ENTER("bal_L")	MSG("left branch has shrunk")	switch ((*ppr_p)->bal) {	case -1:		MSG("was imbalanced, fixed implicitly")		(*ppr_p)->bal = 0;		break;	case 0:		MSG("was okay, is now one off")		(*ppr_p)->bal = 1;		*pi_balance = FALSE;		break;	case 1:		MSG("was already off, this is too much")		p1 = (*ppr_p)->right;		b1 = p1->bal;		if (b1 >= 0) {			MSG("single RR")			(*ppr_p)->right = p1->left;			p1->left = *ppr_p;			if (b1 == 0) {				MSG("b1 == 0")				(*ppr_p)->bal = 1;				p1->bal = -1;				*pi_balance = FALSE;			} else {				MSG("b1 != 0")				(*ppr_p)->bal = 0;				p1->bal = 0;			}			*ppr_p = p1;		} else {			MSG("double RL")			p2 = p1->left;			b2 = p2->bal;			p1->left = p2->right;			p2->right = p1;			(*ppr_p)->right = p2->left;			p2->left = *ppr_p;			if (b2 == 1)				(*ppr_p)->bal = -1;			else				(*ppr_p)->bal = 0;			if (b2 == -1)				p1->bal = 1;			else				p1->bal = 0;			*ppr_p = p2;			p2->bal = 0;		}	}	RETV}static voidbal_R(tree **ppr_p, int *pi_balance) {	tree *p1, *p2;	int b1, b2;	ENTER("bal_R")	MSG("right branch has shrunk")	switch ((*ppr_p)->bal) {	case 1:		MSG("was imbalanced, fixed implicitly")		(*ppr_p)->bal = 0;		break;	case 0:		MSG("was okay, is now one off")		(*ppr_p)->bal = -1;		*pi_balance = FALSE;		break;	case -1:		MSG("was already off, this is too much")		p1 = (*ppr_p)->left;		b1 = p1->bal;		if (b1 <= 0) {			MSG("single LL")			(*ppr_p)->left = p1->right;			p1->right = *ppr_p;			if (b1 == 0) {				MSG("b1 == 0")				(*ppr_p)->bal = -1;				p1->bal = 1;				*pi_balance = FALSE;			} else {				MSG("b1 != 0")				(*ppr_p)->bal = 0;				p1->bal = 0;			}			*ppr_p = p1;		} else {			MSG("double LR")			p2 = p1->right;			b2 = p2->bal;			p1->right = p2->left;			p2->left = p1;			(*ppr_p)->left = p2->right;			p2->right = *ppr_p;			if (b2 == -1)				(*ppr_p)->bal = 1;			else				(*ppr_p)->bal = 0;			if (b2 == 1)				p1->bal = -1;			else				p1->bal = 0;			*ppr_p = p2;			p2->bal = 0;		}	}	RETV}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区视频精品免费| ...xxx性欧美| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 亚洲一区二区三区美女| 欧美mv和日韩mv的网站| 97久久精品人人爽人人爽蜜臀| 麻豆精品精品国产自在97香蕉| 亚洲视频电影在线| 久久久精品欧美丰满| 欧美日韩的一区二区| 欧美在线你懂得| av在线一区二区三区| 日本特黄久久久高潮| 亚洲视频电影在线| 亚洲国产精品成人久久综合一区| 欧美高清激情brazzers| 色婷婷综合久久久中文一区二区| 国产一区二区三区不卡在线观看| 午夜精品久久久久久不卡8050| 国产精品美女一区二区| 久久一日本道色综合| 91精品国产综合久久小美女| 色婷婷激情综合| caoporen国产精品视频| 国产精品一级在线| 精品综合久久久久久8888| 日韩精品电影在线观看| 亚洲午夜久久久久久久久久久 | 中文字幕亚洲精品在线观看| 欧美成人免费网站| 欧美一区二区三区四区视频 | 成人av在线播放网站| 韩国欧美国产1区| 美脚の诱脚舐め脚责91| 免费成人深夜小野草| 午夜私人影院久久久久| 亚洲国产美女搞黄色| 亚洲美腿欧美偷拍| 亚洲视频 欧洲视频| 亚洲欧美激情小说另类| 亚洲欧美日韩国产综合在线| 亚洲欧美日韩中文字幕一区二区三区 | 夜夜夜精品看看| 亚洲综合激情网| 亚洲国产视频一区二区| 午夜亚洲国产au精品一区二区 | 国产aⅴ综合色| 国产电影精品久久禁18| 国产91对白在线观看九色| 成人v精品蜜桃久久一区| 岛国一区二区三区| 一区二区三区.www| 亚洲午夜电影在线观看| 日韩不卡一区二区| 九九在线精品视频| 国产一区在线观看麻豆| 高清不卡在线观看| 色综合色狠狠综合色| 欧美性生活大片视频| 制服丝袜国产精品| www国产成人免费观看视频 深夜成人网| 欧美精品一区二区三区视频| 国产日韩精品一区二区三区| 国产精品久久久久久亚洲伦| 一区二区三区**美女毛片| 日韩精品一卡二卡三卡四卡无卡| 日本女优在线视频一区二区| 久久精品噜噜噜成人88aⅴ| 国产老肥熟一区二区三区| 99麻豆久久久国产精品免费| 欧美四级电影在线观看| 日韩欧美中文一区二区| 日本一区免费视频| 亚洲图片欧美色图| 国产综合色产在线精品| 91麻豆精品秘密| 91精品国产综合久久精品app | 欧美日韩成人在线| 亚洲精品一区二区三区影院| 国产精品麻豆欧美日韩ww| 亚洲国产精品欧美一二99| 国产真实乱子伦精品视频| 99精品在线观看视频| 欧美一区二区三区在线电影| 中文欧美字幕免费| 日本一不卡视频| 成人av资源网站| 欧美一区二区成人6969| 精品亚洲国产成人av制服丝袜| 北条麻妃一区二区三区| 欧美福利视频一区| 一色桃子久久精品亚洲| 奇米色777欧美一区二区| jvid福利写真一区二区三区| 67194成人在线观看| 国产精品久久久一区麻豆最新章节| 亚洲成a人v欧美综合天堂下载| 国产成人夜色高潮福利影视| 欧美性感一类影片在线播放| 久久久高清一区二区三区| 午夜精彩视频在线观看不卡| 国产成人av在线影院| 日韩写真欧美这视频| 亚洲视频你懂的| 国产精品一二三| 91精品麻豆日日躁夜夜躁| 一区二区三区在线播放| 国产.精品.日韩.另类.中文.在线.播放| 欧美日韩国产美女| 日韩理论片网站| 国产宾馆实践打屁股91| 日韩精品一区二区三区在线播放| 亚洲最新视频在线观看| 成人综合在线网站| 精品成a人在线观看| 日本aⅴ免费视频一区二区三区| 色8久久人人97超碰香蕉987| 欧美激情自拍偷拍| 国产精品综合二区| 欧美成人video| 轻轻草成人在线| 欧美久久一区二区| 亚洲第一久久影院| 在线亚洲欧美专区二区| 亚洲欧美偷拍三级| 99re亚洲国产精品| 国产精品电影一区二区| 国产91精品久久久久久久网曝门| 欧美mv和日韩mv的网站| 免费在线观看视频一区| 欧美一区二区视频在线观看2022| 亚洲电影在线免费观看| 欧美日韩日日骚| 亚洲国产日韩一区二区| 欧美日韩一二三区| 亚洲福中文字幕伊人影院| 精品视频在线看| 亚洲成人av中文| 91精彩视频在线观看| 亚洲综合色在线| 欧美日韩美女一区二区| 亚洲成av人片一区二区| 欧美久久久久久久久中文字幕| 亚洲午夜电影在线| 91麻豆精品国产91久久久| 日本成人在线一区| 欧美电影免费观看高清完整版在线 | 91精品国产综合久久香蕉麻豆 | 久久精品国产亚洲高清剧情介绍 | 国内外成人在线| 久久久久久久久久久99999| 国产91精品一区二区麻豆网站| 国产亚洲短视频| 92国产精品观看| 一区二区成人在线| 69久久99精品久久久久婷婷| 久久aⅴ国产欧美74aaa| 欧美国产精品久久| 色嗨嗨av一区二区三区| 石原莉奈一区二区三区在线观看 | 亚洲欧美日韩国产综合在线| 在线视频观看一区| 日日夜夜免费精品视频| 欧美精品一区二区三区久久久| 成人av资源在线观看| 亚洲一区二区3| 精品久久久三级丝袜| 成人午夜激情片| 亚洲一区二区三区国产| 日韩你懂的在线播放| 成人精品一区二区三区中文字幕| 亚洲黄色免费网站| 精品国产伦一区二区三区免费| 成人免费三级在线| 午夜免费久久看| 久久免费的精品国产v∧| 91麻豆精品秘密| 另类小说一区二区三区| 综合电影一区二区三区 | 精品久久久久99| 97久久超碰国产精品电影| 日韩av中文字幕一区二区三区| 久久久高清一区二区三区| 欧美日韩亚洲不卡| 国产精品一区二区在线观看不卡 | 91精品免费观看| eeuss影院一区二区三区| 奇米在线7777在线精品| 亚洲欧美激情插 | 国产精品青草久久| 在线成人高清不卡| av福利精品导航| 久久国产精品色| 一级日本不卡的影视| 国产女主播视频一区二区| 6080午夜不卡| 在线精品视频免费观看| 国产91精品欧美| 精品中文字幕一区二区| 亚洲国产精品人人做人人爽|