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 /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 — 元素的大小。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/12507.html