用C語言實現一個鍵值對結構demo
阿新 • • 發佈:2018-12-22
主要思路是有兩個指標陣列,一個為key,一個為value,用索引一一對應實現一個key對應一個value。包括了增加和刪除,控制檯列印方法,現在仍有些指標指向記憶體類的bug需注意。這個程式嚴格來說還算不上雜湊。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 5 //還是需要設定佇列大小
//結構體包含鍵值對需要的內容
typedef struct {
char * key[MAX] ;
char * value[MAX] ;
int len ;
}HASH;
int init(HASH * hash){
int ret = 1 ;
hash->len = MAX ;
int i ;
for(i = 0 ; i < hash->len ; i ++){
hash->key[i] = NULL ;//用NULL來初始化
hash->value[i] = NULL ;
}
for(i = 0 ; i < hash->len ; i ++){
if((hash->key[i] != '\0' ) || (hash->value[i] != '\0')){
ret = 0 ;
}
}
return ret ;
}
int isFull(HASH * hash){
int ret = 1 ;
int i ;
for(i = 0 ; i < hash->len ; i ++){
if(hash->key[i] == '\0'){//\0'同0,避免NULL在不同機器上邏輯地址的衝突
ret = 0 ;
goto OUT ;
}
}
OUT :
return ret ;
}
int isEmpty(HASH * hash){
int ret = 1 ;
int i ;
for(i = 0 ; i < hash->len ; i ++){
if (hash->key[i] != '\0'){
ret = 0 ;
goto OUT ;
}
}
OUT :
return ret ;
}
int insert(HASH * hash , char * strKey , char * strValue){
int ret = 1 ;
if(isFull(hash)){
ret = -1 ;
goto OUT ;
}
int i ;
for(i = 0 ; i < hash->len ; i ++){
if(hash->key[i] == '\0'){
hash->key[i] = strKey ;
hash->value[i] = strValue ;
break ;
}
}
OUT :
return ret ;
}
int delstr(HASH * hash , char * strKey){
int ret = 0 ;
if(isEmpty(hash)){
ret = -1 ;
goto OUT ;
}
int i ;
for(i = 0 ; i < hash->len ; i ++){
if(hash->key[i] == strKey){
hash->key[i] = NULL ;
hash->value[i] = NULL ;
ret = 1 ;
goto OUT ;
}
}
ret = -2 ;
OUT :
return ret ;
}
void printHash(HASH * hash){
int i ;
for(i = 0 ; i < hash->len ; i ++){
printf("key[%d]: %s ----- value[%d]: %s\n" , i , hash->key[i] , i , hash->value[i] ) ;
}
}
int main(){
int ret ;
OUT :
return ret ;
}