• C实现Hash表,链式结构


    typedef int KeyType; 
    typedef int ValueType; 
    
    typedef struct HashNode { 
    	KeyType _key; 
    	ValueType _value; 
    	struct HashNode* _next;
    }HashNode; 
    
    typedef struct HashTable { 
    	HashNode** _tables; 
    	size_t _size; 
    	size_t _N;    
    }HashTable; 
    
    size_t GetNextPrimeSize(size_t cur);
    size_t HashFunc(KeyType key,size_t size);
    void HashTableInit(HashTable* ht);
    int HashTableInsert(HashTable* ht, KeyType key, ValueType value);
    HashNode* HashTableFind(HashTable* ht, KeyType key); 
    int HashTableRemove(HashTable* ht, KeyType key); 
    int HashTableDestory(HashTable* ht); 
    

    /
    
    void HashTablePrint(HashTable* ht){
    	int i;
    	HashNode* cur;
    	assert(ht);
    	for(i=0;i<ht->_N;i++){
    		cur=ht->_tables[i];
    		if(cur!=NULL){
    			while(cur){
    				printf("[%d]%d  ",i,cur->_key);
    				cur=cur->_next;
    			}
    			printf("
    ");  //一个链结束换行
    		}
    	}
    	printf("
    ");
    }
    
    size_t GetNextPrimeSize(size_t cur){
    	int i;
    	static const unsigned long _PrimeList [28] ={
    		53ul,         97ul,        193ul,       389ul,       769ul,
    		1543ul,       3079ul,      6151ul,      12289ul,     24593ul,
    		49157ul,      98317ul,     196613ul,    393241ul,    786433ul,
    		1572869ul,    3145739ul,   6291469ul,   12582917ul,  25165843ul,
    		50331653ul,   100663319ul, 201326611ul, 402653189ul, 805306457ul,
    		1610612741ul, 3221225473ul, 4294967291ul
    	};
    	for(i=0;i<28;i++){
    		if(cur<_PrimeList[i])
    			return _PrimeList[i];
    	}
    	return 0;
    }
    
    
    void HashTableInit(HashTable* ht){
    	size_t i;
    	assert(ht);
    	ht->_size=0;
    	ht->_N=GetNextPrimeSize(0);
    	ht->_tables=(HashNode**)malloc(sizeof(HashNode*)*(ht->_N));
    	memset(ht->_tables,NULL,sizeof(HashNode*)*(ht->_N));
    }
    
    size_t HashFunc(KeyType key,size_t N){
    	return key%N;
    }
    
    HashNode* BuyHashNode(KeyType key, ValueType value){
    	HashNode* node=(HashNode*)malloc(sizeof(HashNode));
    	node->_key=key;
    	node->_value=value;
    	node->_next=NULL;
    	return node;
    }
    
    
    int HashTableInsert(HashTable* ht, KeyType key, ValueType value){
    	size_t i,index,curN,newN,newIndex;
    	HashNode* node, *cur,*next,**newTable,*parent;
    	assert(ht);
    
    	//增容问题
    	if(ht->_size==ht->_N){
    		curN=ht->_N;
    		newN=GetNextPrimeSize(ht->_size);
    		newTable=(HashNode**)malloc(sizeof(HashNode*)*newN);
    		for(i=0;i<curN;i++){
    			cur=ht->_tables[i];
    			while(cur){
    				next=cur->_next;
    				newIndex=HashFunc(cur->_key,newN);
    				cur->_next=newTable[newIndex];
    				newTable[newIndex]=cur;
    				cur=next;
    			}
    		}
    	}
    
    	index=HashFunc(key,ht->_N);
            
    	cur=ht->_tables[index];
            //next=ht->_tables[index];
    
    	if(cur==NULL){            //根据cur是否是头,插入
    		ht->_tables[index]=BuyHashNode(key,value);
    		return 1;
    	}
    	else{
    		while(cur){
    			if(cur->_key==key)
    				return -1;
    			parent=cur;        //两种方法,一种头插,一种用链表的方法进行尾插
    			cur=cur->_next;    
    		}
    		node=BuyHashNode(key,value);
    		parent->_next=node;
                    //node->_next=next;
                    //ht->_tables[index]=node;
    
    		return 1;
    	}
    }
    
    HashNode* HashTableFind(HashTable* ht, KeyType key){
    	int i,index;
    	HashNode* cur;
    	assert(ht);
    	index=HashFunc(key,ht->_N);
    	cur=ht->_tables[index];
    	while(cur){
    		if(cur->_key==key)
    			return cur;
    		cur=cur->_next;
    	}
    	return NULL;
    }
    
    
    int HashTableRemove(HashTable* ht, KeyType key){
    	HashNode* cur,*next;
    	assert(ht);
    	cur=HashTableFind(ht,key);
    	if(cur){
    
    		if(cur->_next==NULL){
    			ht->_tables[HashFunc(key,ht->_N)]=NULL;
                            free(cur);
    			ht->_size--;
    		}
    		else{
    			next=cur->_next;
    			cur->_key=next->_key;
    			cur->_value=next->_value;
    			cur->_next=next->_next;
    			next=NULL;
    			free(next);
    		}
    	}
    	return 0;
    }

    int HashTableDestory(HashTable* ht){
    	size_t i;
    	HashNode* cur,*next;
    	assert(ht);
    	for(i=0;i<ht->_N;i++){
    		cur=ht->_tables[i];
    		while(cur){
    			next=cur->_next;
    			free(cur);
    			cur=next;
    		}
    	}
    	free(ht->_tables);
    	ht->_tables=NULL;
    }
    
    
    void TestHashTableLink(){
    	HashTable ht;
    	HashTableInit(&ht);
    	HashTableInsert(&ht,2,10);
    	HashTableInsert(&ht,55,30);
    	HashTableInsert(&ht,25,15);
    	HashTableInsert(&ht,3,60);
    	HashTableInsert(&ht,3,90);
    	HashTableInsert(&ht,56,70);
    	HashTableInsert(&ht,109,80);
    	HashTableInsert(&ht,7,66);
    
    	HashTablePrint(&ht);
    	printf("Find 2 KEY %d
    ",HashTableFind(&ht,2)->_key);
    	HashTableRemove(&ht,25);
    	HashTablePrint(&ht);
    	HashTableDestory(&ht);
    }
    

       
  • 相关阅读:
    Element 更新以及全局设置属性
    第二次作业
    软件工程---自我介绍
    git lfs
    SUID
    G1 log 解析
    CMS jvm flags详解
    java不安全证书报证书路径找不到问题
    记一次CMS unloading class 耗时长调查
    springboot jsp 在Linux中报404问题
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615366.html
Copyright © 2020-2023  润新知