[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设计
随机推荐
- Python 各种编码相互转化 (目前只有Unicode utf-8)
f='\u53eb\u6211' print f print(f.decode('unicode-escape'))
- html基础整理(02浮动 问题)
margin的塌陷现象及解决方案 如果一个大盒子中包含一个小盒子,给小盒子设置margin-top,大盒子会一起向下平移 - 解决方案: 1. 给大盒子加一个边框(border) 2. 给大盒子 ...
- 在 iOS 中使用 iconfont
如何使用自定义字体 在讲icon font之前,首先先来看看普通自定义字体是如何在ios中使用的,两个原理是一样的.这里以KaushanScript-Regular为例: Step 1: 导入字体 ...
- POJ 2209
#include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> #d ...
- 48.rocketMQ
一.简介 RocketMQ是阿里旗下的一款产品,分为开源版本和非开源版本.相比于ActiveMQ,RocketMQ支持顺序消费.事务机制.失败重试机制.消息可查询.消息订阅.较强的水平扩展能力.亿级堆 ...
- java内存的分配策略
1.概述 本文是<深入理解java虚拟机>(周志明著)3.6节的笔记整理,文章结构也与书上相同,讲述的是几条最普遍的内存分配策略. 2.对象优先在Eden分配 ** 大多数情况下,对象在新 ...
- 03-树3 Tree Traversals Again (25 分)
An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...
- excel 正则表达式用法
Private Sub RegEx_Replace() Dim myRegExp As Object Dim Myrange As Range, C As Range ...
- c# SocketAsyncEventArgs类的使用 IOCP服务器
要编写高性能的Socket服务器,为每个接收的Socket分配独立的处理线程的做法是不可取的,当连接数量很庞大时,服务器根本无法应付.要响应庞大的连接数量,需要使用IOCP(完成端口)来撤换并处理响应 ...
- 推荐几个好用的maven仓库镜像站
1.阿里云的镜像站(速度很快) <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name&g ...