zoukankan      html  css  js  c++  java
  • 哈希表存人名。。= =

    详见 清华大学出版社的《数据结构题集(C语言版)》   P166 6.2

    哈希表采用数组形式实现,方便操作.

    构造哈希表时对冲突的处理采用为随即再散列法,虽然这很容易实现,但是在插入和查找时得分开进行处理,否则会导致正确的hash被跳过去,只能生成未被占用的hash,导致查找的时候始终无法找到关键字.因此在CreateHash函数中加入了判断条件,除了比对该hash有没有被占用之外还要比对占用的关键字是否与生成hash的关键字相同.

    代码
    #include <stdio.h>
    #include
    <stdlib.h>
    #include
    <string.h>

    typedef
    struct HashNode
    {
    char name[30];
    int flag;
    }HashNode;

    HashNode HashTable[
    60];

    void InsertHash(long int hash, char *name)
    {
    strcpy(HashTable[hash].name, name);
    HashTable[hash].flag
    = 1;
    }

    int SearchHash(long int hash)
    {
    if (HashTable[hash].flag == 1)
    return 1;
    else
    return 0;
    }

    long int CreateHash(char *name)
    {
    int i, n;
    long int hash = 0;
    n
    = strlen(name);
    for (i = 0; i < n; i++)
    {
    hash
    += name[i];
    }
    hash
    = hash % 60;

    while (SearchHash(hash) == 1 && strcmp(HashTable[hash].name, name) != 0)
    hash
    = (hash + abs(rand())) % 60;
    return hash;
    }

    void InitHashTable()
    {
    int i;
    for (i = 0; i < 60; i++)
    HashTable[i].flag
    = 0;
    }

    void main()
    {
    int temp;
    char input[30] = "Initial";
    InitHashTable();
    printf(
    "Input names below,end up inputting with \"E\"\n");
    do
    {
    if (strlen(input) != 1)
    {
    scanf(
    "%s", input);
    getchar();
    InsertHash(CreateHash(input), input);
    }
    }
    while (strlen(input) != 1);
    printf(
    "\nSearch:");
    scanf(
    "%s", input);
    do
    {
    temp
    = CreateHash(input);
    if (SearchHash(temp) == 1 && strcmp(HashTable[temp].name, input) == 0)
    {
    printf(
    "\nFound.\n");
    getchar();
    scanf(
    "%d");
    return;
    }
    }
    while (SearchHash(temp) == 1);
    printf(
    "\nNot Found.\n");
    getchar();
    scanf(
    "%s", input);
    }

  • 相关阅读:
    PID204特种部队
    概率论,简要数学期望(转载)
    codevs1258 关路灯(☆区间dp)
    codevs3327选择数字(单调队列优化)
    codevs3002石子归并3(四边形不等式优化dp)
    codevs1154能量项链(环形dp,区间dp)
    codevs3304水果姐逛街(线段数)
    codevs3162抄书问题(划分型dp)
    浅谈一类积性函数的前缀和(转载)
    组合数取模(转载)
  • 原文地址:https://www.cnblogs.com/kanone/p/1911353.html
Copyright © 2011-2022 走看看