`
Touch_2011
  • 浏览: 290493 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

哈希表查找(C语言实现)

阅读更多
/*
 * 题目:给定一个全部由字符串组成的字典,字符串全部由大写字母构成。其中为每个字符串编写密码,编写的
 *       方式是对于 n 位字符串,给定一个 n 位数,大写字母与数字的对应方式按照电话键盘的方式:
 *         2: A,B,C     5: J,K,L    8: T,U,V
 *         3: D,E,F     6: M,N,O    9: W,X,Y,Z
 *         4: G,H,I     7: P,Q,R,S
 * 题目给出一个1--12位的数,找出在字典中出现且密码是这个数的所有字符串。字典中字符串的个数不超过5000。
 *        
 * 思路:1.回溯法找出所有可能的字符串
 *       2.在字典中查找此字符串是否存在。(字典存储采用哈希表存储) 
 *
 */

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

#define HASHTABLE_LENGTH 5001  //哈希表长度
#define STRING_LENGTH   13     //单词最大长度

//字符串
typedef struct
{
	char str[STRING_LENGTH];
	int length;
}HString;

HString string={'\0',0};             //暂存可能的字符串
HString hashTable[HASHTABLE_LENGTH]; //哈希表

//hash函数,构造哈希表
void createHashTable(char *str)
{
	int i,key,step=1;
	i=key=0;
	while(str[i]){
		key+=str[i++]-'A';
	}
	key%=HASHTABLE_LENGTH;
	while(1){
		if(hashTable[key].length==0){
			hashTable[key].length=strlen(str);
			strcpy(hashTable[key].str,str);
			break;
		}
		key=(key+step+HASHTABLE_LENGTH)%HASHTABLE_LENGTH;
		//处理冲突,线性探测再散列
		if(step>0)
    		step=-step;
		else{
			step=-step;
			step++;
		}
	}
}

//从文件中读字典
void readString()
{
	int i;
	char str[STRING_LENGTH];
	char ch;
	FILE *fp;
    if((fp=fopen("document/dictionary.txt","r"))==NULL){   
       printf("can not open file!\n");   
       exit(0);   
    }  
	
    i=0;
    while((ch=getc(fp))!=EOF){   
        if(ch=='\n'){//读完一个字符串
			str[i]='\0';
            createHashTable(str);
			i=0;
			continue;
		}
		str[i++]=ch;
	}

    if(fclose(fp)){   
        printf("can not close file!\n");   
        exit(0);   
    }   
}

//在哈希表中查找是否存在该字符串,存在返回1,不存在返回0
int search(char *str)
{
	int i,key,step=1;
	i=key=0;
	while(str[i]){
		key+=str[i++]-'A';
	}
	key%=HASHTABLE_LENGTH;
	while(1){
		if(hashTable[key].length==0)
			return 0;
		if(strcmp(hashTable[key].str,str)==0){
			return 1;
		}
		key=(key+step+HASHTABLE_LENGTH)%HASHTABLE_LENGTH;
		//处理冲突,线性探测再散列
		if(step>0)
    		step=-step;
		else{
			step=-step;
			step++;
		}
	}
	return 0;
}

//求所有可能的字符串
void getString(char* num)
{
	int i,digit,max;
	if(*num==0){//递归出口,字符串已到末尾
		string.str[string.length]='\0';
        if(search(string.str))//这个字符串存在于字典中,输出
			puts(string.str);
		return;
	}

	digit=*num-'0';//取第一位字符,转成数字
	if(digit>=2&&digit<=6){
		i=(digit-2)*3+'A';
		max=(digit-2)*3+'A'+3;
	}
	else if(digit==7){
		i='P';
		max='P'+4;
	}
	else if(digit==8){
		i='T';
		max='T'+3;
	}
	else if(digit==9){
		i='W';
		max='W'+4;
	}

	for(i;i<max;i++){
		string.str[string.length++]=i;
        getString(num+1); //递归
		string.length--;
	}
}

void main()
{
	char num[STRING_LENGTH];   //由于输入的数字超出了unsigned long的范围,所以用字符串来存储
	readString();              //把字典从文件中读入内存
    printf("please inputer an number(1--12位,不能有0或1)\n");
    scanf("%s",num);
	getString(num);
}


 

0
1
分享到:
评论

相关推荐

    哈希表的c语言实现1

    哈希表是一种高效的数据结构,它通过特定的算法——哈希函数,将任意大小的键(key)映射到一个固定大小的数组索引上,从而实现快速的查找、插入和删除操作。在C语言中实现哈希表,通常会采用两种主要方法:哈希取...

    哈希表的设计与实现C语言

    在"计科0801 第十六组"这个压缩包中,可能包含了上述哈希表设计与实现的具体C语言代码实例,包括哈希函数的实现、键值对结构体、哈希表结构体定义以及插入、查找和删除操作的函数。这些案例对于学习哈希表的实现非常...

    数据结构实验五哈希表设计c语言

    在本实验中,我们实现了一个基本的哈希表查找算法。该算法首先根据学生姓名计算哈希值,然后定位到对应的链表,最后遍历链表以找到目标学生信息。 哈希表的应用 在本实验中,我们使用哈希表来存储学生信息,并实现...

    哈希表的建立与查找 C语言 数据结构练习

    在本题中,我们面临的是一个C语言实现的练习,需要创建一个哈希表来存储30个中国人姓名的汉语拼音,并确保平均查找长度不超过2。这涉及到哈希函数的设计、冲突解决策略以及C语言编程技巧。 首先,我们需要设计一个...

    C语言:基于哈希表的姓名查找(含完整注释)

    任务:针对某个集体(比如你所在的班级)中的“姓名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。 要求:假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的...

    用C语言实现一个简单的哈希表(hash table)

    总结,这个C语言实现的哈希表是一个基础教学案例,涵盖了哈希表的核心概念,包括哈希函数设计、冲突解决以及在C语言中的实际编码。通过对这个程序的学习,你可以深入理解哈希表的工作原理,并为将来更复杂的数据结构...

    hashtab2_C语言_哈希表删除、添加、寻找_codeblocks_

    哈希表是一种高效的数据结构,它通过特定的函数(哈希函数)将数据映射到一个固定大小的数组中,以此实现快速的查找、插入和删除操作。在C语言中,我们可以手动构建哈希表来处理这些操作。Code::Blocks是一款流行的...

    C语言实现的Hash哈希表

    了解和掌握哈希表的原理及C语言实现,对提升编程技能和解决实际问题大有裨益。在提供的压缩包文件"hash"中,可能包含了具体的C语言代码实现,通过阅读和学习这些代码,你可以更深入地理解哈希表的工作机制。

    C语言实现哈希表(源码+解析)

    哈希表节点结构 struct Node:表示哈希表中的一个节点,包含键、值以及指向下一个节点的指针。 哈希表结构 struct HashTable:表示哈希表,包含一个存储节点指针的数组。 创建哈希表函数 createHashTable:动态...

    哈希表操作(c语言版)

    ////采用除留余数法定义哈希表,哈希表长度为10,哈希函数为H(key)=key%13。产生冲突时采用线性探测法...////(2)在哈希表中查找元素 ////(3)在哈希表中插入元素 ////(4)输出哈希表中所有元素 ////(5)建立Hash表

    C语言设计哈希表实现图书查找

    C语言设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 1) 记录由外部输入。 2) 将生成...

    哈希表-使用C语言实现哈希表数据结构-HashTable.zip

    使用C语言实现哈希表数据结构_HashTable"这个压缩包很可能包含了具体的C语言代码示例,通过阅读和理解这些代码,你可以深入学习哈希表的实现细节,包括如何定义结构体、如何定义和应用哈希函数、如何处理冲突以及...

    哈希表的建立与运用C语言实现哈希表的建立与运用C语言实现

    以上就是使用C语言实现哈希表的基本流程和关键操作。实际应用中,还需要考虑负载因子、动态扩容等问题,以确保哈希表的性能。通过理解和实践这些知识点,可以深入掌握哈希表的工作原理,提高程序的效率。

    C语言实现简单易用哈希表

    以上就是从标题和描述中推断出的关于C语言实现简单哈希表的一些关键知识点。具体实现细节,如哈希函数的具体形式、链表节点的结构、API的实现方式等,需要查看`strmap.c`和`strmap.h`文件才能得知。

    哈希表实验C语言版实现

    在本实验中,哈希表的C语言实现主要涉及以下几个核心知识点: 1. **哈希表的基本结构**:哈希表由一组数组元素组成,每个元素包含一个关键字域(KeyType key)和一个序号域(int ord)。在C语言中,使用结构体...

    哈希表应用 设计哈希表实现图书查找系统,完成相应的建表和查表程序。c语言课设

    设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 (1)记录由外部输入。 (2)生成的哈希...

    哈希链表c语言实现,可以直接用来做项目

    哈希链表是一种高效的数据结构,它结合了哈希表的快速查找特性和链表的灵活插入删除功能。在C语言中实现哈希链表,需要理解哈希函数、链表结构以及如何将两者结合起来。这里我们将深入探讨哈希链表的概念、C语言中的...

    C语言基于哈希表实现通讯录.doc

    C语言基于哈希表实现通讯录 在本文中,我们将探讨使用C语言基于哈希表实现通讯录的方法。哈希表是一种高效的数据结构,能够快速地存储和查找数据。在本文中,我们将通过设计和实现一个通讯录系统,来展示哈希表的...

    用C语言实现的哈希表设计

    用C语言实现的哈希表设计,内有姓名列表,只要输入姓名就可得到查到在哈希表中的相应位置

Global site tag (gtag.js) - Google Analytics