日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

6-23 分离链接法的删除操作函数 (20 分)

發(fā)布時(shí)間:2023/12/4 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6-23 分离链接法的删除操作函数 (20 分) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

試實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。