数据结构学习——6

一、哈夫曼树

alt

二、图

alt

三、算法——查找

alt

HASH表

alt

散列存储——(HASH实现)保留除数法(取余法)

alt

alt

alt

Hash表具体实现

hash.h

/*===============================================
*   文件名称:hash.h
*   创 建 者:青木莲华 
*   创建日期:2025年08月01日
*   描    述:hash表实现
================================================*/
#ifndef __HASH_H__
#define __HASH_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int data_h;
typedef struct
{
    data_h *data;
    int length;         //长度
    int p;              //质数
}hash_t;

//init
hash_t *hash_init(int m);
//最大质数
int big_prime(int m);
//create
int hash_create(hash_t *hp,int arr[],int n);
//show
void hash_show(hash_t *hp);
//search
int hash_search(hash_t *hp,int key);
#endif

hash.c

/*===============================================
*   文件名称:hash.c
*   创 建 者:青木莲华 
*   创建日期:2025年08月01日
*   描    述:Hash实现
================================================*/
#include "hash.h"
//init
hash_t *hash_init(int m)
{
    hash_t *hp = (hash_t *)malloc(sizeof(hash_t));
    if(hp == NULL)
        return NULL;
    int len = (int)m / 0.75;                //根据长度扩充Hash表大小

    hp->length = len;
    //printf("len = %d\n",hp->length);
    hp->p = big_prime(m);
    //printf("p = %d\n",hp->p);

    hp->data = (data_h *)malloc(sizeof(data_h) * hp->length);
    if(hp->data == NULL)
    {
        free(hp);
        return NULL;
    }
    for(int i = 0 ; i < len ;i++)
        hp->data[i] = -1;
    return hp;
}
//最大质数
int big_prime(int m)
{
    int i;
    for(; m > 1 ; m--)
    {
        for(i = 2 ; i < m ; i++)
            if(m % i == 0)
                break;
        if(m == i)
            return m;
    }
    return 0;
}

//create
int hash_create(hash_t *hp,int arr[],int n)
{
    int i,hash_val;
    for(i = 0 ; i < n ; i++)
    {
        hash_val = arr[i] % hp->p;
        while(hp->data[hash_val] != -1)
        {
            hash_val = (hash_val + 1) % hp->length;
        }
        hp->data[hash_val] = arr[i];
        printf("insert : arr[%d] = %d ----->  hash[%d] = %d\n",
                i,arr[i],hash_val,hp->data[hash_val]);
    }
    return 1;
}
//show
void hash_show(hash_t *hp)
{
    int i = 0;
    for(; i < hp->length ; i++)
    {
        if(hp->data[i] != -1)
            printf("hash[%d] = %d\t",i,hp->data[i]);
        if((i+1) % 4 == 0)
            printf("\n");
    }
}
//search
int hash_search(hash_t *hp,int key)
{
    int count,hash_val = key % hp->p;
    while(hp->data[hash_val] != key && count < hp->length)
    {
        hash_val = (hash_val + 1) % hp->length;
        count++;
    }
    if(hp->data[hash_val] == key)
    {
        printf("Success ,hash_val = %d\n",hash_val);
        return hash_val;
    }
    else
    {
        printf("Not found!\n");
        return -1;
    }
}

main.c

/*===============================================
*   文件名称:main.c
*   创 建 者:青木莲华 
*   创建日期:2025年08月01日
*   描    述:Hash实现
================================================*/
#include "hash.h"

int main(int argc, char *argv[])
{ 
    int arr[15] = {15,67,44,32,18,
                   11,74,26,55,89,
                   93,54,41,65,9};
    hash_t *hp = hash_init(15);  
    hash_create(hp,arr,15);
    hash_show(hp);
    hash_search(hp,100);
    hash_search(hp,74);
    return 0;
} 

运行截图

alt