数据结构----哈希表的插入与输出

复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef int datatype;

typedef struct Node
{
    struct Node *next;
    datatype data;
}*Linklist;

//创建节点
Linklist Create_node()
{
    Linklist p=(Linklist)malloc(sizeof(struct Node));
    if(NULL==p)
        return NULL;
    //初始化指针域
    p->next=NULL;
    //初始化数据域
    p->data=0;
    return p;
}

//找到<=m的最大质数,m=待排列数的长度*4/3,返回下标
int prime_max(int m)                                                 
{
    for(int i=m;i>=2;m--)
    {
        int flag=0;
                //sqrt(i)《====》根号i
        for(int j=2;j<sqrt(i);j++)
        {
            if(i%j==0)
            {
                flag=1;
                break;
            }
        }
        if(flag==0)
            return i;
    }
}

//哈希表的插入

void hash_insert(int key,Linklist hash[],int m)
{
    int p=prime_max(m);
    int sub=key%p;
    Linklist head=hash[sub];//创建链表的头

    Linklist s=Create_node();//创建节点
    s->data=key;
    //判空
    if(NULL==head)
    {
        head=s;
        hash[sub]=s;
        return;
    }
    //存在多个节点
    s->next=head;
    head=s;
    hash[sub]=head;//更新哈希表的头
}
//哈希表的输出
void show(Linklist hash[],int m)
{
    for(int i=0;i<m;i++)
    {
        printf("%d: ",i);
        Linklist p=hash[i];//定义指针P指向哈希表的头
        while(p!=NULL)          //遍历哈希表,输出链表数据域的数据
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("NULL\n");
    }
}

int main(int argc, const char *argv[])
{
    int arr[]={25,51,8,22,26,67,11,16,54,41};
    //将数据存入哈希表中
    int len=sizeof(arr)/sizeof(arr[0]);
    int m=len*4/3;
    Linklist hash[m];//定义指针数组
    for(int i=0;i<m;i++)
    {
        hash[i]=NULL;//防止野指针
    }
    for(int i=0;i<m;i++)//将数组中的元素插入到哈希表中
    {
        hash_insert(arr[i],hash,m);
    }
    //输出
    show(hash,m);
    return 0;
}

运行结果:

相关推荐
咩咩觉主9 小时前
c#数据结构 线性表篇 非常用线性集合总结
开发语言·数据结构·unity·c#·游戏引擎·程序框架
zhangpeng45554794010 小时前
数据结构-非线性结构-二叉树
数据结构
AllenO.o13 小时前
Redis五种数据结构详解
java·数据结构·数据库·redis·缓存
重生之后端学习13 小时前
day23-集合(泛型&Set&数据结构)
java·开发语言·数据结构·算法
焜昱错眩..14 小时前
代码随想录训练营第二十一天 |589.N叉数的前序遍历 590.N叉树的后序遍历
数据结构·算法
Go高并发架构_王工14 小时前
从零到精通:GoFrame ORM 使用指南 - 特性、实践与经验分享
数据结构·经验分享·golang
菜鸟破茧计划14 小时前
滑动窗口:穿越数据的时光机
java·数据结构·算法
少了一只鹅15 小时前
深入理解指针(5)
java·c语言·数据结构·算法
ROCKY_81716 小时前
数据结构(三)——栈和队列
数据结构
小吕学编程17 小时前
Redis从基础到高阶应用:核心命令解析与延迟队列、事务消息实战设计
java·数据结构·redis