[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=;
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)结构的更多相关文章
- Java中哈希表(Hashtable)是如何实现的
Java中哈希表(Hashtable)是如何实现的 Hashtable中有一个内部类Entry,用来保存单元数据,我们用来构建哈希表的每一个数据是Entry的一个实例.假设我们保存下面一组数据,第一列 ...
- 哈希表(hashtable)的javascript简单实现
javascript中没有像c#,java那样的哈希表(hashtable)的实现.在js中,object属性的实现就是hash表,因此只要在object上封装点方法,简单的使用obejct管理属性的 ...
- 哈希表(Hashtable)简述
一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中 ...
- c/c++ 哈希表 hashtable
c/c++ 哈希表 hashtable 概念:用key去查找value 实现hash函数有很多方法,本文用除留余数法. 除留余数法的概念: 取一个固定的基数的余数,注意不能用偶数,用偶数的话,分布会不 ...
- C#中哈希表(HashTable)的用法详解以及和Dictionary比较
1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对, ...
- 转 C#中哈希表(HashTable)的用法详解
看了一遍有关哈希表的文字,作者总结的真是不错 .收藏起来 1. 哈希表(HashTable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提 ...
- java——哈希表 HashTable
在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...
- 哈希表 HashTable(又名散列表)
简介 其实通过标题上哈希表的英文名HashTable,我们就可以看出这是一个组合的数据结构Hash+Table. Hash是什么?它是一个函数,作用可以通过一个公式来表示: index = HashF ...
- 哈希表hashTable的Java设计
1:哈希表的概念 2:设计原理 3:哈希表的Java设计
随机推荐
- django系列1--介绍与简单原理, wsgiref模块
一.web应用框架 Web应用框架(Web application framework)是一种计算机软件框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工 ...
- 数据库访问接口(ODBC、OLE DB、ADO)
最近在学C#的数据库编程,对于数据库接口技术这块的知识一直比较模糊,网上查了不少资料,看了几天还是朦朦胧胧的,只能做些笔记再研究了. 我们都知道,“数据库”是指一组相关信息的集合,最早的计算机应用之一 ...
- Android Studion有用的快捷键
注释:ctrl+/ 如果代码未添加注释,则添加注释上去:否则取消已经注释. 格式化代码:ctrl+alt+L l键不需要大写锁定,这里只是为了更清楚表示是L键.
- P3357 最长k可重线段集问题 网络流
P3357 最长k可重线段集问题 题目描述 给定平面 x-O-yx−O−y 上 nn 个开线段组成的集合 II,和一个正整数 kk .试设计一个算法,从开线段集合 II 中选取出开线段集合 S\sub ...
- acedSSGet 翻译
ObjectARX 参考指南 > 全局函数 > AcEd 全局函数 > acedSSGet 函数 acedSSGet 折叠全部 C++ int acedSSGet( const AC ...
- 【flask】 学习flask macro 模板
首先 我是看着这个链接学习的 jinja2 macro官方文档 Flask开发中Macros的实践经验 Flask的Jinja2模板引擎 — 块与宏(6th) 在宏中 还可以赋值...用set标签.. ...
- MyEclipse生成Javadoc帮助文档
Javadoc是Sun公司提供的一个技术,它从程序源代码中抽取类.方法.成员等注释形成一个和源代码配套的API帮助文档.也就是说,只要在编写程序时以一套特定的标签作注释,在程序编写完成后,通过Java ...
- .NET Core容器化之多容器应用部署-使用Docker-Compose
原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...
- 调用jdbc已经写成的方法----jdbc工具类抽取方式三
package jdbc_demo3; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.R ...
- gitLab创建自己的私有库
一.创建私有库的流程简介 创建一个项目,留着后面的流程3制作私有库 在可以创建私有库的地方创建一个code repository, code repository是代码仓库,我们把代码上传到这个仓库. ...