C语言中哈希表简单举例
2012-12-06 20:36
162 查看
哈希表,也称散列表。
通过散列函数将数据值和它的存储位置联系起来。即通过精心地向表载入元素实现,从而提高访问速度。本例中采取的解决冲突的办法是建立一个链表,挂在这个位置的后面,所有散列函数值为这个位置的元素都添加到这个链表中,可以从头部插入也可以从尾部追加,甚至可以再这个位置后面再挂一个散列表。
代码实现了将文件名按字母a-z分类,不区分大小写。先以数组存储各节点,当发生冲突后即将节点加入链表中。然后遍历显示所有的文件名。
通过散列函数将数据值和它的存储位置联系起来。即通过精心地向表载入元素实现,从而提高访问速度。本例中采取的解决冲突的办法是建立一个链表,挂在这个位置的后面,所有散列函数值为这个位置的元素都添加到这个链表中,可以从头部插入也可以从尾部追加,甚至可以再这个位置后面再挂一个散列表。
代码实现了将文件名按字母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; }
相关文章推荐
- C语言中哈希表简单举例
- 简单介绍哈希表作用及程序举例
- C语言二维数组的应用的简单举例
- 简单的哈希表实现 C语言
- C语言-简单哈希表(hash table)
- c语言实现最简单的哈希表(开放地址线性探测法)
- 简单的C语言算法举例
- 简单的C语言算法举例
- 认识一维数组、字符数组与字符串(c语言)———(逆序数组、字符串简单拷贝)
- 抽象类简单举例
- C语言读取及修改简单配置文件内容
- C语言可变参数的简单理解-计算最大值
- 【C语言简单说】三:浮点数变量和字符变量(4)
- 基于C语言实现简单的12306火车售票系统
- C语言中,修饰符volatile的含义是什么?举例说明其使用场合
- ASP.Net连接Sqlserver简单举例
- C语言结构学习-学生成绩简单统计
- 魔方简单实现(c语言,tc2.0编译通过)不含解魔方的算法
- C语言简单的一些简单例子
- Tensorflow 简单矩阵乘法举例