第十五週專案2-用雜湊法組織關鍵字鏈地址法
阿新 • • 發佈:2019-02-16
問題及程式碼:
/* * Copyright (c)2016,煙臺大學計算機與控制工程學院 * All rights reserved. * 檔名稱:2.cpp * 作 者:張相如 * 完成日期:2016年12月14日 * 版 本 號:v1.0 * 問題描述: 已知一個關鍵字序列為if、while、for、case、do、break、else、struct、union、int、double、float、char、long、bool, 共15個字串,雜湊函式H(key)為關鍵字的第一個字母在字母表中的序號,雜湊表的表長為26。 (1)若處理衝突的方法採用線性探測法,請設計演算法,輸出每個關鍵字對應的H(key),輸出雜湊表,並求成功情況下的平均查詢長度。 (2)若處理衝突的方法採用鏈地址法,請設計演算法,輸出雜湊表,並計算成功情況和不成功情況下的平均查詢長度。 * 輸入描述:無 * 程式輸出:測試資料 */
執行結果:#include <stdio.h> #include <string.h> #include <malloc.h> #define N 15 #define M 26 typedef struct node //定義雜湊連結串列的節點型別 { char *key; struct node *next; } LNode; typedef struct { LNode *link; } HTType; int H(char *s) //實現雜湊函式 { return ((*s-'a'+1)%M); } //構造雜湊表 void Hash(char *s[], HTType HT[]) { int i, j; LNode *q; for(i=0; i<M; i++) //雜湊表置初值 HT[i].link=NULL; for(i=0; i<N; i++) //儲存每一個關鍵字 { q=(LNode*)malloc(sizeof(LNode)); //建立新節點 q->key = (char*)malloc(sizeof(strlen(s[i])+1)); strcpy(q->key, s[i]); q->next=NULL; j=H(s[i]); //求雜湊值 if(HT[j].link==NULL) //不衝突,直接加入 HT[j].link=q; else //衝突時,採用前插法插入 { q->next = HT[j].link; HT[j].link=q; } } } //輸出雜湊表 void DispHT(HTType HT[]) { int i; LNode *p; printf("雜湊表\n"); printf("位置\t關鍵字序列\n"); printf("---------------------\n"); for(i=0; i<M; i++) { printf(" %d\t", i); p=HT[i].link; while(p!=NULL) { printf("%s ", p->key); p=p->next; } printf("\n"); } printf("---------------------\n"); } //求查詢成功情況下的平均查詢長度 double SearchLength1(char *s[], HTType HT[]) { int i, k, count = 0; LNode *p; for(i=0; i<N; i++) { k=0; p=HT[H(s[i])].link; while(p!=NULL) { k++; //p!=NULL,進入迴圈就要做一次查詢 if(strcmp(p->key, s[i])==0) //若找到,則退出 break; p=p->next; } count+=k; } return 1.0*count/N; //成功情況僅有N種 } //求查詢不成功情況下的平均查詢長度 double SearchLength2(HTType HT[]) { int i, k, count = 0; //count為各種情況下不成功的總次數 LNode *p; for(i=0; i<M; i++) { k=0; p=HT[i].link; while(p!=NULL) { k++; p=p->next; } count+=k; } return 1.0*count/M; //不成功時,在表長為M的每個位置上均可能發生 } int main() { HTType HT[M]; char *s[N]= {"if", "while", "for", "case", "do", "break", "else", "struct", "union", "int", "double", "float", "char", "long", "bool"}; Hash(s, HT); DispHT(HT); printf("查詢成功情況下的平均查詢長度 %f\n", SearchLength1(s, HT)); printf("查詢不成功情況下的平均查詢長度 %f\n", SearchLength2(HT)); return 0; }