⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.c

📁 hash表算法
💻 C
字号:
#include <stdio.h>#include "hash.h"void hash_init(hash_table *hash, int length){	hash->table = (hash_item **)malloc(sizeof(hash_item *) * length);//array[length],store hash_item*	memset(hash->table, 0x00, sizeof(hash_item *) * length);	hash->length = length;	hash->cur = 0;}void hash_clear(hash_table *hash){}void hash_insert(hash_table *hash, KeyType key, DataType data, HASH_KEY_PROC hash_key, KEY_EQUAL_PROC key_equal){	hash_item *new = NULL;	hash_item *get = NULL;	int index;		index =  hash_key(key) % hash->length;	get = hash->table[index];		while(get) {// if have item in table[index],enter		if(key_equal(key,get->key)) {//check if old key(get->key) equal new key(key).= re 0,!= re 1 ,break,			break;		}		get = get->next;	}//after loop, get will be NULL;	if (get) {	//have same key		new = get;	} else {		//no item or no same key		new = (hash_item *)malloc(sizeof(hash_item));		new->next = hash->table[index];	//add new item before all exist item		if (NULL == new->next)//if no item exist			hash->cur ++;		hash->table[index] = new;	}	new->key = key;//overwrite item	new->data = data;		if (hash->cur >= (hash->length))		hash_expend(hash, hash_key);}DataType hash_search(hash_table *hash, KeyType key, HASH_KEY_PROC hash_key, KEY_EQUAL_PROC key_equal, DataType invaild){	DataType ret;	hash_item *item = NULL;	int index;		ret = invaild;	index = hash_key(key) % hash->length;			item = hash->table[index];		while(item) {		if (key_equal(key, item->key)) {			ret = item->data;				break;		}		item = item->next;	}		return ret;//if item exisit && key == item->key ,return item->data,else return invaild;}void hash_for_each(hash_table *hash, HASH_PROC proc){	int i = 0;	hash_item *item =NULL;		for (i = 0; i < hash->length; i ++) {		item = hash->table[i];		int count = 0;		while(item) {	//` 			printf("count:%d\t | ", count);			proc(item->key, item->data);						item = item->next;			count ++;		}	}}void hash_expend(hash_table *tl, HASH_KEY_PROC hash_key){	int i, index;	int newLength =  tl->length * 2;	hash_item *item = NULL;	hash_item *next = NULL;	printf("expend.\n");	hash_item **newTable = (hash_item **)malloc(sizeof(hash_item *) * newLength);	memset(newTable, 0x00, sizeof(hash_item*) * newLength);	for (i = 0; i < tl->length; i ++) {		item = tl->table[i];					while (item) {			next = item->next;			index = hash_key(item->key) % newLength;				item->next = newTable[index];			newTable[index] = item;			item = next;		}	}			free(tl->table);	tl->table = newTable;	tl->length = newLength;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -