6-23 分离链接法的删除操作函数 (20 分)
試實(shí)現(xiàn)分離鏈接法的刪除操作函數(shù)。
函數(shù)接口定義:
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; /* 散列表類(lèi)型 */ struct TblNode { /* 散列表結(jié)點(diǎn)定義 */int TableSize; /* 表的最大長(zhǎng)度 */List Heads; /* 指向鏈表頭結(jié)點(diǎn)的數(shù)組 */ };函數(shù)Delete應(yīng)根據(jù)裁判定義的散列函數(shù)Hash( Key, H->TableSize )從散列表H中查到Key的位置并刪除之,然后輸出一行文字:Key is deleted from list Heads[i],其中Key是傳入的被刪除的關(guān)鍵詞,i是Key所在的鏈表的編號(hào);最后返回true。如果Key不存在,則返回false。
裁判測(cè)試程序樣例:
#include <stdio.h> #include <string.h>#define KEYLENGTH 15 /* 關(guān)鍵詞字符串的最大長(zhǎng)度 */ typedef char ElementType[KEYLENGTH+1]; /* 關(guān)鍵詞類(lèi)型用字符串 */ typedef int Index; /* 散列地址類(lèi)型 */ 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; /* 散列表類(lèi)型 */ struct TblNode { /* 散列表結(jié)點(diǎn)定義 */int TableSize; /* 表的最大長(zhǎng)度 */List Heads; /* 指向鏈表頭結(jié)點(diǎn)的數(shù)組 */ };Index Hash( ElementType Key, int TableSize ) {return (Key[0]-'a')%TableSize; }HashTable BuildTable(); /* 裁判實(shí)現(xiàn),細(xì)節(jié)不表 */ 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通過(guò)一個(gè)固定的算法函數(shù)既所謂的哈希函數(shù)轉(zhuǎn)換成一個(gè)整形數(shù)字,然后就將該數(shù)字對(duì)數(shù)組長(zhǎng)度進(jìn)行取余,取余的結(jié)果就當(dāng)作數(shù)組下標(biāo),將value存儲(chǔ)在以該數(shù)字為下標(biāo)的數(shù)組空間里
而當(dāng)使用哈希表進(jìn)行查詢(xún)的時(shí)候,就是再次使用哈希函數(shù)將Key轉(zhuǎn)換為對(duì)應(yīng)的數(shù)組下標(biāo),并定位到該空間獲取value,這樣就可以充分利用到數(shù)組的定位性能進(jìn)行數(shù)據(jù)定位
數(shù)組的特點(diǎn)是:尋址容易,插入和刪除困難
鏈表的特點(diǎn)是:尋址困難,插入和刪除容易
綜合兩者的特性,做出一種尋址容易,插入刪除也容易的數(shù)據(jù)結(jié)構(gòu):拉鏈法構(gòu)建哈希表
解決沖突:分離鏈接法、開(kāi)放尋址法
bool Delete( HashTable H, ElementType Key ){int w=Hash( Key, H->TableSize );//題目給的,不解釋,讀題目程序就好if(H->Heads[w].Next==NULL) return false;//判斷有沒(méi)有下一個(gè)節(jié)點(diǎn)PtrToLNode p,q;p=H->Heads[w].Next;//第一個(gè)位置沒(méi)有存東西,所以直接到下一個(gè)節(jié)點(diǎn)while(strcmp(p->Data,Key)!=0&&p->Next!=NULL){q=p;//記錄要?jiǎng)h除的上一個(gè)節(jié)點(diǎn)p=p->Next;//節(jié)點(diǎn)移動(dòng)}if(strcmp(p->Data,Key)==0){//找到printf("%s is deleted from list Heads[%d]\n",Key,w);q=p->Next;//刪除操作free(p);//這一句必須寫(xiě),不寫(xiě)會(huì)錯(cuò),很迷return true;//樣例 沒(méi)有輸出 printf("Are you kidding me?\n"); 不懂~~~}else return false;//找不到 }總結(jié)
以上是生活随笔為你收集整理的6-23 分离链接法的删除操作函数 (20 分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 树,森林,二叉树的互相转换
- 下一篇: 单链表基础知识详解