代码拉取完成,页面将自动刷新
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "map.h"
#define HASH_COUNT 16 /* hash table 默认长度 */
/* 解析字符串的 hash index */
int ParseIndex(char * name, int hash_count){
int h=0;
for (h=0; *name!=0; name++)
{
h <<= 8;
h += (unsigned char) *name;
//需要对2的次幂进行求余时,可以是使用&运算符来代替%
// 0-15一共16个数是 2的4次方
// 余数肯定不会超过 2的4次方, 所以只需要对低4位按位与;
h &= hash_count-1;
}
return h;
}
//初始化Map
Map *CreateMap(){
Map * hash = (Map *)malloc(sizeof(Map));
hash->node_count = 0;
hash->hash_count = HASH_COUNT;
hash->list = (Node **)calloc(HASH_COUNT, sizeof(Node*));
return hash;
}
// 查找node
Node * FindKey(Node *n, char * key){
Node *p;
for(p=n; p; p=p->next) if( EQUAL(p->key, key) ) break;
return p;
}
//查找node-list
Node * FindNode(Node ** list, char *key){
Node *n =list(list, FindIndex(key, HASH_COUNT) );
Node *p= FindKey(n, key );
return p;
}
//赋值
int SetValue(Map *format, variable * new, char * key){
int inx = FindIndex(key, HASH_COUNT);
Node *n =list(format->list, inx);
Node *p;
for(p=n; p; p=p->next){
if( EQUAL(p->key, key) ){
p->data = new;
return 1;
}
}
Node * node = (Node *)malloc(sizeof(Node));
node->key = key;
node->data = new;
if(n){
// 如果链表存在,查找最后一个
for(p=n; p; p=p->next) if(!p->next) break;
p->next = node;
}else{
// 链表不存在, 当前节点为第1个
list(format->list, inx) = node;
}
format->node_count++;
return 0;
}
//取值
variable *GetValue(Map *format, char *key){
Node *n = FindNode(format->list, key);
if(n) {
return n->data;
}
else{
return NULL;
}
}
void MapFree(Map *format){
for(int i=0; i<HASH_COUNT; i++){
Node *n =list(format->list, i);
NodeFree(n);
}
free(format->list);
free(format);
}
void NodeFree(Node *list){
Node *p;
for(p=list; p; p=p->next) free(p);
}
VarList * GetVarListMemory(){
VarList * list = (VarList*)malloc(sizeof(VarList));
list->var = CreateMap();
return list;
}
/**
* 查找变量
*/
variable * GetMapValue(VarList *var_list, char * key, int is_exit){
if(!is_exit) return GetValue(var_list->var, key);
VarList *p;
for( p = var_list; p; p=p->next){
variable * val = GetValue(p->var, key);
if(val) return val;
}
printf("Can't find variable: %s\n", key);
exit(0);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。