哈希表C实现

哈希表C实现

代码示例

在这里插入图片描述

//方法一:用 Hash 表
//1,创建 Hash 表
//2,遍历数组,判断该元素是否在 Hash 表中存在,如果存在则对应次数加一

//
#define     HASH_SIZE   99
#define     ABS(a)      ((a) > 0 ? (a) : (0 - (a)))
//元素定义
 struct HashListNode{
    int                     key;                //key值
    int                     val;                //value值
 };

//二维哈希链表元素定义
struct Hash_Node {
    struct HashListNode*    pNode;              //当前值
    struct Hash_Node*       pNext;              //下一个指针
};

//哈希表定义
struct Hash_Table {
    int                     iNodeSize;          //存入元素个数
    struct Hash_Node**      pHashHead;          //Hash表指针
};
//

//
//函数一:哈希表初始化
bool hashTableInit(struct Hash_Table** pHashTable) {

    (*pHashTable) = (struct Hash_Table*)malloc(sizeof(struct Hash_Table));
    if(NULL == (*pHashTable)) return false;
    
    (*pHashTable)->iNodeSize = 0;
   (*pHashTable)->pHashHead = (struct Hash_Node**)malloc(sizeof(struct Hash_Node*) * HASH_SIZE);
    if(NULL == (*pHashTable)->pHashHead) return false;
    memset((*pHashTable)->pHashHead, 0x00, sizeof(struct Hash_Node*) * HASH_SIZE);
    return true;
}

//函数二:哈希表元素插入
//1,遇到相同的元素,则更新 value 值
bool hashTableInsert(struct Hash_Table* pHashTable, int key, int value){
    long                    iKey        = 0;
    struct Hash_Node*       pTmpNode    = NULL;
    struct HashListNode*    pNode       = NULL;

    pNode = (struct HashListNode*)malloc(sizeof(struct HashListNode));
    if(NULL == pNode) return false;
    pNode->key = key;
    pNode->val = value;

    iKey = (long)key;
    iKey = ABS(iKey) % HASH_SIZE;
    if(NULL == pHashTable->pHashHead[iKey])
    {
        pHashTable->pHashHead[iKey] = (struct Hash_Node*)malloc(sizeof(struct Hash_Node));
        if(NULL == pHashTable->pHashHead[iKey]) return false;

        pHashTable->pHashHead[iKey]->pNode = pNode;
        pHashTable->pHashHead[iKey]->pNext = NULL;
    }
    else
    {
        pTmpNode = pHashTable->pHashHead[iKey];
        while((NULL != pTmpNode) && (NULL != pTmpNode->pNext))
        {
            if(key == pTmpNode->pNode->key)
            {
                pTmpNode->pNode->val = value;
                return true;
            }
            pTmpNode = pTmpNode->pNext;
        }

        if(key == pTmpNode->pNode->key)
        {
            pTmpNode->pNode->val = value;
            return true;
        }
        else
        {
            pTmpNode->pNext = (struct Hash_Node*)malloc(sizeof(struct Hash_Node));
            if(NULL == pTmpNode->pNext) return false;

            pTmpNode = pTmpNode->pNext;
            pTmpNode->pNode = pNode;
            pTmpNode->pNext = NULL;
        }
    }
    pHashTable->iNodeSize += 1;
    return true;
}

//函数三:取出哈希表元素
struct Hash_Node* getHashNode(struct Hash_Table* pHashTable, int key){
    long                iKey        = 0;
    struct Hash_Node*   pTmpNode    = NULL;
    
    iKey = (long)key;
    iKey = ABS(iKey) % HASH_SIZE;
    pTmpNode = pHashTable->pHashHead[iKey];

    while(NULL != pTmpNode)
    {
        if((NULL != pTmpNode->pNode) && (key == pTmpNode->pNode->key))
        {
            return pTmpNode;
        }
        else
        {
            pTmpNode = pTmpNode->pNext;
        }
    }

    return NULL;
}

//函数四:hash表元素删除
bool hashTableDel(struct Hash_Table* pHashTable, int key){
    long                iKey        = 0;
    struct Hash_Node*   pTmpNode    = NULL;
    struct Hash_Node*   pNextNode   = NULL;

    if(NULL == pHashTable) return false;

    iKey = (long)key;
    iKey = ABS(iKey) % HASH_SIZE;
    pTmpNode = pHashTable->pHashHead[iKey];

    while(NULL != pTmpNode)
    {
        if((NULL != pTmpNode->pNode) && (key == pTmpNode->pNode->key))
        {
            pNextNode = pTmpNode->pNext;
            free(pTmpNode->pNode);
            pTmpNode->pNode = NULL;
            pTmpNode->pNext = pNextNode;
            pHashTable->iNodeSize -= 1;
            break;
        }
        else
        {
            pTmpNode = pTmpNode->pNext;
        }
    }

    return true;
}

//函数五:Hash表的释放
void freeHashTable(struct Hash_Table* pHashTable){
    int                 i           = 0;
    struct Hash_Node*   pTmpNode    = NULL;
    struct Hash_Node*   pNextNode   = NULL;

    if(NULL == pHashTable) return;

    for(i = 0; i < HASH_SIZE; i++)
    {
        pTmpNode = pHashTable->pHashHead[i];
        while(NULL != pTmpNode)
        {
            pNextNode = pTmpNode->pNext;
            if(NULL != pTmpNode->pNode)
            {
                free(pTmpNode->pNode);
                pTmpNode->pNode = NULL;
            }
            free(pTmpNode);
            pTmpNode = pNextNode;
        }
        pHashTable->pHashHead[i] = NULL;
    }
    return;
}
//


int majorityElement(int* nums, int numsSize){
    int     i       = 0;
    int     iRet    = 0;

    struct Hash_Node*       pTmpNode        = NULL;
    struct Hash_Table*      pHashTable      = NULL;

    if(false == hashTableInit(&pHashTable)) return -1;

    if(NULL == nums) return -1;
    if(numsSize < 2) return nums[0];

    for(i = 0; i < numsSize; i++)
    {
        pTmpNode = getHashNode(pHashTable, nums[i]);
        if(NULL == pTmpNode)
        {
             hashTableInsert(pHashTable, nums[i], 1);
        }
        else
        {
            pTmpNode->pNode->val += 1;

            if(pTmpNode->pNode->val > (numsSize / 2))
            {
                iRet = nums[i];
                break;
            }
        }
    }

    freeHashTable(pHashTable);
    pHashTable = NULL;
    return iRet;
}

作者:r0vHWU5AdJ
链接:https://leetcode-cn.com/problems/majority-element/solution/chun-chashbiao-de-ying-yong-169duo-shu-yuan-su-s-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值