雜湊表的模板

來源:互聯網
上載者:User

#include <conio.h><br />#include <memory.h><br />#include <stdio.h><br />#include <stdlib.h><br />#include <string.h><br />#define szNAME 80<br />#define HASH_ROOT 47 /*用於計算雜湊地址的隨機數*/<br />#define szHASH 50 /*雜湊表總長度*/<br />#define POPULATION 30 /*學生總數*/</p><p>/*雜湊表結構體*/<br />struct THash {<br />int key; /*鑰匙碼*/<br />char name[10]; /*姓名*/<br />int depth; /*檢索深度*/<br />};</p><p>/*根據鑰匙碼和雜湊根計算雜湊地址*/<br />int GetHashAddress(int key, int root)<br />{<br />return key % root;<br />}/*end GetHashAddress*/</p><p>/*衝突地址計算,如果發現地址衝突,則用當前地址和鑰匙碼、雜湊根重建一個新地址*/<br />int GetConflictAddress(int key, int address, int root)<br />{<br />int addr = address + key % 5 + 1;<br />return addr % root;<br />}/*end GetConflictAddress*/</p><p>/*根據字串產生雜湊鑰匙碼,這裡的方法是將串內所有字元以數值形式求累加和*/<br />int CreateKey(char * name)<br />{<br />int key = 0;<br />unsigned char * n = (unsigned char *)name;<br />while(*n) key += *n++;<br />return key;<br />}/*end CreateKey*/</p><p>/*輸入一個名字,並返回雜湊鑰匙碼*/<br />int GetName(char * name)<br />{<br />scanf("%s", name);<br />return CreateKey(name);<br />}/*end CreateKey*/</p><p>/*根據學生人數、長度和雜湊根構造雜湊表*/<br />struct THash * CreateNames(int size, int root, int population)<br />{<br />int i =0, key = 0, addr = 0, depth = 0; char name[10];<br />struct THash * h = 0, *hash = 0;</p><p>/*雜湊根和長度不能太小*/<br />if(size < root || root < 2) return 0;</p><p>/*根據雜湊表長度構造一個空的雜湊表*/<br />hash = (struct THash *)malloc(sizeof(struct THash) * size);</p><p>/*將整個表清空*/<br />memset(hash, 0, sizeof(struct THash) * size);</p><p>for(i = 0; i < population; i++) {<br />/*首先產生一個隨機的學生姓名,並根據姓名計算雜湊鑰匙碼,再根據鑰匙碼計算地址*/<br />key = GetName(name);<br />addr = GetHashAddress(key, root);<br />h = hash + addr;<br />if (h->depth == 0) { /*如果當前雜湊地址沒有被佔用,則存入資料*/<br />h->key = key;<br />strcpy(h->name , name);<br />h->depth ++;<br />continue;<br />}/*end if*/<br />/*如果雜湊地址已經被佔用了,就是說有衝突,則尋找一個新地址,直到沒有被佔用*/<br />depth = 0;<br />while(h->depth ) {<br />addr = GetConflictAddress(key, addr, root);<br />h = hash + addr;<br />depth ++;<br />}/*end while*/<br />/*按照新地址存放資料,同時記錄檢索深度*/<br />h->key = key;<br />strcpy(h->name , name);<br />h->depth = depth + 1;<br />}/*next*/<br />return hash;<br />}/*end CreateNames*/</p><p>/*在雜湊表中以特定雜湊根尋找一個學生的記錄*/<br />struct THash * Lookup(struct THash * hash, char * name, int root)<br />{<br />int key = 0, addr = 0; struct THash * h = 0;<br />/*不接受空表和空名稱*/<br />if(!name || !hash) return 0;<br />key = CreateKey(name);<br />addr = GetHashAddress(key, root);<br />h = hash + addr;<br />/*如果結果不正確表示按照衝突規則繼續尋找*/<br />while(strcmp(h->name , name)) {<br />addr = GetConflictAddress(key, addr, root);<br />h = hash + addr;<br />if(h->key == 0) return 0;<br />}/*end while*/<br />return hash + addr;<br />}/*end Lookup*/</p><p>/*根據一條雜湊表記錄列印該記錄的學生資訊*/<br />void Print(struct THash * record)<br />{<br />if (!record) {<br />printf("【查無此人】/n");<br />return ;<br />}/*end if*/<br />if(record->depth)<br />printf("【鑰匙碼】%04d/t【姓名】%s/t【檢索深度】%d/n", record->key, record->name, record->depth );<br />else<br />printf("【空記錄】/n");<br />/*end if*/<br />}/*end Print*/</p><p>/*列印學生花名冊*/<br />void Display(struct THash * hash, int size)<br />{<br />struct THash * h = 0;<br />if (!hash || size < 1) return ;<br />printf("學生花名冊:/n");<br />printf("--------------------/n");<br />for(h = hash; h < hash + size; h++) {<br />printf("【地址】%d/t", h - hash);<br />Print(h);<br />}/*next*/<br />printf("--------------------/n");<br />}/*end Display*/</p><p>/*主函數,程式入口*/<br />int main(void)<br />{<br />/*雜湊表變數聲明*/<br />struct THash * hash = 0, * h = 0;<br />int cmd = 0; /*命令*/<br />char name[10]; /*學生姓名*/</p><p>/*產生30個學生用的雜湊表*/<br />hash = CreateNames(szHASH, HASH_ROOT, POPULATION);<br />for(;;) {<br />printf("雜湊表展示:1-顯示雜湊表;2-檢索姓名;其他任意鍵退出:/n");<br />cmd = getch();<br />cmd -= '0';<br />switch(cmd) {<br />case 1: Display(hash, szHASH); break;<br />case 2:<br />printf("請輸入要檢索的學生姓名:");<br />scanf("%s", name);<br />h = Lookup(hash, name, HASH_ROOT);<br />printf("【地址】%d/t", h - hash);<br />Print(h);<br />break;<br />default:<br />free(hash);<br />return 0;<br />}/*end case*/<br />}/*next*/<br />return 0;<br />}/*end main*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.