hashmap.c

来自「NAT打洞」· C语言 代码 · 共 90 行

C
90
字号
#include "hashmap.h"

HASHMAP *hashmap(void){
  	HASHMAP *res = (HASHMAP*)malloc(sizeof(HASHMAP));
  	int i;
  	memset(res, 0, sizeof(HASHMAP));
  	for(i = 0; i < 1024; i++){
  		res->list[i] = NULL;
  	}
  	return res;
}

void hashmap_put(HASHMAP *hm, unsigned int key, void *value){
  	unsigned int hash = key % 1024;

  	HASHMAP_ENTRY *ptr = hm->list[hash];
  	while(ptr != NULL){
    	if(ptr->key == key){
    		ptr->value = (char*)value;
	    	return;
    	}
    	ptr = ptr->next;
  	}

  	ptr = (HASHMAP_ENTRY*)malloc(sizeof(HASHMAP_ENTRY));
  	ptr->next = hm->list[hash];
  	ptr->key = key;
  	ptr->value = (char*)value;

  	hm->list[hash] = ptr;
}

void* hashmap_get(HASHMAP *hm, unsigned int key){
  	unsigned int hash = key % 1024;

  	HASHMAP_ENTRY *ptr = hm->list[hash];
  	while(ptr != NULL){
    	if(ptr->key == key){
    		return ptr->value;
    	}
    	ptr = ptr->next;
  	}

  	return NULL;
}

void *hashmap_remove(HASHMAP *hm, unsigned int key){
  	unsigned int hash = key % 1024;
  	void *res;

  	HASHMAP_ENTRY *ptr = hm->list[hash];
  	while(ptr != NULL){
    	if(ptr->key == key){
    		res = ptr->value;
    		ptr->value = NULL;
      		return res;
    	}
    	ptr = ptr->next;
  	}
  	return NULL;

}

void hashmap_print(HASHMAP *hm, void (__cdecl *print_value)(char*)){
	int i, j, n = 0;
  	if(hm == NULL){
  		return;
  	}
  	printf("[");
  	for(j = 0; j < 1024; j++){
	  	HASHMAP_ENTRY *ptr = hm->list[j];
  		while(ptr != NULL){
      		if(ptr->value != NULL){
	    		if(n > 0){
  	    			printf(", ");
    	  		}
        		printf("%d", ptr->key);
        		if(print_value != NULL){
          			print_value(ptr->value);
        		}
        		n++;
      		}
	    	ptr = ptr->next;
    	}
  	}
  	printf("]\n");
}


⌨️ 快捷键说明

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