数据结构之hash表

1. 查找的数据是表式结构,可以想象成是数据库里的表;

2. 查找的目的是找出表中关键字与给定关键字相等的数据行;

3. 哈希表就是定义了每一个数据行的行号;

4. 哈希算法就是 行号=f(关键字),所以在哈希表里查找数据时,不需要把给定关键字与每一行的关键字比较是否相等来找到行号,而是直接由给定的关键字计算出行号;

5.不同的关键字可能对应相同的行号,这就是冲突,最先占用此行号的数据就被放到该行,而后续和它冲突的数据则需要重新计算行号,直到找到一个尚未被占用的行号;

反过来,在搜索数据时,先计算出行号,但是这个行号里存的数据不应就是要找的,需要比较此行数据的关键字与给定的关键字是否相同,如果不同则继续计算下一个可能的行号,并继续比较,直到相同为止。

hash表在初始化时,必须给定每一个一个行号是否已经被占用的标志;在搜索时,必须判定搜的的行号对应的关键字是否确实与给定的关键字相等。

直接代码:

#define HASHSIZE 12 #define NULLKEY -32768 #include <stdio.h> #include <stdlib.h> typedef struct { int *elem; int count; }HashTable; int m = 0; /* 初始化列表*/ int InitHashTable(HashTable* H) { int i; m = HASHSIZE; H->count = m; H->elem = (int*) malloc(m*sizeof(int)); for(i=0; i<m; i++) { H->elem[i] = NULLKEY; } return 0; } /* 散列函数 */ int Hash(int key) { return key%m; } /* 填充哈希表 */ int InsertHash(HashTable *H, int key) { int addr = Hash(key); /*求散列位置 */ while(H->elem[addr] != NULLKEY) { addr = (addr+1) %m; printf("新地址:%d\n", addr); } H->elem[addr] = key; return addr; }

/* 查找Hash表 */ int SearchHash(HashTable *H, int key, int *addr) { *addr = Hash(key); while(H->elem[*addr] != key) /*如果找到的地址里存放的数据不是key */ { *addr = (*addr + 1) % m; if(H->elem[*addr] == NULLKEY || *addr == Hash(key)) /* 不存在这个关键字 */ { return -1; } } return 0; }

int main(int argc, char** argv) { HashTable H; InitHashTable(&H);

int keys[] = {48, 37, 15, 16, 29, 67, 56, 34, 47, 22, 12, 25 }; int i = 0; for(i = 0; i<(sizeof(keys)/sizeof(int)); i++) { int x = InsertHash(&H, keys[i]); printf("%d---%d\n", x, keys[i]); } int addr; int key; scanf("%d", &key); int r = SearchHash(&H, key, &addr); if(r==0) { printf("找到了! %d\n", addr); } else { printf("没找到!\n"); } return 0; }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值