哈希表

来源:互联网 发布:三星专用下载软件 编辑:程序博客网 时间:2024/06/03 19:17

哈希表的相关概念

常用的构造哈希函数的方法:    直接定值法:H(key) = key    除留余数法
  • 产生冲突的处理办法:链地址法,就是顺序表加链表的操作.

采用链地址创建哈希表

  • 定义一个哈希表并且初始化
typedef struct HashNode{    int data;  //数据域    struct HashNode *link; //指针域}HashNode;typedef HashNode* HashTable[P];  //定义一个数组void InitHashTable(HashTable &ht){    for(int i = 0; i < P; i++){        ht[i] = NULL; //初始化,    }}
  • 定义一个数组和地址的关系
int Hash(int key){    return key % P;}
  • Hash表的查找
HashNode *SearchHashTable(HashTable &ht, int key){    int index = Hash(key); //先找到位置    HashNode *p = ht[index];  //相当于链表的查找    while(p!=NULL && p->data != key){  //没找到并且没找完成,不能颠倒位置        p = p->link;    }    return p;}
  • 插入
void InsertHashTable(HashTable &ht, int x){        int index = Hash(x); //查找一个插入的位置        HashNode *s = (HashNode *)malloc(sizeof(HashNode));        assert(s != NULL);        s->data = x;//以上的三步是申请节点        HashNode *p = ht[index]; //用头插法        s->link = ht[index];        ht[index] = s;}
  • 显示
    void ShowHashTable(HashTable ht){    for(int i=0; i<P; i++){        printf("%d ", i);        HashNode *p = ht[i];        while(p != NULL){            printf("%d-->", p->data);            p = p->link;        }        printf("NUL \n");    }}
  • 删除
bool RemoveHashTable(HashTable &ht, int key){    HashNode *p = SearchHashTable(ht, key); //找到这个节点    if(p == NULL)        return false;    int index = Hash(key);    HashNode *q = ht[index]; //这是第一个节点    if(q == p) //如果删除的是头结点    {        ht[index] = p->link;        free(p);        return true;    }    while(q->link != p)//非头结点,找到前一个节点    {        q = q->link;    }    q->link = p->link;    free(p);    return true;}

采用溢出桶的插入方法

  • 初始化
struct bucket_node{    int data[3];  //定义桶节点    struct bucket_node *next;};bucket_node hash_table[P];void Init_bucket_node(){    for(int i=0; i<P; i++){        for(int j=0;j<3; j++){            hash_table[i].data[j] = NULL_DATA;        }        hash_table[i].next=NULL;  //初始化桶节点    }}
  • 插入
int Hash(int key){    return key % P;}void Insert_new_element(int x){    int index = Hash(x);  //找到插入的位置    //第一个桶有位置就插入后返回    for(int i=0; i<3; i++){        if(hash_table[index].data[i] == NULL_DATA){            hash_table[index].data[i] = x;            return;        }    }    //第一个桶没有位置    bucket_node *p = &hash_table[index]; //p用于寻找最后一个桶    while(p->next != NULL){ //存在溢出桶        p = p->next;        for(i = 0; i < 3; i++){            if(p->data[i] == NULL_DATA){                p->data[i] = x;                return;            }        }    }    //创建溢出桶,并初始化    bucket_node *s = (bucket_node*)malloc(sizeof(bucket_node));    assert(s != NULL);    for(i = 0; i < 3; i++){        s->data[i] = NULL_DATA;    }    s->next = NULL;    s->data[0] = x;    p->next = s; //将新建的桶进行链接    return;}
0 0
原创粉丝点击