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

11 篇文章 1 订阅

试实现分离链接法的删除操作函数。

函数接口定义:
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

bool Delete( HashTable H, ElementType key )
{
    int t;
    t=*(key+0)-'a';
    t=t%H->TableSize;
    PtrToLNode p,q;
    p=(H->Heads+t);
    q=p;
    p=p->Next;
    int m=0;
    
    while(p)
    {
        //q=p;
        if(strcmp(p->Data,key)==0)
        {
            q->Next=p->Next;
            free(p);
            printf("%s is deleted from list Heads[%d]\n",key,t);
            
             return true;
        }
        q=p;
       // free(p);
        p=p->Next;
        
            
        
    }
    return false;

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值