C語言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解
更新時(shí)間:2017年06月01日 16:47:16 投稿:lqh
這篇文章主要介紹了C語言實(shí)現(xiàn)散列表(哈希Hash表)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
C語言實(shí)現(xiàn)散列表(哈希Hash表)
實(shí)例代碼:
//散列表查找算法(Hash)
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define SUCCESS 1
#define UNSUCCESS 0
#define HASHSIZE 7
#define NULLKEY -32768
typedef int Status;
typedef struct
{
int *elem; //基址
int count; //當(dāng)前數(shù)據(jù)元素個(gè)數(shù)
}HashTable;
int m=0; // 散列表表長
/*初始化*/
Status Init(HashTable *hashTable)
{
int i;
m=HASHSIZE;
hashTable->elem = (int *)malloc(m * sizeof(int)); //申請(qǐng)內(nèi)存
hashTable->count=m;
for (i=0;i<m;i++)
{
hashTable->elem[i]=NULLKEY;
}
return OK;
}
/*哈希函數(shù)(除留余數(shù)法)*/
int Hash(int data)
{
return data % m;
}
/*插入*/
void Insert(HashTable *hashTable,int data)
{
int hashAddress=Hash(data); //求哈希地址
//發(fā)生沖突
while(hashTable->elem[hashAddress]!=NULLKEY)
{
//利用開放定址的線性探測(cè)法解決沖突
hashAddress=(++hashAddress)%m;
}
//插入值
hashTable->elem[hashAddress]=data;
}
/*查找*/
int Search(HashTable *hashTable,int data)
{
int hashAddress=Hash(data); //求哈希地址
//發(fā)生沖突
while(hashTable->elem[hashAddress]!=data)
{
//利用開放定址的線性探測(cè)法解決沖突
hashAddress=(++hashAddress)%m;
if (hashTable->elem[hashAddress]==NULLKEY||hashAddress==Hash(data)) return -1;
}
//查找成功
return hashAddress;
}
/*打印結(jié)果*/
void Display(HashTable *hashTable)
{
int i;
printf("\n//==============================//\n");
for (i=0;i<hashTable->count;i++)
{
printf("%d ",hashTable->elem[i]);
}
printf("\n//==============================//\n");
}
int main()
{
int i,j,result;
HashTable hashTable;
int arr[HASHSIZE]={13,29,27,28,26,30,38};
printf("***************Hash哈希算法***************\n");
//初始化哈希表
Init(&hashTable);
//插入數(shù)據(jù)
for (i=0;i<HASHSIZE;i++)
{
Insert(&hashTable,arr[i]);
}
Display(&hashTable);
//查找數(shù)據(jù)
result= Search(&hashTable,29);
if (result==-1)
printf("對(duì)不起,沒有找到!\n");
else
printf("29在哈希表中的位置是:%d\n",result);
return 0;
}
實(shí)現(xiàn):

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
GCC編譯過程(預(yù)處理,編譯,匯編,鏈接)及GCC命令詳解
文章詳細(xì)介紹了GCC編譯器的工作原理,包括預(yù)處理、編譯、匯編和鏈接四個(gè)主要階段,每個(gè)階段都有其特定的任務(wù)和輸出文件,文章還解釋了如何使用GCC命令選項(xiàng)來查看每個(gè)階段的輸出,以及如何通過調(diào)整編譯選項(xiàng)來優(yōu)化程序性能或調(diào)試問題,感興趣的朋友跟隨小編一起看看吧2024-11-11
C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼
這篇文章主要介紹了C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
Qt添加MSVC2017編譯器的實(shí)現(xiàn)方法
Qt添加MSVC2017編譯器是開發(fā)者在Windows平臺(tái)上進(jìn)行Qt應(yīng)用程序開發(fā)的重要步驟,本文詳細(xì)介紹了如何為Qt配置MSVC2017編譯器的具體步驟,感興趣的可以了解一下2023-09-09
C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解
這篇文章主要介紹了C語言putenv()函數(shù)和getenv()函數(shù)的使用詳解,用來進(jìn)行環(huán)境變量的相關(guān)操作,需要的朋友可以參考下2015-09-09

