c实现hash

#include <stdio.h>


#define HASH_SIZE 10

typedef struct Node{
    char key[50];
    char value[50];
    struct Node *next;
} NODE;

typedef unsigned int uint;
NODE *node[HASH_SIZE];

/*init hash node*/
int init(NODE *node)
{
    node=(NODE *)malloc(sizeof(NODE));
    if(node == NULL)
        return 1;
    bzero(node, sizeof(NODE));
    return 0;
}
/*计算哈希值*/
uint hash_index(const char *key)
{
    uint hash=0;
    char *p = key;
    for(;*p;p++){
        hash = hash*33+*p;
    }
    return hash%HASH_SIZE;

}
/*查找:根据哈希值得出index, 然后到对应的链表中查找*/
NODE *lookup(const char *key)
{
    char *value = NULL;
    uint index=0;
    int i = 0;
    NODE *np=NULL;
    index=hash_index(key);
    for(np=node[index]; np; np=np->next)
       if(strcmp(np->key,key)==0)
           return np;
    return NULL;  
}
/*插入:先查找该值是否存在,然后计算哈希值,插入对应的链表*/
uint install(const char *key, const char *value)
{
   NODE *np = NULL;
   np = lookup(key);
   uint index = 0;
   if(!np){
      index=hash_index(key);
      np =(NODE *)malloc(sizeof(NODE));
      if(!np)
        return 1;
      strcpy(np->key,key);
      strcpy(np->value,value);
      np->next=node[index];
      node[index]=np;
   }

   return 0;

}


int main(void)
{
    /*为哈希表插入一组数据*/
    char key[17] = "10.10.16.31";
    char value[4] = "001";
    install(key, value);

    char key1[17] = "10.10.16.32";
    char value1[4] = "002";
    install(key1, value1);

    char key2[17] = "10.10.16.33";
    char value2[4] = "003";
    install(key2, value2);

    char key3[17] = "10.10.16.34";
    char value3[4] = "004";
    install(key3, value3);

    char key4[17] = "10.10.16.41";
    char value4[4] = "005";
    install(key4, value4);

    NODE *np;

    /*哈希表初始化:如果不为表头赋值的话可以省略*/
    int i,j;
    for(i=0;i<HASH_SIZE;i++){
        init(node[i]);
    }

    /*遍历哈希表*/
    for(i=0; i<HASH_SIZE; i++)
    {
        if(node[i]){
            printf("i:%d, key:%s, value:%s\n", i, node[i]->key, node[i]->value);

            np = node[i]->next;
            while(np){
                printf("key:%s, value:%s\n", np->key, np->value);
                np = np->next;
            }
        }
    }
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值