[PHP] PHP数组的实现哈希表(HashTable)结构详解编程语言

PHP中使用最为频繁的数据类型非字符串和数组莫属,使用哈希表实现的PHP数组。
1.数据结构:保存哈希表容器,保存数据的容器
2.哈希函数实现:需要尽可能的将不同的key映射到不同的槽(bucket)中,首先我们采用一种最为简单的哈希算法实现,将key字符串的所有字符加起来,然后以结果对哈希表的大小取模,这样索引就能落在数组索引的范围之内了
3.操作接口函数:初始化,查找,插入,删除,销毁

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#define HASH_TABLE_INIT_SIZE 7 
static int hash_str(char *key);//哈希函数 
//数据结构容器 
//保存数据的容器 
typedef struct _Bucket{ 
char *key;// 
void *value;// 
struct _Bucket *next;//单链表 
} Bucket; 
//哈希表容器 
typedef struct _HashTable{ 
int size;//大小 
int elem_num;//元素个数 
Bucket** buckets;//二级指针,指向Bucket*的指针 
} HashTable; 
int hash_init(HashTable *ht);                               // 初始化哈希表 
int hash_lookup(HashTable *ht, char *key, void **result);   // 根据key查找内容 
int hash_insert(HashTable *ht, char *key, void *value);     // 将内容插入到哈希表中 
int hash_remove(HashTable *ht, char *key);                  // 删除key所指向的内容 
int hash_destroy(HashTable *ht); 
int main(){ 
HashTable ht; 
hash_init(&ht);//初始化 
hash_insert(&ht,"name","taoshihan");//插入 
//练习二级指针 
int a=100; 
int *p1=&a; 
int **p2=&p1; 
printf("%d,%d,%d /n",a,*p1,**p2);//100,100,100   
//字符串练习 
char *str="tao"; 
printf("%c/n",*str);//输出t 
while(*str!='/0'){ 
printf("%c/n",*str); 
str++; 
}//使用指针的方式来输出字符串 
char a1='a'; 
char a2='b'; 
int a3=a1+a2; 
printf("%d/n",a3);//输出195 转成ASCII码相加 
return(0); 
} 
//哈希函数 
static int hash_str(char *key){ 
int hash=0; 
char *cur=key; 
while(*cur != '/0'){ 
hash+=*cur; 
cur++; 
} 
return hash % HASH_TABLE_INIT_SIZE; 
} 
//初始化函数 
int hash_init(HashTable *ht){ 
//哈希函数 
static int hash_str(char *key){ 
int hash=0; 
char *cur=key; 
while(*cur != '/0'){ 
hash+=*cur; 
cur++; 
} 
return hash % HASH_TABLE_INIT_SIZE; 
} 
//初始化函数 
int hash_init(HashTable *ht){ 
ht->size=HASH_TABLE_INIT_SIZE;//结构体指针成员赋值 
ht->elem_num=0; 
ht->buckets=(Bucket **)calloc(ht->size,sizeof(Bucket *));//分配内存,元素个数,每个元素大小 
if(ht->buckets==NULL) return -1; 
printf("[init]/tsize:%i/n",ht->size); 
return 1; 
} 
int hash_insert(HashTable *ht,char *key,void *value){ 
int index=hash_str(key); 
printf("hash index:%d/n",index); 
}

 

 

字符串:
1.没有专门的字符串变量,通常就用一个字符数组来存放一个字符串。
2.字符串总是以’/0’作为串的结束符
3.字符串指针,使用指针的方式来输出字符串

C语言中的 static变量、static函数
1.在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
2.static修饰全局变量的时候,这个全局变量只能在本文件中访问
3.static修饰一个函数,则这个函数的只能在本文件中调用

calloc函数
void *calloc(size_t nitems, size_t size) 分配所需的内存空间,并返回一个指向它的指针。malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。
nitems — 要被分配的元素个数。
size — 元素的大小。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12507.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论