zoukankan      html  css  js  c++  java
  • 数据结构——哈希表的构造和查找

    #include<stdio.h>
    #include<malloc.h>
    #define MAXSIZE 25
    #define P 13
    #define OK 1
    #define ERROR 0
    #define DUPLICATE -1
    #define TRUE 1
    #define FALSE 0
    typedef struct   /*哈希表元素结构*/
    {
        int key;  /*关键字值*/
        int flag; /*是否存放元素*/
    } ElemType;
    
    typedef struct
    {
        ElemType data[MAXSIZE];
        int count;      /*元素个数*/
        int sizeindex;  /*当前哈希表容量*/
    } HashTable;
    
    int d1[15]= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/
    int d2[15]= {0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/
    void dataset(int ds[],int *len);
    int InsertHash(HashTable *H,int e,int d[]);
    int CreateHash(HashTable *H,int ds[],int len,int d[]);
    int SearchHash(HashTable *H, int e,int d[]);
    void menu();
    /*输入查找表*/
    void dataset(int ds[],int *len)
    {
        int n,m;
        n=0;
        printf("
    查找表输入:");
        while(scanf("%d",&m)==1)   /*以输入一个非整数作为结束*/
        {
            ds[n]=m;
            n++;
        }
        *len=n;
    }
    /*计算哈希地址,插入哈希表*/
    int InsertHash(HashTable *H,int e,int d[])
    {
        int k,i=1;
        k=e%P;
        while(H->data[k].flag==TRUE||k<0)
        {
            k=(e%P+d[i])%MAXSIZE;
            i++;
            if(i>=15)
                return ERROR;
        }
        H->data[k].key=e;
        H->data[k].flag=TRUE;
        H->count++;
        return OK;
    }
    /*构造哈希表*/
    int CreateHash(HashTable *H,int ds[],int len,int d[])
    {
        int i;
        for(i=0; i<len; i++)
        {
            if(SearchHash(H,ds[i],d)!=-1)
                return DUPLICATE;
            InsertHash(H,ds[i],d);
            if(H->count>=MAXSIZE)
                return ERROR;
        }
        return OK;
    }
    /*初始化哈希表*/
    void InitHash(HashTable *H)
    {
        int i;
        for(i=0; i<MAXSIZE; i++)
        {
            H->data[i].key=0;
            H->data[i].flag=FALSE;
        }
    }
    /*在哈希表中查找*/
    int SearchHash(HashTable *H, int e,int d[])
    {
        int k,i=1;
        k=e%P;
        while(H->data[k].key!=e)
        {
            k=(e%P+d[i])%MAXSIZE;
            i++;
            if(i>=15)
                return -1;
        }
        return k;
    }
    /*演示菜单*/
    void menu()
    {
        int choice;
        int *p;
        HashTable h;
        h.count=0;
        h.sizeindex=MAXSIZE;
        int a[MAXSIZE]= {0};
        int i,n,e;
        dataset(a,&n);  /*建立查找表*/
        getchar();
        printf("
    ");
        do
        {
            printf("
    ----哈希查找演示----
    ");
            printf("
    1.线性探测构造哈希表
    ");
            printf("
    2.二分探测构造哈希表
    ");
            printf("
    3.退出
    ");
            printf("
    输入选择:");
            scanf("%d",&choice);
            if(choice==1)
                p=d1;
            else if(choice==2)
                p=d2;
            else
                return;
            InitHash(&h);   /*初始化哈希表*/
            if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/
                printf("
    哈希表构造失败!
    ");
            else if(i==DUPLICATE)
                printf("
    哈希表具有重复关键字!
    ");
            else
            {
                printf("
    哈希表:
    ");
                for(i=0; i<h.sizeindex; i++)
                    printf("%3d",h.data[i].key);
                printf("
    
    哈希查找
    输入要查找的key值:");
                getchar();
                scanf("%d",&e);
                if((i=SearchHash(&h,e,p))==-1)
                    printf("
    %d未找到
    ",e);
                else
                    printf("
    %d在哈希表中下标为%d
    ",e,i);
            }
            getchar();
        }
        while(1);
    }
    
    int main()
    {
        menu();
        return 0;
    }

     

  • 相关阅读:
    iPhone控件之UIWebView2
    Xcode 4.1/4.2 免证书(iDP)开发+真机调试
    iPhone控件之UIToolbar
    POJ 2472 ||SDUT 2358 106 miles to Chicago(Dijkstra算法变形)
    POJ 2418 Hardwood Species(二叉排序树)
    POJ 2513 Colored Sticks(字典树 + 并查集 + 欧拉回路)
    HDU 4033 Regular Polygon(几何 + 二分)
    POJ 3191 The Moronic Cowmpouter(二进制的变形)
    POJ 2442 Sequence(堆的应用)
    HDU 4036 Rolling Hongshu(数学+物理应用)
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/10105097.html
Copyright © 2011-2022 走看看