码迷,mamicode.com
首页 > 其他好文 > 详细

hash表

时间:2015-11-08 22:30:13      阅读:298      评论:0      收藏:0      [点我收藏+]

标签:

#include <stdio.h>
#include <stdlib.h>
/*通过链接法解决碰撞*/
typedef struct list_node_tag {
    int key;
    struct list_node_tag *prev;
    struct list_node_tag *next;
} list_node;

typedef struct hash_tag {
    list_node **list_array;
    int num;
} hash;

void list_node_ini(list_node *p, int key){
    p->key = key;
    p->prev = NULL;
    p->next = NULL;
}

list_node *list_search(list_node *x, int k){ 
    while (x != NULL && x->key != k) {
        x = x->next;
    }   
    return x;
}

void list_insert(list_node **head, list_node *x){
    x->next = *head;
    if (*head != NULL) {
        (*head)->prev = x;
    }   
    *head = x;
    x->prev = NULL;
}

void list_delete(list_node **head, list_node *x){
    if (x->prev != NULL) {
        x->prev->next = x->next;
    } else {
        *head = x->next;
    }
    if (x->next != NULL) {
        x->next->prev = x->prev;
    }
    free(x);
}

hash *hash_create(int num){
    hash *h = (hash*)malloc(sizeof(hash));
    h->num = num;
    h->list_array = (list_node**)calloc(sizeof(list_node*), num);
    for (int i = 0; i < num; i++) {
        h->list_array[i] = NULL;
    }
    return h;
}

void hash_destroy(hash *h){
    for (int i = 0; i < h->num; i++) {
        for(list_node * p = h->list_array[i]; p != NULL; ){
            list_node * q = p;
            p = p -> next;
            free(q);
        }
    };
    free(h->list_array);
    free(h);
}

int hash_value(hash *h, int key){
    return key % h->num;
}

void hash_insert(hash *h, int key){
    list_node *x = (list_node*)malloc(sizeof(list_node));
    x->key = key;
    x->prev = NULL;
    x->next = NULL;
    list_node **head = &h->list_array[hash_value(h, key)];
    list_insert(head, x);
}

list_node *hash_search(hash *h, int key){
    list_node *head = h->list_array[hash_value(h, key)];
    return list_search(head, key);
}

void hash_delete(hash *h, list_node *x){
    if (x == NULL)
        return;
    int key = x->key;
    list_node **head = &h->list_array[hash_value(h, key)];
    list_delete(head, x);
}

int main(){
    hash *h = hash_create(10);
    for (int i = 0; i < 10; i++) {
        printf("%d ", i);
        hash_insert(h, i);
    }
    printf("\n");
    int k = 0;
    list_node *x = hash_search(h, k);
    printf("查找关键字:%d的结果:%s\n", k, x != NULL ? "成功" : "失败");
    if (x != NULL) {
        hash_delete(h, x);
        x = hash_search(h, k);
        printf("删除关键字:%d的结果:%s\n", k, x == NULL ? "成功" : "失败");
    }
    hash_destroy(h);
    return 0;
}

  

hash表

标签:

原文地址:http://www.cnblogs.com/moxiaopeng/p/4948445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!