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

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

?? db.c

?? 最新的仙鏡傳說服務器C語言源碼
?? C
字號:
// $Id: db.c,v 1.6 2003/06/29 05:49:37 lemit Exp $
#define MALLOC_DBN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "db.h"

#ifdef MEMWATCH
#include "memwatch.h"
#endif

#define ROOT_SIZE 4096
static struct dbn *dbn_root[512], *dbn_free;
static int dbn_root_rest=0,dbn_root_num=0;

static void * malloc_dbn(void)
{
	struct dbn* ret;

	if(dbn_free==NULL){
		if(dbn_root_rest<=0){
			dbn_root[dbn_root_num]=calloc(sizeof(struct dbn)*ROOT_SIZE, 1);
			if(dbn_root[dbn_root_num]==NULL){
				printf("out of memory : malloc_dbn\n");
				exit(1);
			}
			dbn_root_rest=ROOT_SIZE;
			dbn_root_num++;
		}
		return &(dbn_root[dbn_root_num-1][--dbn_root_rest]);
	}
	ret=dbn_free;
	dbn_free = dbn_free->parent;
	return ret;
}

static void free_dbn(struct dbn* add_dbn)
{
	add_dbn->parent = dbn_free;
	dbn_free = add_dbn;
}

static int strdb_cmp(struct dbt* table,void* a,void* b)
{
	if(table->maxlen)
		return strncmp(a,b,table->maxlen);
	return strcmp(a,b);
}

static unsigned int strdb_hash(struct dbt* table,void* a)
{
	int i;
	unsigned int h;
	unsigned char *p=a;

	i=table->maxlen;
	if(i==0) i=0x7fffffff;
	for(h=0;*p && --i>=0;){
		h=(h*33 + *p++) ^ (h>>24);
	}
	return h;
}

struct dbt* strdb_init(int maxlen)
{
	int i;
	struct dbt* table;

	table = calloc(sizeof(*table), 1);
	if (table == NULL) {
		printf("out of memory : strdb_init\n");
		exit(1);
	}
	table->cmp=strdb_cmp;
	table->hash=strdb_hash;
	table->maxlen=maxlen;
	for(i=0;i<HASH_SIZE;i++)
		table->ht[i]=NULL;
	return table;
}

static int numdb_cmp(struct dbt* table,void* a,void* b)
{
	int ia,ib;

	ia=(int)a;
	ib=(int)b;

	if((ia^ib) & 0x80000000)
		return ia<0 ? -1 : 1;

	return ia-ib;
}

static unsigned int numdb_hash(struct dbt* table,void* a)
{
	return (unsigned int)a;
}

struct dbt* numdb_init(void)
{
	int i;
	struct dbt* table;

	table = calloc(sizeof *table, 1);
	if (table == NULL) {
		printf("out of memory : numdb_init\n");
		exit(1);
	}
	table->cmp=numdb_cmp;
	table->hash=numdb_hash;
	table->maxlen=sizeof(int);
	for(i=0;i<HASH_SIZE;i++)
		table->ht[i]=NULL;
	return table;
}

void* db_search(struct dbt *table,void* key)
{
	struct dbn *p;

	for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){
		int c=table->cmp(table,key,p->key);
		if(c==0)
			return p->data;
		if(c<0)
			p=p->left;
		else
			p=p->right;
	}
	return NULL;
}

static void db_rotate_left(struct dbn *p,struct dbn **root)
{
	struct dbn * y = p->right;
	p->right = y->left;
	if (y->left !=0)
		y->left->parent = p;
	y->parent = p->parent;

	if (p == *root)
		*root = y;
	else if (p == p->parent->left)
		p->parent->left = y;
	else
		p->parent->right = y;
	y->left = p;
	p->parent = y;
}

static void db_rotate_right(struct dbn *p,struct dbn **root)
{
	struct dbn * y = p->left;
	p->left = y->right;
	if (y->right != 0)
		y->right->parent = p;
	y->parent = p->parent;

	if (p == *root)
		*root = y;
	else if (p == p->parent->right)
		p->parent->right = y;
	else
		p->parent->left = y;
	y->right = p;
	p->parent = y;
}

static void db_rebalance(struct dbn *p,struct dbn **root)
{
	p->color = RED;
	while(p!=*root && p->parent->color==RED){ // root偼昁偢崟偱恊偼愒偄偺偱恊偺恊偼昁偢懚嵼偡傞
		if (p->parent == p->parent->parent->left) {
			struct dbn *y = p->parent->parent->right;
			if (y && y->color == RED) {
				p->parent->color = BLACK;
				y->color = BLACK;
				p->parent->parent->color = RED;
				p = p->parent->parent;
			} else {
				if (p == p->parent->right) {
					p = p->parent;
					db_rotate_left(p, root);
				}
				p->parent->color = BLACK;
				p->parent->parent->color = RED;
				db_rotate_right(p->parent->parent, root);
			}
		} else {
			struct dbn* y = p->parent->parent->left;
			if (y && y->color == RED) {
				p->parent->color = BLACK;
				y->color = BLACK;
				p->parent->parent->color = RED;
				p = p->parent->parent;
			} else {
				if (p == p->parent->left) {
					p = p->parent;
					db_rotate_right(p, root);
				}
				p->parent->color = BLACK;
				p->parent->parent->color = RED;
				db_rotate_left(p->parent->parent, root);
			}
		}
	}
	(*root)->color=BLACK;
}

static void db_rebalance_erase(struct dbn *z,struct dbn **root)
{
	struct dbn *y = z, *x = NULL, *x_parent = NULL;

	if (y->left == NULL)
		x = y->right;
	else if (y->right == NULL)
		x = y->left;
	else {
		y = y->right;
		while (y->left != NULL)
			y = y->left;
		x = y->right;
	}
	if (y != z) { // 嵍塃偑椉曽杽傑偭偰偄偨帪 y傪z偺埵抲偵帩偭偰偒偰z傪晜偐偣傞
		z->left->parent = y;
		y->left = z->left;
		if (y != z->right) {
			x_parent = y->parent;
			if (x) x->parent = y->parent;
			y->parent->left = x;
			y->right = z->right;
			z->right->parent = y;
		} else
			x_parent = y;
		if (*root == z)
			*root = y;
		else if (z->parent->left == z)
			z->parent->left = y;
		else
			z->parent->right = y;
		y->parent = z->parent;
		{ int tmp=y->color; y->color=z->color; z->color=tmp; }
		y = z;
	} else { // 偳偪傜偐嬻偄偰偄偨応崌 x傪z偺埵抲偵帩偭偰偒偰z傪晜偐偣傞
		x_parent = y->parent;
		if (x) x->parent = y->parent;
		if (*root == z)
			*root = x;
		else if (z->parent->left == z)
			z->parent->left = x;
		else
			z->parent->right = x;
	}
	// 偙偙傑偱怓偺堏摦偺彍偄偰捠忢偺2暘栘偲摨偠
	if (y->color != RED) { // 愒偑徚偊傞暘偵偼塭嬁柍偟
		while (x != *root && (x == NULL || x->color == BLACK))
			if (x == x_parent->left) {
				struct dbn* w = x_parent->right;
				if (w->color == RED) {
					w->color = BLACK;
					x_parent->color = RED;
					db_rotate_left(x_parent, root);
					w = x_parent->right;
				}
				if ((w->left == NULL ||
					 w->left->color == BLACK) &&
					(w->right == NULL ||
					 w->right->color == BLACK)) {
					w->color = RED;
					x = x_parent;
					x_parent = x_parent->parent;
				} else {
					if (w->right == NULL ||
						w->right->color == BLACK) {
						if (w->left) w->left->color = BLACK;
						w->color = RED;
						db_rotate_right(w, root);
						w = x_parent->right;
					}
					w->color = x_parent->color;
					x_parent->color = BLACK;
					if (w->right) w->right->color = BLACK;
					db_rotate_left(x_parent, root);
					break;
				}
			} else {                  // same as above, with right <-> left.
				struct dbn* w = x_parent->left;
				if (w->color == RED) {
					w->color = BLACK;
					x_parent->color = RED;
					db_rotate_right(x_parent, root);
					w = x_parent->left;
				}
				if ((w->right == NULL ||
					 w->right->color == BLACK) &&
					(w->left == NULL ||
					 w->left->color == BLACK)) {
					w->color = RED;
					x = x_parent;
					x_parent = x_parent->parent;
				} else {
					if (w->left == NULL ||
						w->left->color == BLACK) {
						if (w->right) w->right->color = BLACK;
						w->color = RED;
						db_rotate_left(w, root);
						w = x_parent->left;
					}
					w->color = x_parent->color;
					x_parent->color = BLACK;
					if (w->left) w->left->color = BLACK;
					db_rotate_right(x_parent, root);
					break;
				}
			}
		if (x) x->color = BLACK;
	}
}

struct dbn* db_insert(struct dbt *table,void* key,void* data)
{
	struct dbn *p,*priv;
	int c,hash;

	hash = table->hash(table,key) % HASH_SIZE;
	for(c=0,priv=NULL ,p = table->ht[hash];p;){
		c=table->cmp(table,key,p->key);
		if(c==0){ // replace
			p->data=data;
			return p;
		}
		priv=p;
		if(c<0){
			p=p->left;
		} else {
			p=p->right;
		}
	}
#ifdef MALLOC_DBN
	p=malloc_dbn();
#else
	p=calloc(sizeof(*p), 1);
#endif
	if(p==NULL){
		printf("out of memory : db_insert\n");
		return NULL;
	}
	p->parent= NULL;
	p->left  = NULL;
	p->right = NULL;
	p->key   = key;
	p->data  = data;
	p->color = RED;
	if(c==0){ // hash entry is empty
		table->ht[hash] = p;
		p->color = BLACK;
	} else {
		if(c<0){ // left node
			priv->left = p;
			p->parent=priv;
		} else { // right node
			priv->right = p;
			p->parent=priv;
		}
		if(priv->color==RED){ // must rebalance
			db_rebalance(p,&table->ht[hash]);
		}
	}
	return p;
}

void* db_erase(struct dbt *table,void* key)
{
	void *data;
	struct dbn *p;
	int c,hash;

	hash = table->hash(table,key) % HASH_SIZE;
	for(c=0,p = table->ht[hash];p;){
		c=table->cmp(table,key,p->key);
		if(c==0)
			break;
		if(c<0)
			p=p->left;
		else
			p=p->right;
	}
	if(!p)
		return NULL;
	data=p->data;
	db_rebalance_erase(p,&table->ht[hash]);
#ifdef MALLOC_DBN
	free_dbn(p);
#else
	free(p);
#endif
	return data;
}

void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...)
{
	int i,sp;
	// red-black tree側偺偱64屄stack偑偁傟偽2^32屄僲乕僪傑偱戝忎晇
	struct dbn *p,*pn,*stack[64];
	va_list ap;

	va_start(ap,func);
	for(i=0;i<HASH_SIZE;i++){
		if((p=table->ht[i])==NULL)
			continue;
		sp=0;
		while(1){
			func(p->key,p->data,ap);
			if((pn=p->left)!=NULL){
				if(p->right){
					stack[sp++]=p->right;
				}
				p=pn;
			} else {
				if(p->right){
					p=p->right;
				} else {
					if(sp==0)
						break;
					p=stack[--sp];
				}
			}
		}
	}
	va_end(ap);
}

void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...)
{
	int i,sp;
	struct dbn *p,*pn,*stack[64];
	va_list ap;

	va_start(ap,func);
	for(i=0;i<HASH_SIZE;i++){
		if((p=table->ht[i])==NULL)
			continue;
		sp=0;
		while(1){
			if(func)
				func(p->key,p->data,ap);
			if((pn=p->left)!=NULL){
				if(p->right){
					stack[sp++]=p->right;
				}
			} else {
				if(p->right){
					pn=p->right;
				} else {
					if(sp==0)
						break;
					pn=stack[--sp];
				}
			}
			free_dbn(p);
			p=pn;
		}
	}
	free(table);
	va_end(ap);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜在线一二页| 国产午夜精品一区二区三区嫩草| 国产91色综合久久免费分享| 免费亚洲电影在线| 日韩主播视频在线| 日本欧美一区二区在线观看| 日本三级亚洲精品| 国内精品写真在线观看| 国产不卡在线视频| 不卡视频一二三四| 91国偷自产一区二区三区成为亚洲经典| 成人av先锋影音| 91麻豆蜜桃一区二区三区| 日本韩国精品在线| 在线播放欧美女士性生活| 日韩欧美中文字幕精品| 欧美精品一区男女天堂| 国产精品第四页| 亚洲成人激情av| 精品一二三四在线| 成人精品视频网站| 欧美在线观看一区| 精品国产一区二区亚洲人成毛片 | 日本精品一级二级| 欧美日韩你懂得| 久久久久久**毛片大全| 国产精品日日摸夜夜摸av| 亚洲综合一二区| 久久成人麻豆午夜电影| 99久久精品费精品国产一区二区| 欧美视频一区在线| 久久精品欧美一区二区三区不卡| 一区二区三区自拍| 激情六月婷婷综合| 欧美性猛交xxxx黑人交| 精品福利一区二区三区免费视频| 亚洲天堂免费看| 久久99国内精品| 2023国产精品自拍| 中文字幕一区二区三区乱码在线 | 欧美精品一区二区三区四区| 1024成人网色www| 麻豆精品国产传媒mv男同| www.亚洲在线| 欧美成人伊人久久综合网| 亚洲女同ⅹxx女同tv| 久久国产精品色婷婷| 欧美综合一区二区| 国产亚洲成年网址在线观看| 亚洲成人自拍一区| eeuss鲁片一区二区三区| 91精品久久久久久久99蜜桃| 国产精品萝li| 国产精品一二三区在线| 欧美一区二区在线播放| 亚洲品质自拍视频| 国产成人自拍高清视频在线免费播放| 欧美日韩高清一区二区| 国产精品的网站| 成人免费视频国产在线观看| 欧美mv日韩mv国产网站app| 亚洲不卡在线观看| 色老头久久综合| 亚洲欧美影音先锋| 成人精品亚洲人成在线| 久久久久久久综合| 极品美女销魂一区二区三区免费| 欧美日韩一本到| 亚洲国产综合在线| 欧美日韩一区 二区 三区 久久精品| 中文字幕一区二区视频| 成人网在线播放| 国产精品毛片无遮挡高清| 高清视频一区二区| 国产精品动漫网站| 91香蕉国产在线观看软件| 中文字幕一区在线观看| 成av人片一区二区| 亚洲精品国产成人久久av盗摄| www.亚洲激情.com| 亚洲人吸女人奶水| 91福利视频久久久久| 亚洲一区二区精品3399| 欧美日本不卡视频| 日韩高清一区在线| 日韩一区二区三区免费看 | 欧美日韩国产高清一区| 亚洲第一av色| 日韩一区二区免费高清| 精品国产免费一区二区三区四区| 免费的国产精品| 久久精子c满五个校花| 国产成人一级电影| 国产精品嫩草影院av蜜臀| av电影天堂一区二区在线观看| 最新成人av在线| 欧美在线一区二区三区| 免费高清不卡av| 中文无字幕一区二区三区| 99re66热这里只有精品3直播 | 欧美日韩国产综合草草| 青青草原综合久久大伊人精品优势| 日韩久久精品一区| 福利一区二区在线观看| 亚洲午夜精品在线| 精品国产91亚洲一区二区三区婷婷| 国产.欧美.日韩| 亚洲国产成人av网| 久久久久国产一区二区三区四区| 日本二三区不卡| 国产在线视频一区二区三区| 亚洲婷婷在线视频| 欧美v国产在线一区二区三区| 99久久久久免费精品国产| 视频一区二区中文字幕| 国产欧美1区2区3区| 欧美精品99久久久**| 成人av网站在线观看| 日本不卡一区二区| 亚洲乱码一区二区三区在线观看| 日韩欧美电影一区| 欧美日韩在线精品一区二区三区激情| 国产一区二区三区蝌蚪| 亚洲国产精品久久人人爱蜜臀| 国产亚洲精品bt天堂精选| 在线成人小视频| 日本道免费精品一区二区三区| 黄网站免费久久| 日精品一区二区| 亚洲第四色夜色| 日韩一区日韩二区| 欧美极品美女视频| 26uuu国产一区二区三区| 欧美精品精品一区| 精品婷婷伊人一区三区三| 99久久亚洲一区二区三区青草| 国产福利一区二区| 国产一区二区电影| 九九九精品视频| 久久精品国产99| 免费观看在线综合色| 日韩电影在线观看网站| 亚洲国产一区二区在线播放| 一区二区免费看| 亚洲精品成人悠悠色影视| 中文字幕一区二区三区不卡| 国产亚洲一本大道中文在线| 欧美精品一区二区不卡 | 国产欧美日韩在线看| 欧美大片国产精品| 日韩写真欧美这视频| 91精品福利在线一区二区三区 | 91国模大尺度私拍在线视频| 成人av在线资源网| 成人的网站免费观看| 国产99精品国产| 成人三级伦理片| 99久久婷婷国产综合精品电影| 成人av电影在线播放| av在线不卡免费看| 99re视频精品| 在线观看网站黄不卡| 欧美天堂亚洲电影院在线播放| 欧美三级欧美一级| 51精品视频一区二区三区| 日韩午夜电影av| 精品国产一区二区三区av性色 | 欧美日韩mp4| 欧美一区二区视频在线观看 | 国产呦精品一区二区三区网站| 国产在线国偷精品免费看| 韩国三级中文字幕hd久久精品| 国产精品小仙女| 不卡一区二区在线| 欧美日韩国产在线播放网站| 91精品一区二区三区久久久久久| 日韩欧美的一区二区| 中文字幕在线不卡国产视频| 亚洲一区二区五区| 麻豆精品视频在线观看视频| 国产不卡免费视频| 91高清视频免费看| 欧美精品一区二区高清在线观看| 国产精品盗摄一区二区三区| 亚洲成人免费在线| 国产白丝精品91爽爽久久| 91国偷自产一区二区使用方法| 日韩一区二区三区免费观看| 国产精品毛片久久久久久久| 丝袜美腿高跟呻吟高潮一区| 国产成人高清视频| 在线不卡一区二区| 国产精品乱码人人做人人爱| 日韩电影网1区2区| 91免费看视频| 国产三级欧美三级| 性欧美疯狂xxxxbbbb| 成人黄色软件下载| 日韩精品一区二区三区蜜臀| 亚洲色图制服丝袜|