哈希表初始化、输出哈希表、插入键值(线性探测再散列法处理冲突)

第1关:哈希表初始化

本关任务:初始化哈希表满足下面要求。
将关键字序列(7、8、30、11、18、9、14)散列存储到散列表中,
散列函数为: H(key) = (key*3) MOD 7,处理冲突采用线性探测再散列法,要求装填(载)因子为0.7。
初始化的哈希表中元素均为-1。

第2关:输出哈希表

本关任务:
完成函数,能根据哈希表结构输出哈希表的元素。元素之间以空格隔开

第3关:插入键值(线性探测再散列法处理冲突)

本关任务:
编写一个能将键值插入哈希表的函数,要求按线性探测再散列法处理冲突)

答案

// Created by Mr.Chen on 2023/11/1.

//#ifndef CLIONPROJECTS_HASH_H
//#define CLIONPROJECTS_HASH_H
#include <stdio.h>
#include <stdlib.h>

/*哈希结构*/
typedef struct hashTable
{
    int* element;//存放键值的连续空间起始地址
    int maxNum;// 哈希表长度
    int curNum;//当前哈希表已有数据元素
}hashTable;
typedef hashTable* pHashTable;

typedef struct node
{
    int data ;
    struct node* next;
}node;

typedef struct hashTable_link
{
    node* element;
    int maxNum;// 哈希表长度
}hashTable_link;
typedef hashTable_link* pHashTable_link;

/*第一关*/
//初始化一个哈希表,能满足线性探测再散列处理冲突法使用,初始化哈希表元素均为-1,表示该位置为空,可插入
pHashTable initHashTable_linear()
{
    //分配空间
    pHashTable table = (pHashTable)malloc(sizeof(struct hashTable));
    table->maxNum = 10;
    table->element = (int*)malloc(sizeof (int) * table->maxNum);

    //变量初始化
    for(int i = 0; i < table->maxNum; i++)
    {
        table->element[i] = -1;
    }
    table->curNum = 0;

    return table;
}

//初始化一个哈希表,能满足拉链法处理冲突法使用。初始化哈希表元素为0,用于计算该条链中数据个数,在插入时增加
pHashTable_link initHashTable_link()
{
    //分配空间
    pHashTable_link table = (pHashTable_link)malloc(sizeof(struct hashTable_link));
    table->maxNum = 10;
    table->element = (node*)malloc(sizeof(node) * table->maxNum);

    //变量初始化
    for (int i = 0; i < table->maxNum; i++)
    {
        table->element[i].data = 0;
        table->element[i].next = NULL;
    }

    return table;
}

/*第二关*/
//输出线性探测再散列法构建的哈希表,从下标为0的元素开始输出,每输出一个数据空一格
void printHashTable(pHashTable h)
{
    for (int i = 0; i < h->maxNum; i++)
    {
        printf("%d ",h->element[i]);
    }
}

/*第三关*/
//哈希函数,h(key) = (key*3) %  7
int hashFun(int key)
{
    return (key*3) %  7;
}

//函数功能:计算key的哈希地址,若发生冲突,则使用线性探测再散列的方法查找合适的插入位置下标,并返回该下标
int findPos(pHashTable h , int key)
{
    int d = hashFun(key);   //d为地址单元

    for (int i = 0; i < h->maxNum; i++)
    {
        if(h->element[d] == -1)  //有空位
            return d;
        else    //发送冲突
            d = (d + 1) % h->maxNum;    //依次探查以下地址单元:d+1,d+2,...,h->maxNum-1,0,1,..,d-1
    }
    return -1;  //散列表溢出
}

//插入键值函数,若哈希表空间已满,则返回-1,否则返回插入位置下标
int insertKey(pHashTable h , int key)
{
    if(h->curNum == h->maxNum)
        return -1;

    int pos = findPos(h, key);  //处理冲突后的哈希地址
    h->element[pos] = key;
    h->curNum++;

    return pos;

}

//#endif //CLIONPROJECTS_HASH_H

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include #include typedef struct node { int data; struct node *next; }node; init_hash(node **A,int n) { int i; for(i=0;idata=0; A[i]->next=NULL; } } insert_hash(node **A,int value,int n) { int key; node *p,*q; key=value%n; if(A[key]->next!=NULL) { p=A[key]->next; while(p->next!=NULL) p=p->next; q=(node *)malloc(sizeof(node)); q->data=value; q->next=NULL; p->next=q; } else { q=(node *)malloc(sizeof(node)); q->data=value; q->next=NULL; A[key]->next=q; } } int search_hash(node **A,int value,int n) { int key; node *p; key=value%n; if(A[key]->next==NULL) return 0; else { p=A[key]->next; while(p!=NULL) { if(p->data==value) return 1; } return 0; } } delete_hash(node **A,int value,int n) { int key; node *p,*q; key=value%n; p=A[key]; q=A[key]->next; while(q->data!=value) { p=q; q=q->next; } p->next=q->next; free(q); } print_hash(node **A,int n) { int i; node *p; for(i=0;inext!=NULL) { p=A[i]->next; while(p!=NULL) { printf("%d ",p->data); p=p->next; } } } printf("\n"); } main() { int i,n,value,Case; node **A; printf("输入待排序元素个数:\n"); scanf("%d",&n); A=(node **)malloc(sizeof(node*)*n); //申请一个指针型数组A[n] init_hash(A,n);//初始化数组A printf("输入hash的值(空格键分开):\n"); for(i=0;i<n;i++) //建hash { scanf("%d",&value); insert_hash(A,value,n); } printf("请选择hash操作\n1.查询\t2.插入\t3.删除\t4.输出\n"); scanf("%d",&Case); switch(Case) { case 1: { printf("请输入要查询的元素:"); scanf("%d",&value); printf(search_hash(A,value,n)?"Success!\n":"Failure!\n"); //查询 } case 2: { printf("请输入要插入的元素:"); scanf("%d",&value); insert_hash(A,value,n); //插入 } case 3: { printf("请输入要删除的元素:"); scanf("%d",&value); printf(search_hash(A,value,n)?"删除成功!\n":"中不存在该元素!\n"); delete_hash(A,value,n); } case 4: //输出 { printf("中元素为:\n"); print_hash(A,n); } } }
在C++中,可以使用`unordered_map`模板类来实现哈希表。`unordered_map`中的每个元素都是一个键值对(key-value pair),其中键(key)用于索引值(value),可以是任何类型的数据,而值(value)则是与键相关联的数据,也可以是任何类型的数据。 以下是使用`unordered_map`初始化哈希表的示例代码: ```c++ #include <unordered_map> #include <string> #include <iostream> int main() { std::unordered_map<std::string, int> my_map = { {"apple", 5}, {"banana", 3}, {"cherry", 9} }; std::cout << "Size of my_map: " << my_map.size() << std::endl; std::cout << "Value of apple: " << my_map["apple"] << std::endl; std::cout << "Value of banana: " << my_map["banana"] << std::endl; std::cout << "Value of cherry: " << my_map["cherry"] << std::endl; return 0; } ``` 输出结果为: ``` Size of my_map: 3 Value of apple: 5 Value of banana: 3 Value of cherry: 9 ``` 在上面的代码中,我们首先引入了`unordered_map`、`string`和`iostream`头文件。然后,我们定义了一个`unordered_map`对象`my_map`,它的键类型是`string`,值类型是`int`。我们使用大括号初始化初始化`my_map`对象,其中每个键值对都用逗号分隔开,每个键值对包含一个键和一个值,用冒号分隔开。 在输出结果中,我们首先输出了`my_map`的大小(即键值对的数量),然后分别输出了三个键(`"apple"`、`"banana"`和`"cherry"`)对应的值。 需要注意的是,当使用`unordered_map`的`operator[]`操作符访问一个不存在的键时,会自动创建该键,并将其对应的值初始化为默认值(`0`、`false`、`nullptr`等)。如果需要避免这种行为,可以使用`unordered_map`的`find()`函数来查找键是否存在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值