您的位置:首页 > 其它

【hash表】两种实现(链地址法,开放地址法)

2014-12-01 01:49 253 查看
Hash表是计算机里面最重要的一种表。

常见有链地址法 List [ N ] 和 开放地址法 Pair<key, value>
.

简单实现 原文:http://blog.csdn.net/zhangjieting/article/details/5647033

1、开放地址法 

[c-sharp] view
plaincopy

#include <stdio.h>  

#define N 4  

  

typedef int datatype;  

typedef struct  

{  

    datatype key;  

}Hretype;  

  

int LHashsearch(Hretype HT
, datatype k)  

{  

    int addr,i=0;  

    addr = k % N;  

    while(i<N && HT[addr].key != -1 && HT[addr].key != k)  

    {  

        i++;  

        addr = (addr+1)%N;  

    }  

    if(i == N)  

        return -1;  //表溢出  

    else  

        return addr;  

}  

  

int LHinsert(Hretype HT
, Hretype R)  

{  

  

    int addr;  

    addr = LHashsearch(HT, R.key);  

  

    if(addr==-1 || HT[addr].key == R.key)  

    {  

        return 1;  

    }  

    else  

    {  

        HT[addr] = R;  

        return 0;  

    }  

}  

  

int main()  

{  

    Hretype R[6];  

    Hretype HT
;  

  

    for(int i=0;i<N;i++)  

        HT[i].key = -1;  

  

    for(i=0;i<6;i++)  

        R[i].key = i;  

  

    for(i=0;i<6;i++)  

    {  

        int value = LHinsert(HT,R[i]);  

        if(value)  

            printf("表溢出或记录已存在!/n");  

        else  

        {  

            printf("插入成功!/n");  

        }  

    }  

    return 0;  

}  

 

2、用链表 链地址法

[c-sharp] view
plaincopy

#include <stdio.h>  

#include <stdlib.h>  

#define N 4  

  

typedef int datatype;  

  

typedef struct node  

{  

    datatype key;  

    struct node *next;  

}Renode;  

  

Renode *LinkHsearch(Renode *HT
, datatype k)  

{  

    Renode *p;  

    int addr = k % N;  

    p = HT[addr];  

  

    while(p && p->key !=k)  

        p = p->next;  

  

    return p;  

}  

  

void LinkHinsert(Renode *HT
, Renode *S)  

{  

    int addr;  

    Renode *p;  

    p = LinkHsearch(HT,S->key);  

    if(p)  

    {  

        printf("记录已存在/n");  

        free(S);  

    }  

    else  

    {  

        addr = S->key % N;  

        S->next = HT[addr];  

        HT[addr] = S;  

        printf("已插入/n");  

    }  

}  

  

int main()  

{  

    Renode *HT
;  

  

    //指针数组初始化  

    for(int i=0;i<N;i++)  

        HT[i] = NULL;  

  

    for(i=0;i<6;i++)  

    {  

        Renode *S = (Renode*)malloc(sizeof(Renode));  

        S->key = i;  

        LinkHinsert(HT,S);  

    }  

  

    for(i=0;i<6;i++)  

    {  

        Renode *S = (Renode*)malloc(sizeof(Renode));  

        S->key = i;  

        LinkHinsert(HT,S);   //注意指针数组实参  

    }  

  

    return 0;  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: