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

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

?? set.c

?? <<c語言接口與實現>>一書源碼,此書無疑是一部經典的c語言書籍,只可惜翻譯的質量很差
?? C
字號:
static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/set.doc,v 1.11 1996/06/26 23:02:01 drh Exp $";
#include <limits.h>
#include <stddef.h>
#include "mem.h"
#include "assert.h"
#include "arith.h"
#include "set.h"
#define T Set_T
struct T {
	int length;
	unsigned timestamp;
	int (*cmp)(const void *x, const void *y);
	unsigned (*hash)(const void *x);
	int size;
	struct member {
		struct member *link;
		const void *member;
	} **buckets;
};
static int cmpatom(const void *x, const void *y) {
	return x != y;
}
static unsigned hashatom(const void *x) {
	return (unsigned long)x>>2;
}
static T copy(T t, int hint) {
	T set;
	assert(t);
	set = Set_new(hint, t->cmp, t->hash);
	{ int i;
	  struct member *q;
	  for (i = 0; i < t->size; i++)
	  	for (q = t->buckets[i]; q; q = q->link)
		{
			struct member *p;
			const void *member = q->member;
			int i = (*set->hash)(member)%set->size;
			NEW(p);
			p->member = member;
			p->link = set->buckets[i];
			set->buckets[i] = p;
			set->length++;
		}
	}
	return set;
}
T Set_new(int hint,
	int cmp(const void *x, const void *y),
	unsigned hash(const void *x)) {
	T set;
	int i;
	static int primes[] = { 509, 509, 1021, 2053, 4093,
		8191, 16381, 32771, 65521, INT_MAX };
	assert(hint >= 0);
	for (i = 1; primes[i] < hint; i++)
		;
	set = ALLOC(sizeof (*set) +
		primes[i-1]*sizeof (set->buckets[0]));
	set->size = primes[i-1];
	set->cmp  = cmp  ?  cmp : cmpatom;
	set->hash = hash ? hash : hashatom;
	set->buckets = (struct member **)(set + 1);
	for (i = 0; i < set->size; i++)
		set->buckets[i] = NULL;
	set->length = 0;
	set->timestamp = 0;
	return set;
}
int Set_member(T set, const void *member) {
	int i;
	struct member *p;
	assert(set);
	assert(member);
	i = (*set->hash)(member)%set->size;
	for (p = set->buckets[i]; p; p = p->link)
		if ((*set->cmp)(member, p->member) == 0)
			break;
	return p != NULL;
}
void Set_put(T set, const void *member) {
	int i;
	struct member *p;
	assert(set);
	assert(member);
	i = (*set->hash)(member)%set->size;
	for (p = set->buckets[i]; p; p = p->link)
		if ((*set->cmp)(member, p->member) == 0)
			break;
	if (p == NULL) {
		NEW(p);
		p->member = member;
		p->link = set->buckets[i];
		set->buckets[i] = p;
		set->length++;
	} else
		p->member = member;
	set->timestamp++;
}
void *Set_remove(T set, const void *member) {
	int i;
	struct member **pp;
	assert(set);
	assert(member);
	set->timestamp++;
	i = (*set->hash)(member)%set->size;
	for (pp = &set->buckets[i]; *pp; pp = &(*pp)->link)
		if ((*set->cmp)(member, (*pp)->member) == 0) {
			struct member *p = *pp;
			*pp = p->link;
			member = p->member;
			FREE(p);
			set->length--;
			return (void *)member;
		}
	return NULL;
}
int Set_length(T set) {
	assert(set);
	return set->length;
}
void Set_free(T *set) {
	assert(set && *set);
	if ((*set)->length > 0) {
		int i;
		struct member *p, *q;
		for (i = 0; i < (*set)->size; i++)
			for (p = (*set)->buckets[i]; p; p = q) {
				q = p->link;
				FREE(p);
			}
	}
	FREE(*set);
}
void Set_map(T set,
	void apply(const void *member, void *cl), void *cl) {
	int i;
	unsigned stamp;
	struct member *p;
	assert(set);
	assert(apply);
	stamp = set->timestamp;
	for (i = 0; i < set->size; i++)
		for (p = set->buckets[i]; p; p = p->link) {
			apply(p->member, cl);
			assert(set->timestamp == stamp);
		}
}
void **Set_toArray(T set, void *end) {
	int i, j = 0;
	void **array;
	struct member *p;
	assert(set);
	array = ALLOC((set->length + 1)*sizeof (*array));
	for (i = 0; i < set->size; i++)
		for (p = set->buckets[i]; p; p = p->link)
			array[j++] = (void *)p->member;
	array[j] = end;
	return array;
}
T Set_union(T s, T t) {
	if (s == NULL) {
		assert(t);
		return copy(t, t->size);
	} else if (t == NULL)
		return copy(s, s->size);
	else {
		T set = copy(s, Arith_max(s->size, t->size));
		assert(s->cmp == t->cmp && s->hash == t->hash);
		{ int i;
		  struct member *q;
		  for (i = 0; i < t->size; i++)
		  	for (q = t->buckets[i]; q; q = q->link)
			Set_put(set, q->member);
		}
		return set;
	}
}
T Set_inter(T s, T t) {
	if (s == NULL) {
		assert(t);
		return Set_new(t->size, t->cmp, t->hash);
	} else if (t == NULL)
		return Set_new(s->size, s->cmp, s->hash);
	else if (s->length < t->length)
		return Set_inter(t, s);
	else {
		T set = Set_new(Arith_min(s->size, t->size),
			s->cmp, s->hash);
		assert(s->cmp == t->cmp && s->hash == t->hash);
		{ int i;
		  struct member *q;
		  for (i = 0; i < t->size; i++)
		  	for (q = t->buckets[i]; q; q = q->link)
			if (Set_member(s, q->member))
				{
					struct member *p;
					const void *member = q->member;
					int i = (*set->hash)(member)%set->size;
					NEW(p);
					p->member = member;
					p->link = set->buckets[i];
					set->buckets[i] = p;
					set->length++;
				}
		}
		return set;
	}
}
T Set_minus(T t, T s) {
	if (t == NULL){
		assert(s);
		return Set_new(s->size, s->cmp, s->hash);
	} else if (s == NULL)
		return copy(t, t->size);
	else {
		T set = Set_new(Arith_min(s->size, t->size),
			s->cmp, s->hash);
		assert(s->cmp == t->cmp && s->hash == t->hash);
		{ int i;
		  struct member *q;
		  for (i = 0; i < t->size; i++)
		  	for (q = t->buckets[i]; q; q = q->link)
			if (!Set_member(s, q->member))
				{
					struct member *p;
					const void *member = q->member;
					int i = (*set->hash)(member)%set->size;
					NEW(p);
					p->member = member;
					p->link = set->buckets[i];
					set->buckets[i] = p;
					set->length++;
				}
		}
		return set;
	}
}
T Set_diff(T s, T t) {
	if (s == NULL) {
		assert(t);
		return copy(t, t->size);
	} else if (t == NULL)
		return copy(s, s->size);
	else {
		T set = Set_new(Arith_min(s->size, t->size),
			s->cmp, s->hash);
		assert(s->cmp == t->cmp && s->hash == t->hash);
		{ int i;
		  struct member *q;
		  for (i = 0; i < t->size; i++)
		  	for (q = t->buckets[i]; q; q = q->link)
			if (!Set_member(s, q->member))
				{
					struct member *p;
					const void *member = q->member;
					int i = (*set->hash)(member)%set->size;
					NEW(p);
					p->member = member;
					p->link = set->buckets[i];
					set->buckets[i] = p;
					set->length++;
				}
		}
		{ T u = t; t = s; s = u; }
		{ int i;
		  struct member *q;
		  for (i = 0; i < t->size; i++)
		  	for (q = t->buckets[i]; q; q = q->link)
			if (!Set_member(s, q->member))
				{
					struct member *p;
					const void *member = q->member;
					int i = (*set->hash)(member)%set->size;
					NEW(p);
					p->member = member;
					p->link = set->buckets[i];
					set->buckets[i] = p;
					set->length++;
				}
		}
		return set;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕日韩一区二区| 国产精品久久久爽爽爽麻豆色哟哟 | 懂色av一区二区三区免费看| 欧美亚洲图片小说| 亚洲图片自拍偷拍| 欧美区一区二区三区| 亚洲成人你懂的| 在线不卡的av| 久久成人av少妇免费| 欧美成人官网二区| 国产一区二区三区黄视频| 久久视频一区二区| 99精品热视频| 亚洲.国产.中文慕字在线| 欧美一区国产二区| 久久91精品国产91久久小草| 国产亚洲欧美激情| 色婷婷综合五月| 日韩黄色免费网站| 国产午夜精品久久久久久久| av亚洲精华国产精华精华 | 国产精品成人免费| 欧美色图在线观看| 国产精品影视在线观看| 亚洲天堂久久久久久久| 欧美一卡二卡在线| 99久久婷婷国产精品综合| 日精品一区二区三区| 国产欧美日韩精品在线| 在线欧美一区二区| 久国产精品韩国三级视频| 亚洲欧美日韩国产综合| 日韩欧美另类在线| 色欧美片视频在线观看在线视频| 五月天一区二区三区| 亚洲欧美一区二区在线观看| 日韩精品一区二区三区视频| 91亚洲永久精品| eeuss鲁一区二区三区| 精品一区二区国语对白| 午夜av一区二区三区| 一区二区在线观看av| 亚洲国产精品t66y| 欧美日韩精品三区| 99精品视频一区二区三区| 国产成人亚洲综合a∨婷婷图片| 午夜av一区二区| 午夜电影网亚洲视频| 亚洲一区二区在线视频| 国产精品免费免费| 国产欧美视频一区二区| 日韩精品中文字幕在线一区| 精品日韩av一区二区| 精品欧美乱码久久久久久| 精品va天堂亚洲国产| 欧美精品在线观看一区二区| 国内精品久久久久影院色| 亚洲欧美日韩国产一区二区三区| 久久精品一区二区三区四区 | 国内精品伊人久久久久av一坑| 亚洲自拍偷拍欧美| 爽好多水快深点欧美视频| 日日夜夜精品视频天天综合网| 午夜精品一区二区三区电影天堂| 日韩国产欧美在线视频| 日日夜夜免费精品| 国产精品996| 在线视频国内一区二区| 欧美成人a视频| 1000精品久久久久久久久| 亚洲h动漫在线| 国产高清亚洲一区| 精品视频在线免费观看| 欧美精品一区二区蜜臀亚洲| 亚洲私人黄色宅男| 久久99国产精品免费| 91国产精品成人| 日韩视频免费直播| 中文字幕一区二区三区四区不卡| 视频一区国产视频| 99久久久久免费精品国产| 日韩一级片网址| 亚洲国产视频网站| 99久久777色| 国产欧美一区二区精品秋霞影院| 亚洲一区二区3| 成人免费视频视频| 久久精品视频一区二区三区| 午夜久久久久久久久| 色婷婷久久一区二区三区麻豆| 精品福利一二区| 视频一区二区欧美| 欧美丰满美乳xxx高潮www| 中文字幕一区在线观看视频| 国产成人午夜电影网| 欧美第一区第二区| 男女性色大片免费观看一区二区 | 亚洲福利一二三区| 91福利在线观看| 亚洲va韩国va欧美va精品| 欧美三片在线视频观看| 亚洲综合一二区| 欧美人妇做爰xxxⅹ性高电影| 一区二区三区自拍| 欧美亚洲动漫制服丝袜| 亚洲综合在线电影| 欧美综合色免费| 蜜臀久久久99精品久久久久久| 欧美精品 日韩| 国产一区二区久久| 国产精品家庭影院| 欧美在线啊v一区| 青娱乐精品在线视频| 欧美一级片在线| 国产成人免费视频精品含羞草妖精| 久久久久国色av免费看影院| 从欧美一区二区三区| 亚洲国产视频一区二区| 日韩一区二区三区视频在线 | 亚洲成国产人片在线观看| 日韩一区二区免费在线电影| 国产精品99久久久久久似苏梦涵 | 夜夜爽夜夜爽精品视频| 日韩一区二区三区免费观看| 成人黄色综合网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产情人综合久久777777| 国产精品蜜臀av| 国产麻豆精品久久一二三| 久久女同互慰一区二区三区| 91久久精品一区二区三区| 精品一区二区三区在线播放| 一区二区三区高清在线| 久久精品人人做人人综合| 欧美精品vⅰdeose4hd| 91在线一区二区三区| 国产精品亚洲第一| 日本亚洲免费观看| 亚洲福利一区二区三区| 亚洲女同女同女同女同女同69| 精品动漫一区二区三区在线观看| 91原创在线视频| www.色综合.com| 丁香桃色午夜亚洲一区二区三区 | 欧美va亚洲va国产综合| 9191久久久久久久久久久| 在线中文字幕不卡| 欧洲av一区二区嗯嗯嗯啊| 91性感美女视频| 欧美少妇xxx| 91精品国产色综合久久| 日韩三区在线观看| 精品国产乱码久久| 国产亚洲美州欧州综合国| 国产欧美一区二区精品性色| 中文字幕av一区二区三区高 | 波多野结衣在线aⅴ中文字幕不卡| 国内成人精品2018免费看| 国产精品小仙女| 91麻豆蜜桃一区二区三区| 91福利在线导航| 日韩视频在线永久播放| 久久精品在这里| 一区二区三区在线视频播放| 亚洲国产综合色| 国产一区在线观看麻豆| 成人h动漫精品一区二区| 欧美日韩性生活| 久久精品一区二区三区不卡 | 日日夜夜精品视频免费| 国产精品自在在线| 色婷婷av一区二区三区gif| 欧美一区二区三区四区五区| 欧美激情中文字幕一区二区| 亚洲成人免费看| 成人午夜视频在线| 日韩久久精品一区| 亚洲一区二区三区四区在线 | 亚洲免费在线视频一区 二区| 偷拍日韩校园综合在线| av亚洲精华国产精华精华 | 久久久亚洲国产美女国产盗摄| 夜夜嗨av一区二区三区四季av| 国产成人午夜99999| 91精品黄色片免费大全| 亚洲精品国产a久久久久久| 国产在线一区观看| 欧美精品一区二区三区高清aⅴ| 亚洲午夜电影在线观看| 91麻豆免费观看| 尤物在线观看一区| 99re在线精品| 亚洲三级理论片| 91麻豆免费观看| 亚洲精品成人悠悠色影视| 99久久精品免费看| 亚洲视频一区二区在线观看| 久久超碰97人人做人人爱| 欧美日韩亚洲高清一区二区| 一区二区三区丝袜|