哈希表的灵魂在于哈希函数;
这么简单的哈希表(散列表),我半天没有理解,虽然网上的资料很多,但是我还想再阐述以下
ps,我领导说我的sop做的不好,好的sop是白痴站在面前都能看懂!!!
拉链式的散列表,将输入元素通过转换(哈希函数)后的关键字,来决定放到哪个桶里面,桶可以是一个线性链表,(网上叫拉链,解决多个元素对应一个关键字的冲突)
灵机一动,利用字典取首字母查询单词的逻辑,写出数组的哈希表;
源码走起
-----------------------------------------------------------------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#define N 10000
#define K 1000
typedef struct link S_L;
struct link {
int n;
S_L* p;
};
void happen_rand(int* p, int n);//生成随机数
void hash(int* p , int n);//生成散列表
int F(int x);//hash函数
S_L* hash_table[100] = { NULL };//哈希表
S_L tmp;
int main() {
int array[N] = { 0 };
happen_rand(array,N);
for (int i = 0; i < N; i++) {//插入元素到哈希表中
hash(array, array[i]);
}
;
}
void happen_rand(int* p, int n)
{
for (int i = 0; i < N; i++) {
p[i] = rand() % K;
}
}
int F(int x) {
if (x < 10) return 0;
else
{
while (x > 99)
x /= 10;
}
return x;
}
void hash(int* p, int n) {
S_L * ptmp ;
int y = F(n);
if (hash_table[y] == NULL) {
hash_table[y] = (S_L*)malloc(sizeof(S_L));
hash_table[y]->n = n;
hash_table[y]->p = NULL;
return;
}
else
ptmp= hash_table[y];
while ((ptmp)->p != NULL) ptmp = (ptmp)->p;
ptmp->p = (S_L*)malloc(sizeof(S_L));
(ptmp)->p->n = n;
(ptmp)->p->p = NULL;
}
#include<stdio.h>
#include<malloc.h>
#define N 10000
#define K 1000
typedef struct link S_L;
struct link {
int n;
S_L* p;
};
void happen_rand(int* p, int n);//生成随机数
void hash(int* p , int n);//生成散列表
int F(int x);//hash函数
S_L* hash_table[100] = { NULL };//哈希表
S_L tmp;
int main() {
int array[N] = { 0 };
happen_rand(array,N);
for (int i = 0; i < N; i++) {//插入元素到哈希表中
hash(array, array[i]);
}
;
}
void happen_rand(int* p, int n)
{
for (int i = 0; i < N; i++) {
p[i] = rand() % K;
}
}
int F(int x) {
if (x < 10) return 0;
else
{
while (x > 99)
x /= 10;
}
return x;
}
void hash(int* p, int n) {
S_L * ptmp ;
int y = F(n);
if (hash_table[y] == NULL) {
hash_table[y] = (S_L*)malloc(sizeof(S_L));
hash_table[y]->n = n;
hash_table[y]->p = NULL;
return;
}
else
ptmp= hash_table[y];
while ((ptmp)->p != NULL) ptmp = (ptmp)->p;
ptmp->p = (S_L*)malloc(sizeof(S_L));
(ptmp)->p->n = n;
(ptmp)->p->p = NULL;
}