• 习题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是传入的被删除的关键词,iKey所在的链表的编号;最后返回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
    ", Key);
        if (Delete(H, Key) == true)
            printf("Are you kidding me?
    ");
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    
     

    输入样例1:散列表如下图

    able
    
     

    输出样例1:

    able is deleted from list Heads[0]
    
     

    输入样例2:散列表如样例1图

    date
    
     

    输出样例2:

    ERROR: date is not found

    代码:
    bool Delete( HashTable H, ElementType Key ) {
        int s = Hash(Key,H -> TableSize);///题目给定的定位函数,确定Key可能在的位置
        List t = H -> Heads + s;///获得链表头结点
        while(t -> Next && strcmp(t -> Next -> Data,Key)) {
            t = t -> Next;
        }
        if(t -> Next == NULL) return false;
        PtrToLNode temp = t -> Next;
        t -> Next = t -> Next -> Next;
        free(temp);
        printf("%s is deleted from list Heads[%d]
    ",Key,s);
        return true;
    }
  • 相关阅读:
    开发工具分享
    图形学杂记
    keyle的Shader-学习手札
    Keyle的3D数学-学习手札
    SuperStrange项目主页
    Unity3d基础知识(水文)
    和Keyle一起学ShaderForge – Custom Blinn-Phong
    和Keyle一起学ShaderForge – Create Base Shader
    和Keyle一起学ShaderForge
    和Keyle一起学StrangeIoc – 教程目录
  • 原文地址:https://www.cnblogs.com/8023spz/p/12283804.html
Copyright © 2020-2023  润新知