icoding哈希表

 

 思路:

文章给出的hash_string只是一个函数 不需要理解 直接拿来用就可以了 库函数还是用string 首先开一个基本单元HashEntry * p 然后调用函数对输入的key进行解密  注意hash表特性要除以size;然后判断情况,如果没有该entry 就为p开拓一个空间 然后为里面的所有带指针的地方开辟内存 然后同strcpy吧key复制到key.str_value里面 再把value赋值进去 给int然后将表头放置第一个元素p返回ADDED;

第二种情况是已经有了表头 先让p等于最开始的表头 然后用循环来一直往后走 如果key解码函数翻译出来跟p所指的value相等(用strcmp)并且int也相等则返回ALREADYADEDE 如果int不相等就replace 如果一直不相等 就到最后去p停留在最后一个上(不是NULL)再新开一个q用p把q接入链表就可以了

#include <stdio.h>    
#include "stdlib.h"
#include "hash.h"      
#include <string.h>

HASH_RESULT hash_add_int(HashTable *table, const char*key,int value){
    HashEntry* p;//可以理解为等价类 
    int h=hash_string(key)%table->size;
    if(!table->bucket[h]){
        p=(HashEntry*)malloc(sizeof(HashEntry));
        if(!p)return HASH_ERROR;
        p->key.str_value=(char*)malloc(strlen(key));
        if(!p->key.str_value)return HASH_ERROR;
        
    strcpy(p->str_value,key);
    p->value.int_value=value;
    p->next=NULL;
    table->bucket[h]=p;
    return HASH_ADDED;
}
    p=table->bucket[h];
    while(p){if(strcmp(key,p->key.str_value)==0){
        if(p->value.int_value==value)
        return HASH_ALREADY_ADDED;
        else {p->value.int_value=value;
            return HASH_REPLACED_VALUE;
        }
    }
        else{if(p->next)p=p->next;
            else break;
        }
    }
    HashEntry *q;
    q=(HashEntry*)malloc(sizeof(HashEntry));
    if(!q)return HASH_ERROR;
    q->key.str_value=(char *)malloc(strlen(key);
    if(!q->key.str_value)return HASH_ERROR;
    strcpy(q->key.str_value,key);
    q->value,int_value=value;
    q->next=NULL;
    p->next=q;
    return HASH_ADDED;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值