C語言實現雜湊表(鏈式法)

2021-09-29 21:07:10 字數 2818 閱讀 1789

筆者最近學習資料結構中的雜湊表,並用c語言簡單實現了。

當然源**多有參考,此部落格旨在交流心得

雜湊表原理

結構體說明如下:

typedef

struct element

element;

element 代表每個儲存單元的型別,是自定義的結構體。

value 是element下儲存的值(可以自己改為其他的)。

key 是用來構建雜湊表的鍵值(是唯一不重複的值)

hash 是經雜湊函式處理後得到的值 。

typedef

struct pnode

node;

typedef

struct hash_table

hash_table;

hash_table 是雜湊表結構體。

存放有雜湊表的大小size(這裡與雜湊函式有關,我的是,remainder=11)和長度length(儲存元素數量)。

head 域儲存下圖左邊陣列下標0的位址

注:拉鍊法解決衝突的方式就是將衝突的元素接在與之衝突的節點的後面,從而形成乙個單鏈表。

部分函式說明(涉及到malloc函式使用和單鏈表的操作):

表頭初始化:

hash_table*

creat_table

(int table_size)

return h;

}

建立雜湊表,並返回表頭指標。

同時為表頭下的head域開闢長度為十一的陣列,並將其頭位址賦給head。

同時初始化表,是大小設定為 remainder 11 ,長度設定為零 , 並將head下的每個節點的next域賦值為空(防止因編譯器的原因出錯)。

void

insert

(hash_table *h , element k)

else

}

首先查詢所傳入的值是否已在雜湊表中(如果存在就退出)。

如果不存在:

開闢新的 element 域 , 並將結構體賦值給他(沒有傳位址的鍋,導致實現比較粗暴,讀者可以自己嘗試更簡單的方法。)

並計算key所對應的hash值,並將節點賦到指定位置上(涉及單鏈表的操作)

注意,無論是否衝突,實現的方式是不變的(這也是拉鍊法的好處之一,插入很方便)

查詢函式:

node *

lookup

(hash_table *h ,

int key)

return p;

}

先計算key值所對應的雜湊值,並逐一檢查所對應位置的單鏈表的節點,並返回其位址。

源**如下:

#include

#include

#define remainder 11

// 通常是質數

typedef

struct element

element;

typedef

struct pnode

node;

typedef

struct hash_table

hash_table;

inthash

(int value)

hash_table*

creat_table

(int table_size)

return h;

}node *

lookup

(hash_table *h ,

int key)

return p;

}void

insert

(hash_table *h , element k)

else

}void

destroy_table

(hash_table *h)

}free

(h->head)

;free

(h);

}void

print_table

(hash_table *h)

printf

("null\n");

}}intmain()

,,,,

};int n =

sizeof

(a)/

sizeof

(element)

; hash_table *h =

creat_table

(n);

int i =0;

for(i =

0; i

)print_table

(h);

// 列印雜湊表

printf

("%d\n\n"

,lookup

(h,12

)->data->key)

;//查詢key值為12的element

printf

("%d\n"

,h->length)

;//列印雜湊表的元素個數

destroy_table

(h);

// 摧毀雜湊表

return0;

}

源**截圖:

雜湊(雜湊) (四)C語言實現 雜湊 開雜湊法

雜湊 雜湊 的概念 c語言實現 靜態雜湊表 c語言實現 動態雜湊表 要想達到乙個好的閉雜湊減小雜湊衝突的目的 就對我們的的雜湊函式的選擇提出了要求 常見的雜湊函式有 直接定製法 設雜湊表中允許的位址數為m,取乙個不大於m,但接近或者等於m的質數p作為除數,按照雜湊函式 hash key key p ...

C語言實現雜湊表(開放位址法)

筆者最近學習資料結構中的雜湊表,並用c語言簡單實現了。此部落格旨在交流心得。這篇部落格介紹的是開放位址法構造的雜湊表 如果要參考拉鍊法構造的雜湊表,請參考這篇文章 c語言實現雜湊表 拉鍊法 結構體說明 typedef struct element element 其中data域可以改為自定義的結構體...

c語言實現鏈式儲存

h ifndef linklist h define linklist h define crt secure no warnings include include include 節點結構體 typedef struct linknode linknode typedef struct link...