C语言中哈希表简单举例

哈希表,也称散列表。

通过散列函数将数据值和它的存储位置联系起来。即通过精心地向表载入元素实现,从而提高访问速度。本例中采取的解决冲突的办法是建立一个链表,挂在这个位置的后面,所有散列函数值为这个位置的元素都添加到这个链表中,可以从头部插入也可以从尾部追加,甚至可以再这个位置后面再挂一个散列表。

代码实现了将文件名按字母a-z分类,不区分大小写。先以数组存储各节点,当发生冲突后即将节点加入链表中。然后遍历显示所有的文件名。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASHSIZE 26
#define FILENAMELENGTH 20
#define TRUE 1
#define FALSE 0

struct file
{
    char name[FILENAMELENGTH];
    struct file *next;
};

struct file * files[HASHSIZE];

/**将大写字符转为小写字母,本程序中哈希表不区分大小写*/
char case_insensitive(char ch)
{
    if(isupper(ch))
        return ch - 'A' + 'a';
    return ch;
}

/**完成初始化工作*/
void init()
{
    int i;
    for(i = 0 ; i < HASHSIZE; i++)
        files[i] = NULL;
}

/**哈希函数,返回在哈希表中的位置,哈希表各项以文件名首字母a-z区分*/
int hash(char *s)
{
   return case_insensitive(s[0]) - 'a';
}

/**查询某个文件名在哈希结构中是否已存在*/
int search(char *s)
{
    int num = hash(s);
    if(files[num] != NULL) //如果哈希表不空,已出现以该文件名首字母开头的文件名
    {
        struct file *p = files[num]; //p指向链表中第一个节点
        while(p != NULL)
        {
            if(strcmp(p->name,s) == 0)
                return TRUE;
            p = p->next;
        }
    }
    return FALSE;
}

/**如果文件名在哈希结构中不存在,则插入*/
void insert(char *s)
{
    if(search(s) == FALSE)
    {
        int num = hash(s);
        struct file *new_node = (struct file*)malloc(sizeof(struct file));
        strcpy(new_node->name,s);
        if(files[num] == NULL) //如果链表为空,将作为第一个节点
        {
            files[num] = new_node;
            files[num]->next = NULL;
        }
        else //如果链表不空,将其放在第一个节点位置
        {
            new_node->next = files[num];
            files[num] = new_node;
        }
    }
    // else do nothing;
}

/**显示该哈希结构中存储的所有文件名*/
void show_all()
{
    int i;
    struct file *p = NULL;
    for(i = 0 ; i < HASHSIZE ; i++)
    {
        p = files[i];
        if(p != NULL)
        {
            printf("For file begins with %c:\n",i + 'a');
            while(p != NULL)
            {
                printf("%s\n",p->name);
                p = p->next;
            }
            printf("\n");
        }
    }
}

int main()
{
    char *file_names[] = {"apple","because","song","Dan","discuz","cartoon","nobody","android","information","love","like","No","nothing","like","alone","nothing"};
    int len = sizeof(file_names) / sizeof(char *); //获得字符串数组的长度
    int i;
    for(i = 0; i < len; i++)
        insert(file_names[i]);
    show_all();
    return 0;
}


  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值