哈希表-1

来源:互联网 发布:知乎 港风 编辑:程序博客网 时间:2024/05/19 10:09
//////////////////线性开放定址法(处理冲突的方法)//// 假设第一次输入ad,那么这个字符串的num(字符串多对应的数字和)就是197,它的哈希值是197%TABLE_SIZE,它的查找长度是1//假设第二次 输入bc,那么这个字符串的num就是197,它的哈希值是197%TABLE_SIZE,它的查找长度是2.////长度的值表示它的哈希值所示的位置与它所存放的位置的距离-1.//#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#define MAX_CHAR 20                         //人名长度      #define TABLE_SIZE 30                      //表长度      typedef struct {char key[MAX_CHAR];//人名int num;////////////对应数字和int len;///////////查找长度//other field}element;element hash_table[TABLE_SIZE];void init_table(element ht[]);///////////////////初始化为NULLint transform(char *key);/////////////////////////获取对应的数字和int hash(char *key);////////////////////////////散列函数void insert();//////////////////////////////////插入void linear_insert(element item,element ht[]);//插入void Display(); /////////////////////////////// 显示哈希表 void init_table(element ht[]){for (int i = 0; i < TABLE_SIZE; ++i)ht[i].key[0]=NULL;}int transform(char *key){int number = 0;while(*key)number += *key++;return number;}int hash(char *key){return (transform(key) % TABLE_SIZE);}void linear_insert(element item,element ht[]){int i;int length=1;///////////////////////////记录查找长度int hash_value=hash(item.key);i=hash_value;while(strlen(ht[i].key))//////////////////////非空情况{if(!strcmp(ht[i].key,item.key)){fprintf(stderr, "已经存在的了\n" );exit(1);}i=(i+1) % TABLE_SIZE;////////////////////////////++length;if(i==hash_value){fprintf(stderr, "哈希表已满\n" );exit(1);}}item.len=length;  ht[i]=item;/////////////////////////////////已经是空的情况}void   Display() // 显示哈希表      {int i; printf("\n\n地址\t关键字\t查找长度\t姓名\n"); //显示的格式for(i=0; i<TABLE_SIZE; i++){   printf("%d ",i);   printf("\t%d ",hash_table[i].num);   printf("\t%d ",hash_table[i].len);   printf("\t %s ",hash_table[i].key);   printf("\n");}}void insert(){element temp;     printf("%s\n", "输入人名");     scanf("%s",temp.key);     temp.num=transform(temp.key);     linear_insert(temp, hash_table);}void main(){init_table(hash_table);       char ch1;printf("\n                           哈希表的建立和查找\n");   printf("               *-------------------------------------------*\n");   printf("               |              D. 显示哈希表                |\n");   printf("               |              F. 插入                      |\n");   printf("               |              Q. 退出                      |\n");   printf("               *-------------------------------------------*\n");                    while(1){printf("\n       Option-:");fflush(stdin);    ch1=getchar();        if (ch1=='D'||ch1=='d')    Display();     else if (ch1=='F'||ch1=='f')    insert();   else if (ch1=='Q'||ch1=='q')    return;   else   {    printf("\n请输入正确的选择!");    }}}

原创粉丝点击