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

📄 hashmap.c

📁 NAT打洞
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -