hash表之拉鍊法處理衝突

2021-06-23 06:04:14 字數 3381 閱讀 2395



#define arrlen 17

#define namelen 20

#define addrlen 20

typedef struct _rec

rec;

//hash函式,線性定址法和餘數法結合。

//得到的位址為陣列的下標。

//count為hash表長,即模。

int hash(char *name, int count)

return hashcode % count ;}/*

新增乙個記錄,如果這個位置已有元素,則在該元素後拉鍊,新增到鏈中。

陣列中的每個元素的值為 結構體元素的指標。

並且陣列中的每個元素儲存的指標域為帶有頭節點的鍊錶的頭節點。

陣列中的每個元素時不儲存資料域的,因為頭節點沒有資料域。

所以陣列名為結構體元素的二級指標。

*/void hash_insert(rec **hashtable, int count, rec *record)

else

}else

//定位到鏈尾。

if( (tmp->next = (rec *)malloc(sizeof(rec))) == null)

fprintf(stderr, "malloc error\n");

else}}

/*hash_search:

*/int hash_search(rec **hashtable, int count, rec *record)

//else tmp=temp->next;

}return -1;}/*

刪除某個記錄,

*/void hash_delete(rec **hashtable, int count, char *name)

else}}

int menu_select(void)

while(c < 1 || c > 5);

return c;

}void rec_insert(rec **hashtable, int count)

void rec_search(rec **hashtable, int count)

else

printf("can not found\n");

}void rec_delete(rec **hashtable, int count)

int main(void)}}

(二)步驟:

(1)構建乙個鍊錶的節點的結構體listnode;包含兩個字段乙個欄位是 關鍵字,乙個是next;

那麼使用listnode*型別的變數,就可以儲存乙個帶有頭節點的鍊錶了。

(2)構建乙個hashtable的結構體;包含兩個字段,乙個是hashtable的大小,size,還有乙個是

listnode*的陣列 listnode**  lists,即 lists[i] 就是 hash值為i的鍊錶,i為通過hash函式得到的 hash位址 。

(注意:hashtable陣列中的每個元素儲存的是鍊錶的 頭指標,並沒有包含關鍵字的值, 關鍵字都是儲存在鍊錶的頭指標後面的節點中 )

(3)構造hash函式,如 int hash(keytype key, int prime);

取餘法,得到位址,返回。

(4)初始化hashtable,陣列中每個元素為鍊錶的頭結點。

(5)int hashsearch(hashtable h , keytype key);

可有key,根據hash函式,得到key所指的鍊錶的頭指標,然後依次遍歷該鍊錶,看是否可以查到。

(6) hashinsert(hashtabel  h ,keytype key)

首先呼叫hashsearch函式,如果,沒有查詢到,則插入。

/**雜湊表 拉鍊法

*/#include

#include

#define mintablesize 10

typedef int elemtype;

typedef unsigned int index;

typedef struct listnode

*position;

typedef position list;

/*型別說明:

listnode型別:

list=position=listnode*;

hashtbl*=hashtable;

list* thelists,所以thelist是listnode**型別的;

*/typedef struct hashtbl

*hashtable;

/*因為表長通常都是prime*/

//這個寫的好像不對。

int nextprime(int n)

}/*hash函式*/

index hash(elemtype key,int tablesize)

/*初始化hash表。

hash表的陣列名是listnode**;

表中的每個元素為listnode*;

初始化時每個元素都是乙個空鏈,所以每個元素的next為null;

*/hashtable initializetable(int tablesize)

for(i=0;itablesize;i++)

return h;

}/*hash查詢*/

position find(elemtype key,hashtable h)

/*hash插入

hashtable中的每個元素儲存的是帶有頭節點的鍊錶的頭節點。

頭節點的資料域是沒有資料的。

所以如果乙個儲存乙個資料,資料儲存的是在hashtable元素的next節點中。

*/void insert(elemtype key,hashtable h)}}

/*刪除hash表。

*/void destroytable(hashtable h)

}free(h->thelists);

free(h);

}void printhash(hashtable h,int len) }

}int main()

;int len=sizeof(array)/sizeof(array[0]);

int i;

elemtype k;

h=initializetable(len);

for(i=0;ielement);

else

printf("cannot find the value!");

printf("\n\n");

printf("free the table\n");

destroytable(h);

printf("it's done!!!");

printf("\n\n");

return 0;

}

Hash表 拉鍊法

拉鍊法建立hash表 hash.h ifndef hash h define hash h include using namespace std struct node string value node next typedef node hashnode const int mult 31 c...

hash演算法與拉鍊法解決衝突

class hashnode class hashtable private function hashfunc key return hashval this size public function insert key,value else this buckets index newnode...

鏈位址法處理Hash衝突

雜湊表中的每個位置稱為桶 bucket 當發生雜湊衝突時就以鍊錶形式存放多個元素。img 鏈位址法處理hash衝突,看看下面 模擬了jdk中的hashset class node public object getvalue public node getnext public void setne...