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

📄 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 + -