zoukankan      html  css  js  c++  java
  • [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 
    ",a,*p1,**p2);//100,100,100  
    
            //字符串练习
            char *str="tao";
            printf("%c
    ",*str);//输出t
            while(*str!=''){
                    printf("%c
    ",*str);
                    str++;
            }//使用指针的方式来输出字符串
            char a1='a';
            char a2='b';
            int a3=a1+a2;
            printf("%d
    ",a3);//输出195 转成ASCII码相加
    
            return(0);
    }
    //哈希函数
    static int hash_str(char *key){
            int hash=0;
            char *cur=key;
            while(*cur != ''){
                    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 != ''){
                    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]	size:%i
    ",ht->size);
            return 1;
    }
    int hash_insert(HashTable *ht,char *key,void *value){
            int index=hash_str(key);
            printf("hash index:%d
    ",index);
    }

    字符串:
    1.没有专门的字符串变量,通常就用一个字符数组来存放一个字符串。
    2.字符串总是以''作为串的结束符
    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 -- 元素的大小。

  • 相关阅读:
    Android AsyncTask
    Eclipse 快捷键
    Android JSON数据的读取和创建
    Android 原生listview item伸展收缩效果 (续)
    Android 原生listview item伸展收缩效果
    Android listview 禁止滑动
    Android R.layout. 找不到已存在的布局文件
    Android ScrollView
    Android android:clickable 问题
    Codeforces 388C Fox and Card Game (贪心博弈)
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8322229.html
Copyright © 2011-2022 走看看