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

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

?? hashlist.c

?? 《多任務下的數據結構》隨書的源代碼。探討多任務下的常用數據結構的實現
?? C
字號:
/*
 * Copyright (c) 2000-2008
 * Author: Weiming Zhou
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.  
 */

#include <stdlib.h>
#include "CapiGlobal.h"
#include "HashList.h"


/**	哈希鏈表的創建函數

	@param	UINT uBucketCount - 索引表的大小	
	@return	HASHLIST * - 成功返回哈希表的指針,失敗返回NULL	
*/
HASHLIST *HashList_Create(UINT uBucketCount)
{
    HASHLIST    *pHashList;

    /* 假設uBucketCount最小值不能低于MINIUM_BUCKET_COUNT */
    if ( uBucketCount < MINIUM_BUCKET_COUNT )
    {
        uBucketCount = MINIUM_BUCKET_COUNT;
    }

    pHashList = (HASHLIST *)malloc(sizeof(HASHLIST));
    if ( pHashList != NULL)
    {
        /* 創建哈希鏈表里的哈希表的索引表并初始化哈希表 */
        pHashList->ppBuckets = (HASHLISTNODE **)malloc(uBucketCount 
            * sizeof(HASHLISTNODE *));
        if ( pHashList->ppBuckets == NULL )
        {
            free(pHashList);
            return NULL;
        }
        memset((void *)pHashList->ppBuckets, 0, 
            uBucketCount * sizeof(HASHLISTNODE *));

        /* 初始化哈希表里面的雙向鏈表 */
        pHashList->pHead = NULL;
        pHashList->pTail = NULL;
        pHashList->uBucketCount = uBucketCount;
        pHashList->uNodeCount = 0;
    }

    return pHashList;
}


/**	哈希鏈表的釋放函數

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param  DESTROYFUNC DestroyFunc - 數據釋放回調函數	
	@return	void - 無	
*/
void HashList_Destroy(HASHLIST *pHashList, 
                      DESTROYFUNC DestroyFunc )
{
    UINT uIndex;
    if ( pHashList == NULL )
    {
        return;
    }

    for ( uIndex = 0; uIndex < pHashList->uBucketCount; uIndex++ )
    {
        HASHLISTNODE    *pNode;
        pNode = pHashList->ppBuckets[uIndex];
        while ( pNode != NULL )
        {
            HASHLISTNODE *pNodeToFree;

            pNodeToFree = pNode;
            pNode = pNode->pBucketNext;
            if ( DestroyFunc != NULL && pNodeToFree->pData != NULL )
            {
                (*DestroyFunc)(pNodeToFree->pData);
            }

            free(pNodeToFree);
        }
    }

    free(pHashList->ppBuckets);
    free(pHashList);

    return;
}


/**	哈希鏈表的數據插入函數,同時插入到哈希表和鏈表中,
    插入鏈表時是插入在鏈表的頭部

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param	void *pData - 要插入的數據指針	
	@param	HASHFUNC HashFunc - 哈希函數	
	@return	INT - CAPI_FAILED表示失敗,CAPI_SUCCESS表示成功	
*/
INT HashList_InsertHead(HASHLIST *pHashList, void *pData, HASHFUNC HashFunc)
{
    HASHLISTNODE    *pNode;
    UINT            uBucketIndex;

    if ( pHashList == NULL || pData == NULL )
    {
        return CAPI_FAILED;
    }

    /* 生成哈希鏈表的節點 */
    pNode = (HASHLISTNODE *)malloc(sizeof(HASHLISTNODE));
    if ( pNode == NULL )
    {
        return CAPI_FAILED;
    }
    pNode->pData = pData;
    pNode->pBucketNext = NULL;
    pNode->pListPrev = NULL;
    pNode->pListNext = pHashList->pHead;

    /* 插入到哈希表中 */
    uBucketIndex = (*HashFunc)(pData, pHashList->uBucketCount);

    if ( pHashList->ppBuckets[uBucketIndex] == NULL )
    {
        pHashList->ppBuckets[uBucketIndex] = pNode;
    }
    else
    {
        HASHLISTNODE    *pTempNode;
        pTempNode = pHashList->ppBuckets[uBucketIndex];
        while ( pTempNode->pBucketNext != NULL )
        {
            pTempNode = pTempNode->pBucketNext;
        }
        pTempNode->pBucketNext = pNode;
    }

    /* 插入到鏈表中 */
    if ( pHashList->pHead == NULL )
    {
        pHashList->pHead = pNode;
        pHashList->pTail = pNode;
    }
    else
    {
        pNode->pListNext = pHashList->pHead;
        pHashList->pHead->pListPrev = pNode;
        pHashList->pHead = pNode;
    }

    pHashList->uNodeCount += 1;

    return CAPI_SUCCESS;
}


/**	哈希鏈表的單個節點刪除函數,要同時從哈希表和鏈表中刪除

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param  void           *pData - 數據指針	
	@param  HASHFUNC        HashFunc - 哈希函數	
	@param  COMPAREFUNC     CompareFunc - 數據比較函數	
	@param  DESTROYFUNC     DestroyFunc - 數據釋放函數	
	@return	INT - CAPI_FAILED表示失敗,CAPI_SUCCESS表示成功		
*/
INT HashList_Delete(HASHLIST *pHashList, 
                    void           *pData,
                    HASHFUNC        HashFunc,
                    COMPAREFUNC     CompareFunc, 
                    DESTROYFUNC     DestroyFunc)
{
    HASHLISTNODE    *pNode;
    HASHLISTNODE    *pPrevNode;
    UINT            uIndex;

    if ( pHashList == NULL || HashFunc == NULL 
        || CompareFunc == NULL )
    {
        return CAPI_FAILED;
    }

    uIndex = (*HashFunc)(pData, pHashList->uBucketCount);
    pNode = pHashList->ppBuckets[uIndex];
    pPrevNode = NULL;

    while ( pNode != NULL )
    {
        if ( (*CompareFunc)(pNode->pData, pData ) == 0 )
        {
            if (pPrevNode == NULL )
            {
                pHashList->ppBuckets[uIndex] = pNode->pBucketNext;
            }
            else
            {
                pPrevNode->pBucketNext = pNode->pBucketNext;
            }

            /* 從鏈表中刪除節點 */
            if ( pNode->pListPrev != NULL )
            {
                pNode->pListPrev->pListNext = pNode->pListNext;
            }
            else
            {
                /* pNode 是鏈表頭指針 */
                pHashList->pHead = pNode->pListNext;
            }

            if ( pNode->pListNext != NULL )
            {
                pNode->pListNext->pListPrev = pNode->pListPrev;
            }
            else
            {
                /* 現在在鏈表尾部 */
                pHashList->pTail = pNode;
            }

            if ( pNode->pData != NULL && DestroyFunc != NULL )
            {
                (*DestroyFunc)(pNode->pData);
            }

            free(pNode);

            pHashList->uNodeCount -= 1;

            return CAPI_SUCCESS;
        }
        pPrevNode = pNode;
        pNode = pNode->pBucketNext;
    }

    return CAPI_FAILED;
}


/**	哈希鏈表的查找節點函數

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param	void *pData - 要查找的數據指針	
	@param	HASHFUNC HashFunc - 哈希函數	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	HASHLISTNODE * - 成功返回查找到的哈希鏈表節點指針,
                             失敗返回NULL	
*/
HASHLISTNODE *HashList_FindNode(HASHLIST *pHashList, 
                                void *pData, 
                                HASHFUNC HashFunc, 
                                COMPAREFUNC CompareFunc)
{
    HASHLISTNODE    *pNode;
    UINT            uIndex;

    if ( pHashList == NULL || HashFunc == NULL 
        || CompareFunc == NULL )
    {
        return NULL;
    }

    uIndex = (*HashFunc)(pData, pHashList->uBucketCount);
    pNode = pHashList->ppBuckets[uIndex];

    /* try to find the key from the HashTable */
    while ( pNode != NULL )
    {
        if ( (*CompareFunc)(pNode->pData, pData) == 0 )
        {
            /* 發現匹配的節點,返回節點指針 */
            return pNode;
        }
        pNode = pNode->pBucketNext;
    }

    /* 沒有找到的情況下,返回NULL */
    return NULL;
}

 
/**	哈希鏈表的查找數據函數

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param	void *pData - 要查找的數據指針	
	@param	HASHFUNC HashFunc - 哈希函數	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	void * - 成功返回查找到的數據指針,失敗返回NULL	
*/
void *HashList_FindData(HASHLIST *pHashList, 
                        void *pData, 
                        HASHFUNC HashFunc, 
                        COMPAREFUNC CompareFunc)
{
    HASHLISTNODE    *pNode;
    UINT            uIndex;

    if ( pHashList == NULL || HashFunc == NULL 
        || CompareFunc == NULL )
    {
        return NULL;
    }

    uIndex = (*HashFunc)(pData, pHashList->uBucketCount);
    pNode = pHashList->ppBuckets[uIndex];

    /* try to find the key from the HashTable */
    while ( pNode != NULL )
    {
        if ( (*CompareFunc)(pNode->pData, pData) == 0 )
        {
            /* 發現匹配的節點,返回節點指針 */
            return pNode->pData;
        }
        pNode = pNode->pBucketNext;
    }

    /* 沒有找到的情況下,返回NULL */
    return NULL;
}


/**	哈希鏈表的插入排序函數,用插入排序算法對哈希鏈表里的鏈表進行排序

	@param	HASHLIST *pHashList - 哈希鏈表指針	
	@param	COMPAREFUNC CompareFunc - 數據比較函數	
	@return	INT - CAPI_FAILED表示失敗,CAPI_SUCCESS表示成功 	
*/
INT HashList_InsertSort(HASHLIST *pHashList, COMPAREFUNC CompareFunc)
{
    HASHLISTNODE	*pNode;

    if ( pHashList == NULL || CompareFunc == NULL )
    {
        return 0;
    }

    pNode = pHashList->pHead;
    if ( pNode == NULL )
    {
		/* 沒有節點在鏈表中,把它當作已經排好了序 */
		return 1;
    }

    while ( pNode->pListNext != NULL )
    {
		if ( (*CompareFunc)( pNode->pListNext->pData, pNode->pData ) < 0 )
		{
			HASHLISTNODE	*pTempNode;
			pTempNode = pNode->pListPrev;
			while ( pTempNode != NULL )
			{
				if ( (*CompareFunc)( pNode->pListNext->pData, 
                    pTempNode->pData ) >= 0 )
				{
                    HASHLISTNODE    *pCurNode;

                    /* 將節點彈出來 */
                    pCurNode = pNode->pListNext;
                    pNode->pListNext = pNode->pListNext->pListNext;
                    if ( pCurNode->pListNext != NULL )
                    {
                        pCurNode->pListNext->pListPrev = pNode;
                    }

                    /* 將節點插入到對應位置上 */
                    pCurNode->pListNext = pTempNode->pListNext;
                    pCurNode->pListPrev = pTempNode;
                    pTempNode->pListNext->pListPrev = pCurNode;
                    pTempNode->pListNext = pCurNode;
					
					break;
				}
				pTempNode = pTempNode->pListPrev;
			}

			/* 如果所有數據都大于該節點數據,將該節點插入到鏈表頭部 */
			if ( pTempNode == NULL )
			{
                HASHLISTNODE    *pCurNode;

                /* 將節點彈出來 */
                pCurNode = pNode->pListNext;
                pNode->pListNext = pNode->pListNext->pListNext;
                if ( pCurNode->pListNext != NULL )
                {
                    pCurNode->pListNext->pListPrev = pNode;
                }

                /* 將節點插入鏈表頭部 */
                pCurNode->pListPrev = NULL;
                pCurNode->pListNext = pHashList->pHead;
                pHashList->pHead = pCurNode;
			}
		}
		else
		{
			pNode = pNode->pListNext;
		}
    }

    return 1;
}



/*
 *	HashString( void *str )
 *	Calculate the hash value of a string.
 *	Parameters:
 *		void *str,		the string that need calculate.
 *	Return Values:
 *		the hash value of the string.
 */
UINT HashStr( void *str, UINT str_len, UINT numBuckets )
{
    char	*s;
//    int		i;
    int		hashval;
	int		ret;
	int		j;

//	strupr( (char *)str );
    s = (char *)str;
    hashval = 0;

#if 0
    for ( i = 0; i < 5 && s[i] != '\0'; i++ )
    {
		hashval += hashval << 3;
		hashval += s[i] ;
    }
#endif
	j = 0;
	ret = 0;
    while ( *s != '\0' )
	{
		if ( j == 5 )
		{
			j = 0;
			ret += hashval;
			hashval = 0;
		}
		hashval += hashval << 3;
//		hashval += tolower( (unsigned char)*s );
		s++;
		j++;
	}
	ret += hashval;

    return ret % numBuckets;
}

/*
 *	StrCompare( )
 *	Compare if two string is equal.
 *	Return Values:
 *		1		equal
 *		0		not equal
 */
UINT HashStrCompare( void *str1, UINT str1_len, void *str2, UINT str2_len )
{
	return stricmp( (char *)str1, (char *)str2 );
}

void HashFree(void *pData, UINT uDataLen)
{
    free( pData );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色88888久久久久久影院按摩 | 日韩欧美国产高清| 国产亚洲精品aa午夜观看| 亚洲欧美日韩久久精品| 国产综合久久久久影院| 亚洲精品国产a久久久久久 | 欧美一区二区三区免费大片| 亚洲精品一区二区三区香蕉| 国产成人综合在线播放| 欧美日韩一级大片网址| 亚洲欧洲无码一区二区三区| 精品夜夜嗨av一区二区三区| 欧美精选一区二区| 怡红院av一区二区三区| 成人网在线免费视频| 精品国产免费人成电影在线观看四季| 亚洲一区二区三区四区五区中文| 精品夜夜嗨av一区二区三区| 日韩中文字幕麻豆| 欧洲av在线精品| 日韩理论片在线| 成人免费精品视频| 国产精品你懂的在线| 国产乱妇无码大片在线观看| 日韩欧美在线观看一区二区三区| 亚洲va在线va天堂| 欧美日韩综合在线| 亚洲一区二区av在线| 91搞黄在线观看| 曰韩精品一区二区| 欧美视频自拍偷拍| 亚洲第一主播视频| 欧美久久久久中文字幕| 日日摸夜夜添夜夜添亚洲女人| 欧美午夜不卡视频| 亚洲成人激情自拍| 日韩一二三区不卡| 久久精品国产99| 久久午夜国产精品| 国产成人啪免费观看软件| 国产三级三级三级精品8ⅰ区| 国产在线一区观看| 国产精品久久久久久久久搜平片| 成人午夜视频网站| 亚洲欧美日韩在线播放| 日本韩国欧美国产| 天堂蜜桃一区二区三区| 91精品国产综合久久久久| 奇米影视一区二区三区| 欧美电视剧在线看免费| 久久精品国产免费看久久精品| 日韩免费电影网站| 日韩一卡二卡三卡| 五月婷婷综合网| 3d成人h动漫网站入口| 美日韩黄色大片| 中文字幕免费不卡| 久久综合久久综合九色| 豆国产96在线|亚洲| 亚洲同性同志一二三专区| 欧美中文字幕一二三区视频| 久久精品国内一区二区三区| 中文字幕不卡在线播放| 欧美最猛性xxxxx直播| 麻豆成人久久精品二区三区红| 久久综合久久鬼色| 色菇凉天天综合网| 韩国一区二区三区| 亚洲一区二区影院| 国产人成亚洲第一网站在线播放| 91在线码无精品| 精品一区二区三区免费视频| 亚洲人成在线观看一区二区| 欧美一级日韩免费不卡| proumb性欧美在线观看| 日韩福利电影在线| 亚洲人成网站在线| 日韩免费观看高清完整版在线观看| av中文字幕不卡| 韩国精品久久久| 亚洲国产精品一区二区www在线 | 色婷婷久久99综合精品jk白丝| 琪琪一区二区三区| 亚洲精品五月天| 久久久99精品久久| 欧美精品一二三| 91在线免费视频观看| 国产在线不卡一卡二卡三卡四卡| 亚洲一区二区三区不卡国产欧美| 国产亚洲成aⅴ人片在线观看| 欧美精品色一区二区三区| 不卡视频在线看| 久久99国内精品| 日日夜夜免费精品视频| 亚洲欧美日韩系列| 国产精品免费av| 国产午夜精品一区二区三区嫩草| 欧美绝品在线观看成人午夜影视| 91一区二区在线| 成人深夜福利app| 国产成人精品综合在线观看| 麻豆精品视频在线观看视频| 亚洲一区二区精品久久av| 亚洲色图清纯唯美| 中文字幕一区在线观看| 国产欧美精品国产国产专区| 久久久久久久精| 精品国产一区二区三区四区四| 欧美久久久久久久久久| 欧美高清激情brazzers| 欧美日韩久久久一区| 在线观看日产精品| 欧洲一区在线观看| 91福利在线看| 欧美日韩一区精品| 欧美丰满美乳xxx高潮www| 欧美色图在线观看| 欧美一区欧美二区| 一区二区三区蜜桃网| 亚洲日本在线a| 亚洲另类色综合网站| 亚洲精品视频在线观看免费 | 国产偷v国产偷v亚洲高清| 国产亚洲一区二区三区在线观看 | 一区二区三区中文字幕在线观看| 综合精品久久久| 亚洲青青青在线视频| 亚洲成人动漫在线免费观看| 午夜激情一区二区三区| 久久国内精品自在自线400部| 久久精品免费观看| 懂色av一区二区在线播放| 99这里只有久久精品视频| 欧美午夜影院一区| 欧美一级在线免费| 国产日韩欧美不卡在线| 一区二区三区资源| 精品一区二区影视| 99久久精品99国产精品| 欧美日韩你懂得| 337p粉嫩大胆色噜噜噜噜亚洲 | 日韩视频一区在线观看| 国产日韩欧美一区二区三区乱码| 国产精品美女久久久久久久久| 一区二区视频免费在线观看| 蜜臀精品久久久久久蜜臀| 成人免费视频视频| 欧美精品第1页| 国产欧美日本一区视频| 亚洲成av人片在线观看无码| 久久成人综合网| 91原创在线视频| 欧美成人精品高清在线播放| 国产精品欧美久久久久一区二区| 五月天婷婷综合| 国产.欧美.日韩| 欧美久久久影院| 综合久久给合久久狠狠狠97色| 毛片av中文字幕一区二区| 欧美一二三四区在线| 国产精品国产三级国产aⅴ入口| 五月天激情小说综合| 顶级嫩模精品视频在线看| 欧美肥大bbwbbw高潮| 国产精品国产三级国产专播品爱网 | 亚洲国产日韩a在线播放性色| 紧缚奴在线一区二区三区| 91成人在线观看喷潮| 国产日韩欧美制服另类| 日韩国产欧美三级| 一本久久综合亚洲鲁鲁五月天| 久久久综合视频| 蜜臂av日日欢夜夜爽一区| 欧美少妇性性性| 亚洲日本电影在线| 国产91高潮流白浆在线麻豆| 欧美一区二区三区人| 亚洲福利视频一区二区| 色综合久久中文字幕综合网| 久久午夜国产精品| 另类欧美日韩国产在线| 67194成人在线观看| 亚洲精品欧美专区| 91免费小视频| 国产精品天美传媒沈樵| 国产一区二区看久久| 精品欧美乱码久久久久久1区2区| 亚洲午夜在线电影| 在线观看日韩毛片| 亚洲欧美另类小说视频| 99久久综合精品| 国产精品视频第一区| 国产高清成人在线| 久久免费美女视频| 国产精品一区二区你懂的| 久久综合资源网| 国产一区二区三区免费播放| 精品不卡在线视频| 国产精品一卡二卡| 亚洲国产精品高清|