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

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

?? set.c

?? compiler
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*@A (C) 1992 Allen I. Holub                                                */

#include  <stdio.h>
#include  <ctype.h>
#include  <signal.h>
#include  <stdlib.h>
#include  <string.h>
#include  <tools/debug.h>
#include  <tools/set.h>

PUBLIC SET	*newset()
{
    /* Create a new set and return a pointer to it. Print an error message
     * and raise SIGABRT if there's insufficient memory. NULL is returned
     * if raise() returns.
     */

    SET	*p;

    if( !(p = (SET *) malloc( sizeof(SET) )) )
    {
	fprintf(stderr,"Can't get memory to create set\n");
	raise( SIGABRT );
	return NULL;		/* Usually won't get here */
    }
    memset( p, 0, sizeof(SET) );
    p->map    = p->defmap;
    p->nwords = _DEFWORDS;
    p->nbits  = _DEFBITS;
    return p;
}

/*----------------------------------------------------------------------*/

PUBLIC void	delset( set )
SET	*set;
{
    /* Delete a set created with a previous newset() call. */

    if( set->map != set->defmap )
	free( set->map );
    free( set );
}

/*----------------------------------------------------------------------*/

PUBLIC SET	*dupset( set )
SET	*set;
{
    /* Create a new set that has the same members as the input set */

    SET	  *new;

    if( !(new = (SET *) malloc( sizeof(SET) )) )
    {
	fprintf(stderr,"Can't get memory to duplicate set\n");
	exit(1);
    }

    memset( new, 0, sizeof(SET) );
    new->compl  = set->compl;
    new->nwords = set->nwords;
    new->nbits  = set->nbits;

    if( set->map == set->defmap )		   /* default bit map in use */
    {
	new->map = new->defmap;
	memcpy( new->defmap, set->defmap, _DEFWORDS * sizeof(_SETTYPE) );
    }
    else					/* bit map has been enlarged */
    {
	new->map = (_SETTYPE *) malloc( set->nwords * sizeof(_SETTYPE) );
	if( !new->map )
	{
	    fprintf(stderr,"Can't get memory to duplicate set bit map\n");
	    exit(1);
	}
	memcpy( new->map, set->map, set->nwords * sizeof(_SETTYPE) );
    }
    return new;
}

PUBLIC int	_addset( set, bit )
SET	*set;
int	bit;
{
    /* Addset is called by the ADD() macro when the set isn't big enough. It
     * expands the set to the necessary size and sets the indicated bit.
     */

    void enlarge P(( int, SET* ));		/* immediately following */

    enlarge( _ROUND(bit), set );
    return _GBIT( set, bit, |= );
}
/* ------------------------------------------------------------------- */
PRIVATE	void	enlarge( need, set )
int	need;
SET	*set;
{
    /* Enlarge the set to "need" words, filling in the extra words with zeros.
     * Print an error message and exit if there's not enough memory.
     * Since this routine calls malloc, it's rather slow and should be
     * avoided if possible.
     */

    _SETTYPE  *new;

    if( !set  ||  need <= set->nwords )
	return;

    D( printf("enlarging %d word map to %d words\n", set->nwords, need); )

    if( !(new = (_SETTYPE *) malloc( need * sizeof(_SETTYPE)))  )
    {
	fprintf(stderr, "Can't get memory to expand set\n");
	exit( 1 );
    }
    memcpy( new, set->map,        set->nwords * sizeof(_SETTYPE)          );
    memset( new + set->nwords, 0, (need - set->nwords) * sizeof(_SETTYPE) );

    if( set->map != set->defmap )
	free( set->map );

    set->map    = new  ;
    set->nwords = (unsigned char) need ;
    set->nbits  = need * _BITS_IN_WORD ;
}

PUBLIC int	num_ele( set )
SET	*set;
{
    /* Return the number of elements (nonzero bits) in the set. NULL sets are
     * considered empty. The table-lookup approach used here was suggested to
     * me by Doug Merrit. Nbits[] is indexed by any number in the range 0-255,
     * and it evaluates to the number of bits in the number.
     */
    static unsigned char nbits[] =
    {
	/*   0-15  */	0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
	/*  16-31  */	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
	/*  32-47  */	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
	/*  48-63  */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/*  64-79  */	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
	/*  80-95  */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/*  96-111 */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/* 112-127 */	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
	/* 128-143 */	1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
	/* 144-159 */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/* 160-175 */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/* 176-191 */	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
	/* 192-207 */	2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
	/* 208-223 */	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
	/* 224-239 */	3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
	/* 240-255 */	4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
    };
    int			i;
    unsigned int 	count = 0;
    unsigned char	*p;

    if( !set )
	return 0;

    p = (unsigned char *)set->map ;

    for( i = _BYTES_IN_ARRAY(set->nwords) ; --i >= 0 ; )
	count += nbits[ *p++ ] ;

    return count;
}

/* ------------------------------------------------------------------- */

PUBLIC int	_set_test( set1, set2 )
SET	*set1, *set2;
{
    /* Compares two sets. Returns as follows:
     *
     * _SET_EQUIV	Sets are equivalent
     * _SET_INTER	Sets intersect but aren't equivalent
     * _SET_DISJ	Sets are disjoint
     *
     * The smaller set is made larger if the two sets are different sizes.
     */

    int	  	i, rval = _SET_EQUIV ;
    _SETTYPE   *p1, *p2;

    i = max( set1->nwords, set2->nwords);

    enlarge( i, set1 );		/* Make the sets the same size	*/
    enlarge( i, set2 );

    p1 = set1->map;
    p2 = set2->map;

    for(; --i >= 0 ; p1++, p2++ )
    {
	if( *p1 != *p2 )
	{
	    /* You get here if the sets aren't equivalent. You can return
	     * immediately if the sets intersect but have to keep going in the
	     * case of disjoint sets (because the sets might actually intersect
	     * at some byte, as yet unseen).
	     */

	    if( *p1 & *p2 )
		return _SET_INTER ;
	    else
		rval = _SET_DISJ ;
	}
    }

    return rval;			/* They're equivalent	*/
}

/* ------------------------------------------------------------------- */

PUBLIC int setcmp( set1, set2 )
SET *set1, *set2;
{
    /* Yet another comparison function. This one works like strcmp(),
     * returning 0 if the sets are equivalent, <0 if set1<set2 and >0 if
     * set1>set2. A NULL set is less than any other set, two NULL sets
     * are equivalent.
     */

    int	  i, j;
    _SETTYPE   *p1, *p2;

    D( if( !set1 ) fprintf(stderr, "setcmp(): set1 is NULL\n" ); )
    D( if( !set2 ) fprintf(stderr, "setcmp(): set2 is NULL\n" ); )

    if(  set1 ==  set2 ){ return  0; }
    if(  set1 && !set2 ){ return  1; }
    if( !set1 &&  set2 ){ return -1; }

    i = j = min( set1->nwords, set2->nwords );

    for( p1 = set1->map, p2 = set2->map ; --j >= 0 ;  p1++, p2++  )
	if( *p1 != *p2 )
	    return *p1 - *p2;

    /* You get here only if all words that exist in both sets are the same.
     * Check the tail end of the larger array for all zeros.
     */

    if( (j = set1->nwords - i) > 0 )		/* Set 1 is the larger */
    {
	while( --j >= 0 )
	    if( *p1++ )
		return 1;
    }
    else if( (j = set2->nwords - i) > 0)	/* Set 2 is the larger */
    {
	while( --j >= 0 )
	    if( *p2++ )
		return -1;
    }

    return 0;					/* They're equivalent	*/
}

/* ------------------------------------------------------------------- */

PUBLIC unsigned sethash( set1 )
SET *set1;
{
    /* hash the set by summing together the words in the bit map */

    _SETTYPE    *p;
    unsigned	total;
    int		j;

    total = 0;
    j     = set1->nwords ;
    p     = set1->map    ;

    while( --j >= 0 )
	total += *p++ ;

    return total;
}

/* ------------------------------------------------------------------- */

PUBLIC int	subset( set, possible_subset )
SET	*set, *possible_subset;
{
    /* Return 1 if "possible_subset" is a subset of "set". One is returned if
     * it's a subset, zero otherwise. Empty sets are subsets of everything.
     * The routine silently malfunctions if given a NULL set, however. If the
     * "possible_subset" is larger than the "set", then the extra bytes must
     * be all zeros.
     */

    _SETTYPE  *subsetp, *setp;
    int	  common;		/* This many bytes in potential subset  */
    int	  tail;			/* This many implied 0 bytes in b	*/

    if( possible_subset->nwords > set->nwords )
    {
	common = set->nwords ;
	tail   = possible_subset->nwords - common ;
    }
    else
    {
	common = possible_subset->nwords;
	tail   = 0;
    }

    subsetp = possible_subset->map;
    setp    = set->map;

    for(; --common >= 0; subsetp++, setp++ )
	if( (*subsetp & *setp) != *subsetp )
	    return 0;

    while( --tail >= 0 )
	if( *subsetp++ )
	    return 0;

    return 1;
}

PUBLIC void	_set_op( op, dest, src )
int	op;
SET	*src, *dest;
{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产又黄又大久久| 国产精品国产三级国产aⅴ入口| 亚洲另类春色国产| 在线一区二区三区| 亚洲午夜免费福利视频| 欧美高清性hdvideosex| 激情小说亚洲一区| 国产女人aaa级久久久级| 99久久99久久久精品齐齐| 亚洲精品一二三区| 欧美年轻男男videosbes| 奇米四色…亚洲| 国产亚洲一二三区| 91视频国产资源| 日韩va亚洲va欧美va久久| 日韩精品一区二区三区swag| 懂色av一区二区三区免费观看| 国产精品久久夜| 欧美日韩久久一区二区| 久久成人精品无人区| 国产精品高潮呻吟| 欧美美女激情18p| 国产精品资源在线看| 亚洲品质自拍视频| 欧美一区二区观看视频| 粉嫩高潮美女一区二区三区| 亚洲一区二区在线视频| 亚洲精品一区二区三区在线观看| 不卡av在线网| 麻豆久久久久久| 亚洲欧美视频在线观看| 精品理论电影在线| 色婷婷av一区二区| 国产一区二区不卡在线| 亚洲影院理伦片| 国产女同性恋一区二区| 欧美一区二区三级| 色94色欧美sute亚洲线路二| 久草中文综合在线| 亚洲午夜一二三区视频| 国产婷婷色一区二区三区四区| 欧美日韩亚洲另类| av欧美精品.com| 国内成+人亚洲+欧美+综合在线| 一区二区三区在线看| 欧美国产在线观看| 精品国产乱码久久久久久老虎| 在线视频你懂得一区二区三区| 国产成人亚洲综合a∨猫咪| 青草av.久久免费一区| 亚洲激情中文1区| 中文字幕第一区| 久久丝袜美腿综合| 日韩欧美123| 91精品国产综合久久香蕉麻豆| 91一区二区在线| 粉嫩aⅴ一区二区三区四区| 麻豆成人免费电影| 日韩制服丝袜av| 亚洲国产wwwccc36天堂| 亚洲免费观看高清完整版在线 | 亚洲在线视频一区| 国产精品久线观看视频| 国产性天天综合网| 亚洲精品一区二区精华| 日韩一级片网址| 日韩视频在线观看一区二区| 欧美日韩国产综合一区二区| 日本韩国一区二区三区| 色综合一区二区| 91精品一区二区三区在线观看| 色婷婷av一区二区三区之一色屋| 国产成人av资源| 国产馆精品极品| 国产成人免费视频网站| 国产成人在线影院| 粉嫩aⅴ一区二区三区四区五区 | 亚洲一二三四久久| 亚洲精品成人在线| 亚洲精品日韩专区silk| 亚洲精品久久久久久国产精华液| 亚洲婷婷在线视频| 一区二区三区在线免费观看| 亚洲精品中文在线| 午夜精品久久久久影视| 日韩成人免费电影| 精品一区二区免费看| 国产精品自产自拍| 波多野结衣中文一区| 色婷婷狠狠综合| 欧美日韩电影在线| 91精品国产欧美日韩| 精品嫩草影院久久| 国产视频在线观看一区二区三区| 国产精品久久毛片av大全日韩| 自拍偷拍国产亚洲| 午夜精品久久久久久久久| 免费人成在线不卡| 国产精品乡下勾搭老头1| 99精品热视频| 欧美日韩国产bt| 久久久久国色av免费看影院| 国产精品久久久久影院| 亚洲精品免费在线| 日韩成人伦理电影在线观看| 国产综合久久久久影院| 99re6这里只有精品视频在线观看| 色系网站成人免费| 91精品国产91综合久久蜜臀| 国产色产综合产在线视频 | 亚洲伊人伊色伊影伊综合网| 午夜久久久久久电影| 韩国v欧美v日本v亚洲v| 91亚洲精品久久久蜜桃网站| 91麻豆精品国产综合久久久久久| 国产欧美综合在线观看第十页 | 久久看人人爽人人| 亚洲天堂免费看| 蜜臂av日日欢夜夜爽一区| 粉嫩嫩av羞羞动漫久久久 | 国产亚洲一二三区| 亚洲一区二区在线观看视频| 国产在线一区二区综合免费视频| 色综合久久88色综合天天免费| 日韩女优av电影在线观看| 亚洲色图视频网站| 狠狠色丁香婷婷综合| 色狠狠色噜噜噜综合网| 久久久久久9999| 性久久久久久久久久久久| 福利电影一区二区| 欧美一区二区三区成人| 一区二区三区在线免费| 国产99一区视频免费| 91精品国产综合久久精品麻豆| 亚洲婷婷国产精品电影人久久| 久久精品久久99精品久久| 欧美在线999| 国产精品夫妻自拍| 精品一区二区综合| 69堂成人精品免费视频| 依依成人综合视频| 成人免费黄色在线| 久久这里都是精品| 另类成人小视频在线| 欧美三级资源在线| 亚洲欧美日韩一区二区三区在线观看| 六月丁香婷婷色狠狠久久| 欧美美女激情18p| 一区二区三区在线观看国产| 成人av在线资源网| 国产亚洲一本大道中文在线| 久久不见久久见中文字幕免费| 欧美色综合天天久久综合精品| 国产精品情趣视频| 成人性生交大合| 国产亚洲美州欧州综合国| 韩国三级中文字幕hd久久精品| 欧美久久久久久久久中文字幕| 亚洲免费在线视频| 91蝌蚪porny九色| 成人欧美一区二区三区小说| 成人网页在线观看| 欧美国产精品一区二区| 成人永久免费视频| 国产精品久久久久婷婷二区次| 国产精品1区2区| 国产日韩亚洲欧美综合| 国产v日产∨综合v精品视频| 久久久另类综合| 顶级嫩模精品视频在线看| 中文字幕 久热精品 视频在线| 成人夜色视频网站在线观看| 国产精品久久久一区麻豆最新章节| 国产成都精品91一区二区三| 欧美激情一区二区在线| 波多野结衣中文字幕一区 | 欧洲一区在线观看| 伊人婷婷欧美激情| 欧美三级欧美一级| 日韩精品乱码av一区二区| 日韩一区二区三| 韩国在线一区二区| 国产精品久线在线观看| 色综合天天综合在线视频| 亚洲一区二区五区| 666欧美在线视频| 国内精品免费**视频| 中文子幕无线码一区tr| 欧美在线影院一区二区| 丝袜美腿成人在线| 亚洲影视资源网| 欧美一区二区在线播放| 国产一区二区三区蝌蚪| 亚洲欧洲国产专区| 91精品在线观看入口| 高清国产午夜精品久久久久久| 亚洲精品ww久久久久久p站| 日韩一区二区在线播放| proumb性欧美在线观看|