hash表C实现

版权声明:仅限学习使用 https://blog.csdn.net/u014590889/article/details/89523006
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<memory.h>

#define base_bkdrhash_value 131

typedef struct hashtable
{
    struct hashtable *next;
    char *key_str;
    int   fid;
}hashtable_t;



void htinit(hashtable_t** ht, int len)
{
    int i=0;
    for (i=0;i<len;i++)
    {
        ht[i] = (hashtable_t*)malloc(sizeof(hashtable_t));
        memset(ht[i], 0, sizeof(hashtable_t));
    }

    ht[0]->fid = len;
}

int bkdrhash(char *key)
{
    int seed = base_bkdrhash_value;
    int hash = 0;
    while(*key != '\n' && *key != 0)
    {
        hash = hash*seed + (*key++);
    }
    
    printf("bkdrhash hash = %d\n", hash);
    return (hash & 0x7fffffff);
}

int htindex(char *key, hashtable_t** ht)
{
    int htkey = bkdrhash(key);
    printf("htindex htkey = %d\n", htkey);
    int fid = ht[0]->fid -1;
    //printf("htindex fid = %d\n", fid);
    return (int)htkey%fid +1;
}

hashtable_t* htset(char *key, int fid, hashtable_t** ht)
{
    printf("htset key = %s\n", key);
    int index         = htindex(key, ht);
    printf("htset index = %d\n", index);
    hashtable_t* item = ht[index];
    
    while (item->next)
    {
        if ( 0 == strcmp(key, item->next->key_str))
        {
            item->next->fid = fid;
            return 0;
        }
        item = item->next;
    }
    item->next = (hashtable_t*)malloc(sizeof(hashtable_t));
    item->next->fid     = fid;
    item->next->key_str = key;
    item->next->next    = NULL;
    
    return 0;
}

hashtable_t* htget(char *key, hashtable_t** ht)
{
    printf("htget key = %s\n", key);
    int index         = htindex(key, ht);
    printf("htget index = %d\n",index);
    hashtable_t* item = ht[index]->next;
    int i=0;
    while (item)
    {
        printf("htget i = %d\n",i++);
        if ( 0 == strcmp(key, item->key_str))
        {
            return item;
        }
        item = item->next;
    }
    return NULL;
}

int htdel(char *key, hashtable_t** ht)
{
    printf("htdel key = %s\n", key);
    int index         = htindex(key, ht);
    printf("htdel index = %d\n",index);
    hashtable_t* item = ht[index];
    hashtable_t* temp = NULL;
    while (item->next)
    {
        if ( 0 == strcmp(key, item->next->key_str))
        {
            temp = item->next;
            item->next = temp->next;
            free(temp);
            temp = NULL;
            return 0;
        }
        item = item->next;
    }
    return -1;
}

int htgetlen(hashtable_t** ht)
{
    int alen         = ht[0]->fid;
    int i,length = 0;

    for (i=1;i<alen;i++)
    {
        if (ht[i]->next)
        {
            length++;
        }
    }
    return length;
}

int htcapacity(hashtable_t** ht)
{
    return ht[0]->fid;
}

void printht(hashtable_t** ht)
{
    int i;
    int len         = ht[0]->fid;
    hashtable_t* item = NULL;

    for (i=1;i<len;i++)
    {
        item = ht[i]->next;
        while (item)
        {
            printf("%-10s = %6d\n", item->key_str, item->fid);
            item = item->next;
        }
    }
}

void main()
{
    hashtable_t *item[50];
    htinit(item, 50);
    
    htset("gsdb", 100, item);
    htset("aaao", 10, item);
    htset("aaaao", 10, item);
    htset("bfaao", 2000, item);
    htset("wilbur", 100, item);
    htset("wyao", 1000, item);
    printf("/***************/\n");
    printht(item);
    printf("/***************/\n");
    hashtable_t *tmp = htget("wyao", item);
    if (tmp)
        printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
    printf("/***************/\n");

    htdel("aaao", item);
    printf("/***************/\n");
    printht(item);
    printf("/***************/\n");
    tmp = htget("aaao", item);
    if (tmp)
        printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
    printf("/***************/\n");
    tmp = htget("aaaaaao", item);
    if (tmp)
        printf("tmp %-10s = %6d\n", tmp->key_str, tmp->fid);
}

[[email protected] /newhome/wuyaoyao/Linux_Bash/hash]# gcc -o hash_table hash_table.c
[[email protected] /newhome/wuyaoyao/Linux_Bash/hash]# ./hash_table
htset key = gsdb
bkdrhash hash = 233540086
htindex htkey = 233540086
htset index = 11
htset key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htset index = 48
htset key = aaaao
bkdrhash hash = -1278536473
htindex htkey = 868947175
htset index = 41
htset key = bfaao
bkdrhash hash = -972796097
htindex htkey = 1174687551
htset index = 17
htset key = wilbur
bkdrhash hash = 741440725
htindex htkey = 741440725
htset index = 19
htset key = wyao
bkdrhash hash = 269612128
htindex htkey = 269612128
htset index = 17
/***************/
gsdb       =    100
bfaao      =   2000
wyao       =   1000
wilbur     =    100
aaaao      =     10
aaao       =     10
/***************/
htget key = wyao
bkdrhash hash = 269612128
htindex htkey = 269612128
htget index = 17
htget i = 0
htget i = 1
tmp wyao       =   1000
/***************/
htdel key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htdel index = 48
/***************/
gsdb       =    100
bfaao      =   2000
wyao       =   1000
wilbur     =    100
aaaao      =     10
/***************/
htget key = aaao
bkdrhash hash = 219742262
htindex htkey = 219742262
htget index = 48
/***************/
htget key = aaaaaao
bkdrhash hash = 2023274675
htindex htkey = 2023274675
htget index = 45
[[email protected] /newhome/wuyaoyao/Linux_Bash/hash]#

猜你喜欢

转载自blog.csdn.net/u014590889/article/details/89523006