• 线性探测法的查找函数


     

    裁判测试程序样例:

    #include <stdio.h>
    
    #define MAXTABLESIZE 100000  /* 允许开辟的最大散列表长度 */
    typedef int ElementType;     /* 关键词类型用整型 */
    typedef int Index;           /* 散列地址类型 */
    typedef Index Position;      /* 数据所在位置与散列地址是同一类型 */
    /* 散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */
    typedef enum { Legitimate, Empty, Deleted } EntryType;
    
    typedef struct HashEntry Cell; /* 散列表单元类型 */
    struct HashEntry{
        ElementType Data; /* 存放元素 */
        EntryType Info;   /* 单元状态 */
    };
    
    typedef struct TblNode *HashTable; /* 散列表类型 */
    struct TblNode {   /* 散列表结点定义 */
        int TableSize; /* 表的最大长度 */
        Cell *Cells;   /* 存放散列单元数据的数组 */
    };
    
    HashTable BuildTable(); /* 裁判实现,细节不表 */
    Position Hash( ElementType Key, int TableSize )
    {
        return (Key % TableSize);
    }
    
    #define ERROR -1
    Position Find( HashTable H, ElementType Key );
    
    int main()
    {
        HashTable H;
        ElementType Key;
        Position P;
    
        H = BuildTable(); 
        scanf("%d", &Key);
        P = Find(H, Key);
        if (P==ERROR)
            printf("ERROR: %d is not found and the table is full.
    ", Key);
        else if (H->Cells[P].Info == Legitimate)
            printf("%d is at position %d.
    ", Key, P);
        else
            printf("%d is not found.  Position %d is returned.
    ", Key, P);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

     

     1 Position Find( HashTable H, ElementType Key )
     2 {
     3     int HashPos = Hash(Key, H->TableSize);
     4     int Pre;   //Pre表示初始时HashPos的前一个位置
     5     (HashPos-1 >= 0) ? (Pre = HashPos-1) : (Pre = (HashPos-1)+H->TableSize);
     6     
     7     /* 是空位或者遍历完哈希表中的数组时,跳出循环 */
     8     for(; H->Cells[HashPos].Info != Empty && HashPos != Pre; HashPos = (HashPos+1)%H->TableSize)
     9         if(H->Cells[HashPos].Data == Key && H->Cells[HashPos].Info == Legitimate)
    10             return HashPos;
    11             
    12     if(H->Cells[HashPos].Info == Empty)  /* 如果此时的位置是一个空位 */
    13         return HashPos;
    14     else        /* 非空位,把数组遍历完了 */
    15         return ERROR;
    16 }
  • 相关阅读:
    遍历及线索化二叉树
    二叉树
    程序的内存布局
    C语言一些易混淆的概念
    C语言标准库函数memcpy和memmove的区别以及内存重叠问题处理
    柔性数组
    一个基于QT简单登录对话框(带验证码功能)
    Qt中的布局管理器
    Qt中的标准对话框
    一个基于QT简单登录对话框
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/9825581.html
Copyright © 2020-2023  润新知