6-23 分离链接法的删除操作函数 (20 分)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                6-23 分离链接法的删除操作函数 (20 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                試實現分離鏈接法的刪除操作函數。
函數接口定義:
bool Delete( HashTable H, ElementType Key );其中HashTable是分離鏈接散列表,定義如下:
typedef struct LNode *PtrToLNode; struct LNode {ElementType Data;PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;typedef struct TblNode *HashTable; /* 散列表類型 */ struct TblNode { /* 散列表結點定義 */int TableSize; /* 表的最大長度 */List Heads; /* 指向鏈表頭結點的數組 */ };函數Delete應根據裁判定義的散列函數Hash( Key, H->TableSize )從散列表H中查到Key的位置并刪除之,然后輸出一行文字:Key is deleted from list Heads[i],其中Key是傳入的被刪除的關鍵詞,i是Key所在的鏈表的編號;最后返回true。如果Key不存在,則返回false。
裁判測試程序樣例:
#include <stdio.h> #include <string.h>#define KEYLENGTH 15 /* 關鍵詞字符串的最大長度 */ typedef char ElementType[KEYLENGTH+1]; /* 關鍵詞類型用字符串 */ typedef int Index; /* 散列地址類型 */ typedef enum {false, true} bool;typedef struct LNode *PtrToLNode; struct LNode {ElementType Data;PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List;typedef struct TblNode *HashTable; /* 散列表類型 */ struct TblNode { /* 散列表結點定義 */int TableSize; /* 表的最大長度 */List Heads; /* 指向鏈表頭結點的數組 */ };Index Hash( ElementType Key, int TableSize ) {return (Key[0]-'a')%TableSize; }HashTable BuildTable(); /* 裁判實現,細節不表 */ bool Delete( HashTable H, ElementType Key );int main() {HashTable H;ElementType Key;H = BuildTable(); scanf("%s", Key);if (Delete(H, Key) == false)printf("ERROR: %s is not found\n", Key);if (Delete(H, Key) == true)printf("Are you kidding me?\n");return 0; }/* 你的代碼將被嵌在這里 */哈希表HashTable(Key,value)就是把Key通過一個固定的算法函數既所謂的哈希函數轉換成一個整形數字,然后就將該數字對數組長度進行取余,取余的結果就當作數組下標,將value存儲在以該數字為下標的數組空間里
 而當使用哈希表進行查詢的時候,就是再次使用哈希函數將Key轉換為對應的數組下標,并定位到該空間獲取value,這樣就可以充分利用到數組的定位性能進行數據定位
數組的特點是:尋址容易,插入和刪除困難
 鏈表的特點是:尋址困難,插入和刪除容易
綜合兩者的特性,做出一種尋址容易,插入刪除也容易的數據結構:拉鏈法構建哈希表
解決沖突:分離鏈接法、開放尋址法
bool Delete( HashTable H, ElementType Key ){int w=Hash( Key, H->TableSize );//題目給的,不解釋,讀題目程序就好if(H->Heads[w].Next==NULL) return false;//判斷有沒有下一個節點PtrToLNode p,q;p=H->Heads[w].Next;//第一個位置沒有存東西,所以直接到下一個節點while(strcmp(p->Data,Key)!=0&&p->Next!=NULL){q=p;//記錄要刪除的上一個節點p=p->Next;//節點移動}if(strcmp(p->Data,Key)==0){//找到printf("%s is deleted from list Heads[%d]\n",Key,w);q=p->Next;//刪除操作free(p);//這一句必須寫,不寫會錯,很迷return true;//樣例 沒有輸出 printf("Are you kidding me?\n"); 不懂~~~}else return false;//找不到 }總結
以上是生活随笔為你收集整理的6-23 分离链接法的删除操作函数 (20 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 树,森林,二叉树的互相转换
 - 下一篇: 减肥期间可以喝白酒吗