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=;
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();
}
//哈希函数
static int hash_str(char *key){
int hash=;
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=;
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=;
ht->buckets=(Bucket **)calloc(ht->size,sizeof(Bucket *));//分配内存,元素个数,每个元素大小
if(ht->buckets==NULL) return -;
printf("[init]\tsize:%i\n",ht->size);
return ;
}
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 -- 元素的大小。

[PHP] PHP数组的实现哈希表(HashTable)结构的更多相关文章

  1. Java中哈希表(Hashtable)是如何实现的

    Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...

  2. 哈希表(hashtable)的javascript简单实现

    javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...

  3. 哈希表(Hashtable)简述

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...

  4. c/c++ 哈希表 hashtable

    c/c++ 哈希表 hashtable 概念:用key去查找value 实现hash函数有很多方法,本文用除留余数法. 除留余数法的概念: 取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不 ...

  5. C#中哈希表(HashTable)的用法详解以及和Dictionary比较

    1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...

  6. 转 C#中哈希表(HashTable)的用法详解

    看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1.  哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...

  7. java——哈希表 HashTable

    在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...

  8. 哈希表 HashTable(又名散列表)

    简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...

  9. 哈希表hashTable的Java设计

    1:哈希表的概念 2:设计原理 3:哈希表的Java设计

随机推荐

  1. python网络编程--粘包解决方案 和 subprocess模块

    1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...

  2. Python3.5 学习四

    装饰器 定义:本质是函数,装饰其他函数,即为其他函数添加附加功能的 原则: 1 不能修改被装饰函数的源代码 2 不能改变被装饰函数的调用方式(对于被装饰函数来说完全透明,不会受影响) 实现装饰器功能的 ...

  3. java学习笔记—EL表达式(38)

    EL表达式 EL即Expression Language,主要的任务是帮助开发者简化获取域属性. 但是一般情况下需要使用EL和JSTL结合使用. 语法: ${ // 隐含对象|直接写域中的属性 }  ...

  4. 空行会影响 Java 编译吗?

    简评:往往越简单的问题越容易被人们忽略. 问题 这个月的 Stack Overflow 有篇热门文章是国外有位开发者提出: 当我仅仅对 Java 类增加了一行空行,为什么编译后得到了两个不同的字节码文 ...

  5. Nginx文件上传下载实现与文件管理

    1.Nginx 上传 Nginx 依赖包下载 # wget http://www.nginx.org/download/nginx-1.2.2.tar.gzinx # wget http://www. ...

  6. gitlab的简单使用

    mkdir folder //创建文件夹 cd folder/ git clone git连接 git status //git当前的状态 ls //当前目录下的所有文件 cd gitFolder 进 ...

  7. STM32-增量式旋转编码器测量

    Development kit:MDK5.14 IDE:UV4 MCU:STM32F103C8T6 一.增量式旋转编码器 1.简介 编码器(encoder)是将信号(如比特流)或数据进行编制.转换为可 ...

  8. C#-WebForm-LinQ(一)-LinQ:语言集成查询(Language Integrated Query)-增删改查、属性扩展

    LinQ-语言集成查询(Language Integrated Query) 高集成化的数据库访问技术 LINQ 2 SQL 实际是将数据库的表映射成程序中的类 会把数据库的表名原封不动的变成类名 数 ...

  9. Spring Boot 笔记汇总

    使用IDEA搭建Spring Boot入门项目 从零开始完整搭建 Spring-Boot 项目开发框架的教程 IDEA通过Maven WebApp archetype 创建Spring boot项目骨 ...

  10. Android:刚6瓶啤酒4两56度白酒下肚,居然20分钟做了一手机版网站 !

    刚6瓶啤酒4两56度白酒下肚,居然20分钟不到时间做了一手机版网站 !人有多大潜力你知道吗? 大家有兴趣的可以用手机或微信打开 http://xh.yunxunmi.com/  看看俺这酒后之做! 更 ...