前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[PHP] PHP数组的实现哈希表(HashTable)结构

[PHP] PHP数组的实现哈希表(HashTable)结构

作者头像
唯一Chat
发布2019-09-10 13:01:03
1.2K0
发布2019-09-10 13:01:03
举报
文章被收录于专栏:陶士涵的菜地

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

代码语言:javascript
复制
#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 -- 元素的大小。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档