Rumah pembangunan bahagian belakang tutorial php 兑现极小一部分PHP的HASHMAP

兑现极小一部分PHP的HASHMAP

Jun 13, 2016 am 11:03 AM
gt hashtable ht

实现极小一部分PHP的HASHMAP
又修改了一下,实现了resize

#include <stdlib.h>#include <stdio.h>#include <string.h>#include <malloc.h>#include <math.h>typedef struct bucket{	int h;  	char* key;	void* pData;	struct bucket* pNext;	struct bucket* pLast;}Bucket;typedef struct hashtable{	int size;	int elementsNum;	int mask;	Bucket** arBuckets; //这是一个存放buckets的array }HashTable;/** **  这是一个计算HASH值的算法 **/int time33(char* arKey,int arlength){	int h = 0;	int i;	for(i=0;i<arlength;i++){		h = h*33 + (int)*arKey++;	}	return h;	}/** **  初始化一个大小是1的HASHTABLE  **/int _init_hash_table(HashTable** ht){	*ht = (HashTable*)malloc(sizeof(HashTable));	(*ht)->size = 1;	(*ht)->mask = (*ht)->size - 1;	    (*ht)->elementsNum = 1;	(*ht)->arBuckets = (Bucket**)malloc(sizeof(Bucket*)*(*ht)->size);	memset((*ht)->arBuckets,0,sizeof(Bucket*)*(*ht)->size);	return 1;		} int _hash_link_bucket_to_bucket_head(Bucket** newBucket,Bucket** bucketHead){	if(*bucketHead==NULL){		*bucketHead = *newBucket;			}else{		(*newBucket)->pNext = (*bucketHead)->pNext;		(*newBucket)->pLast = (*bucketHead);		if((*bucketHead)->pNext != NULL){			(*bucketHead)->pNext->pLast = *newBucket;			}		(*bucketHead)->pNext = *newBucket;		}	return 1;}int _hash_new_bucket(Bucket** newBucket,int hash,char* arkey,void* pData){	(*newBucket) = (Bucket*)malloc(sizeof(Bucket));	(*newBucket)->h = hash;	(*newBucket)->key = arkey;	(*newBucket)->pData = pData;	(*newBucket)->pNext = NULL;	(*newBucket)->pLast = NULL;	return 1;}int _hash_rehash(HashTable* ht){	int i = 0;	//由于我没定义pListNext指针,所以只能这样rehash了。 	for( ; i<ht->size ; i++){		if(ht->arBuckets[i] != NULL){			int index = ht->arBuckets[i]->h & ht->mask ;			if(i != index){				_hash_link_bucket_to_bucket_head(&ht->arBuckets[i],&ht->arBuckets[index]);				ht->arBuckets[i] = NULL;				}			}		}	return 1;		}/** **  将HASHTABLE的大小扩容1倍  **/int _hash_resize(HashTable* ht){	if(ht != NULL){		ht->size = ht->size << 1;		ht->mask = ht->size - 1; 		realloc(&ht->arBuckets,sizeof(Bucket*) * ht->size);		int i;		for(i=ht->size>>1;i<ht->size;i++){			ht->arBuckets[i] = NULL;		}		//memset(ht->arBuckets[0],NULL,sizeof(Bucket*) * (ht->size >> 1));		printf("resize:%i\r\n", ht->size);		_hash_rehash(ht);		return 1;			}	return 0;}/** **  往HASHTABLE中添加元素  **/int _hash_add_or_update(HashTable* ht,char* arKey,int arLength,void* pData){	int h = time33(arKey,arLength);	int index = h & ht->mask;	Bucket* p = ht->arBuckets[index]; 	while(p!=NULL){		if(strcmp(arKey,p->key)==0){			//这里应该执行更新操作			free(p->pData);			p->pData = pData; 			return 1;		}		p = p->pNext;			}	Bucket* newBucket;	_hash_new_bucket(&newBucket,h,arKey,pData);	_hash_link_bucket_to_bucket_head(&newBucket,&ht->arBuckets[index]);	ht->elementsNum++;	if(ht->elementsNum = ht->size){		_hash_resize(ht);	}	return 0;	}void* _hash_find(HashTable* ht,char* arKey,int arLength){	int h = time33(arKey,arLength);	int index = h & ht->mask;	Bucket* p = ht->arBuckets[index]; 	while(p!=NULL){		if(strcmp(arKey,p->key)==0){			return p->pData;		}		p = p->pNext;	}	return 0;}int PUT(HashTable* ht,void* key,void* value){	char* arKey = (char*)key;	int len = strlen(arKey);	return _hash_add_or_update(ht,arKey,len,value);	}void* GET(HashTable* ht,void* key){	char* arKey = (char*)key;	int len = strlen(arKey);	return _hash_find(ht,arKey,len);}int main(){	printf("%s\r\n","这是一个hashtable的例子");	HashTable* ht;	_init_hash_table(&ht);	PUT(ht,"1","mengjun");	PUT(ht,"2","aaaaa");	PUT(ht,"3","fff");	PUT(ht,"24","eee");	PUT(ht,"25","ddd");	printf("%s\r\n",(char*)GET(ht,"1"));	printf("%s\r\n",(char*)GET(ht,"2"));	printf("%s\r\n",(char*)GET(ht,"3"));	printf("%s\r\n",(char*)GET(ht,"24"));	printf("%s\r\n",(char*)GET(ht,"25"));	printf("HASHTABLE总共有元素%i个\r\n",ht->elementsNum);	return 0;}
Salin selepas log masuk

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah perbezaan antara Huawei GT3 Pro dan GT4? Apakah perbezaan antara Huawei GT3 Pro dan GT4? Dec 29, 2023 pm 02:27 PM

Ramai pengguna akan memilih jenama Huawei apabila memilih jam tangan pintar Antaranya, Huawei GT3pro dan GT4 adalah pilihan yang sangat popular. Apakah perbezaan antara Huawei GT3pro dan GT4? 1. Rupa GT4: 46mm dan 41mm, bahan cermin kaca + badan keluli tahan karat + cangkang belakang gentian resolusi tinggi. GT3pro: 46.6mm dan 42.9mm, bahannya ialah kaca nilam + badan titanium/badan seramik + cangkerang belakang seramik 2. GT4 yang sihat: Menggunakan algoritma Huawei Truseen5.5+ terkini, hasilnya akan lebih tepat. GT3pro: Penambahan elektrokardiogram ECG dan saluran darah serta keselamatan

Betulkan: Alat snipping tidak berfungsi dalam Windows 11 Betulkan: Alat snipping tidak berfungsi dalam Windows 11 Aug 24, 2023 am 09:48 AM

Mengapa Alat Snipping Tidak Berfungsi pada Windows 11 Memahami punca masalah boleh membantu mencari penyelesaian yang betul. Berikut ialah sebab utama Alat Snipping mungkin tidak berfungsi dengan betul: Focus Assistant dihidupkan: Ini menghalang Snipping Tool daripada dibuka. Aplikasi rosak: Jika alat snipping ranap semasa pelancaran, ia mungkin rosak. Pemacu grafik lapuk: Pemacu yang tidak serasi mungkin mengganggu alat snipping. Gangguan daripada aplikasi lain: Aplikasi lain yang sedang berjalan mungkin bercanggah dengan Alat Snipping. Sijil telah tamat tempoh: Ralat semasa proses naik taraf boleh menyebabkan penyelesaian mudah ini sesuai untuk kebanyakan pengguna dan tidak memerlukan sebarang pengetahuan teknikal khusus. 1. Kemas kini apl Windows dan Microsoft Store

Cara Membetulkan Ralat Tidak Dapat Menyambung ke App Store pada iPhone Cara Membetulkan Ralat Tidak Dapat Menyambung ke App Store pada iPhone Jul 29, 2023 am 08:22 AM

Bahagian 1: Langkah Penyelesaian Masalah Awal Menyemak Status Sistem Apple: Sebelum menyelidiki penyelesaian yang rumit, mari kita mulakan dengan asas. Masalahnya mungkin tidak terletak pada peranti anda; Lawati halaman Status Sistem Apple untuk melihat sama ada AppStore berfungsi dengan betul. Jika terdapat masalah, anda hanya boleh menunggu Apple membetulkannya. Semak sambungan Internet anda: Pastikan anda mempunyai sambungan internet yang stabil kerana isu "Tidak dapat menyambung ke AppStore" kadangkala boleh dikaitkan dengan sambungan yang lemah. Cuba tukar antara Wi-Fi dan data mudah alih atau tetapkan semula tetapan rangkaian (Umum > Tetapkan Semula > Tetapkan Semula Tetapan Rangkaian > Tetapan). Kemas kini versi iOS anda:

Menggunakan kaedah isEmpty() kelas Hashtable dalam Java untuk menentukan sama ada jadual hash kosong Menggunakan kaedah isEmpty() kelas Hashtable dalam Java untuk menentukan sama ada jadual hash kosong Jul 24, 2023 pm 02:21 PM

Di Java, kaedah isEmpty() kelas Hashtable digunakan untuk menentukan sama ada jadual hash adalah salah satu struktur data yang biasa digunakan dalam rangka kerja pengumpulan Java berpasangan. Dalam kelas Hashtable, kaedah isEmpty() digunakan untuk menentukan sama ada jadual hash kosong. Artikel ini akan memperkenalkan cara menggunakan kaedah isEmpty() kelas Hashtable dan memberikan contoh kod yang sepadan. Pertama, kita perlu memahami kelas Hashtable. Hash

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Adakah watch4pro lebih baik atau gt? Adakah watch4pro lebih baik atau gt? Sep 26, 2023 pm 02:45 PM

Watch4pro dan gt masing-masing mempunyai ciri yang berbeza dan senario yang berkenaan Jika anda menumpukan pada fungsi yang komprehensif, prestasi tinggi dan penampilan yang bergaya, dan sanggup menanggung harga yang lebih tinggi, maka Watch 4 Pro mungkin lebih sesuai. Jika anda tidak mempunyai keperluan fungsi yang tinggi dan memberi lebih perhatian kepada hayat bateri dan harga yang berpatutan, maka siri GT mungkin lebih sesuai. Pilihan terakhir harus diputuskan berdasarkan keperluan peribadi, belanjawan dan keutamaan Adalah disyorkan untuk mempertimbangkan dengan teliti keperluan anda sendiri sebelum membeli dan merujuk kepada ulasan dan perbandingan pelbagai produk untuk membuat pilihan yang lebih termaklum.

Gunakan kaedah containsKey() kelas Hashtable dalam Java untuk menentukan sama ada kunci wujud dalam jadual hash Gunakan kaedah containsKey() kelas Hashtable dalam Java untuk menentukan sama ada kunci wujud dalam jadual hash Jul 25, 2023 pm 12:00 PM

Dalam Java, kaedah containsKey() kelas Hashtable digunakan untuk menentukan sama ada kunci wujud dalam jadual cincang Dalam pengaturcaraan Java, kelas Hashtable boleh digunakan untuk menyimpan dan mengurus data menggunakan jadual cincang. Jadual cincang ialah struktur data yang digunakan untuk menyimpan pasangan nilai kunci, membolehkan akses data pantas dengan memetakan kunci kepada nilai. Dalam proses pengaturcaraan sebenar, kita selalunya perlu menentukan sama ada kunci khusus wujud dalam jadual cincang. Untuk mencapai fungsi ini, kita boleh menggunakan kelas Hashtable untuk menyediakan

Apakah syiling HT? Adakah HT Coin bernilai? Apakah syiling HT? Adakah HT Coin bernilai? Feb 27, 2024 pm 10:49 PM

HT Coin: Mata wang platform Huobi dengan potensi tanpa had Pengenalan HT Coin ialah mata wang platform Huobi Global dan telah dilancarkan secara rasmi pada 16 Januari 2018. Jumlah edaran ialah 500 juta, di mana 60% digunakan untuk peredaran pasaran, dan baki 40% diperuntukkan kepada insentif pasukan, pembinaan ekologi, pembelian semula dan pemusnahan, dsb. Tujuan Kegunaan utama syiling HT termasuk: Pengurangan yuran transaksi: Pemegang syiling HT boleh menikmati pengurangan yuran transaksi apabila berdagang di Huobi Global. Semakin besar pegangan, semakin tinggi nisbah pengurangan. Sertai IEO: Pemegang syiling HT mempunyai keutamaan untuk menyertai IEO di Huobi Global. Pinjaman gadai janji: Syiling HT boleh digadaikan dan dipinjam di Huobi Global. Sertai dalam tadbir urus komuniti: Pemegang syiling HT boleh mengambil bahagian dalam tadbir urus komuniti Huobi Global dan membuat cadangan untuk pembangunan platform.

See all articles