[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 -- 元素的大小。

posted @ 2018-01-20 22:43  唯一客服系统开发笔记  阅读(534)  评论(0编辑  收藏  举报