1. 程式人生 > 其它 >習題5.11 分離連結法的刪除操作函式 (20分)

習題5.11 分離連結法的刪除操作函式 (20分)

技術標籤:連結串列雜湊資料結構

習題5.11 分離連結法的刪除操作函式 (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; } /* 你的程式碼將被嵌在這裡 */

輸入樣例1:散列表如下圖
在這裡插入圖片描述

able
輸出樣例1:
able is deleted from list Heads[0]
輸入樣例2:散列表如樣例1圖
date
輸出樣例2:
ERROR: date is not found

#include <stdlib.h>
bool Delete( HashTable H, ElementType Key )
{
    Index p;//存放計算的位置
    p = Hash(Key,H->TableSize);//計算雜湊值
    Position point;//指向當前位置的指標
    Position Pre;//指向前一個位置的指標
    Pre = H->Heads[p].Next;//初始化為指向第一個節點的指標
    point = H->Heads[p].Next;//初始化為指向第一個節點的指標
    //如果當前位置指標不為空,就一直進行比較
    while(point != NULL)
    {
    //如果兩個字串相同,說明找到了,就進行刪除操作
        if(!strcmp(point->Data,Key))
        {
            Position temp;
            temp = point->Next;
            Pre = temp;
            free(point);
            printf("%s is deleted from list Heads[%d]",Key,p);
            return true;
        }
        else
        //否則,更新pre與point繼續比較
        {
            Pre = point;
            point = point->Next;
        } 
    }
    //如果找到最後都沒有找到說明中找不到,就返回false
    return false;
}