当前位置: 首页 > news >正文

希哈表的学习

#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"

typedef struct {
    int id;              // 学号,作为key
    char name[20];       // 姓名,作为value
    UT_hash_handle hh;   // 必须有这个字段
} Student;

Student* students = NULL; // 哈希表的头指针(初始为NULL)

int main() {
    Student* s1 = (Student*)malloc(sizeof(Student));
    Student* s2 = (Student*)malloc(sizeof(Student));
    
    s1->id = 1001;
    s2->id = 1002;
    strcpy(s1->name, "张三");
    strcpy(s2->name, "李四");

    // 把s1加入哈希表,按id做key
    HASH_ADD_INT(students, id, s2); //HASH_ADD_INT(哈希表名, 键字段名, 条目指针);
    HASH_ADD_INT(students, id, s1);

    // 查找学号的学生
    Student* find = NULL;
    int search_id = 1001;
    HASH_FIND_INT(students, &search_id, find);  //HASH_FIND_INT(哈希表名, 键字段值的地址, 找到的条目指针);
    if (find) {
        printf("找到了:%s\n", find->name);
    }
    else {
        printf("没找到\n");
    }

    // 释放内存
    HASH_DEL(students, s1);   //HASH_DEL() 的作用就是:从哈希表中删除一个指定的结构体(条目)。HASH_DEL(哈希表名, 条目指针);
    free(s1);
    return 0;
}


HASH_ADD_INT(哈希表头指针, key字段名, 结构体指针);

 

HASH_FIND_INT(哈希表名, key指针, 输出结果指针);

HASH_DEL(哈希表头指针, 要删除的结构体指针);

 

HASH_ITER(hh, head, elt, tmp)

例题

统计数组中每个元素出现的次数

#include <stdio.h>
#include "uthash.h"
#include <stdlib.h>


typedef struct
{
    int Key;  //数字
    int count; //出现次数
    UT_hash_handle hh; //哈希句柄
}HashEntry;

int main()
{
    int nums[] = {1, 2, 3, 2, 1, 1};
    int n = sizeof(nums) / sizeof(nums[0]);
    HashEntry*hashTable = NULL;
    for (int i = 0; i < n; i++)
    {
        int num = nums[i];
        HashEntry*entry;
        HASH_FIND_INT(hashTable, &num, entry);
        if(entry)
        {
            entry->count += 1;
        }
        else
        {
            entry = (HashEntry*)malloc(sizeof(HashEntry));
            entry->Key = num;
            entry->count = 1;
            HASH_ADD_INT(hashTable, Key, entry);
        }
    }

    HashEntry*e, *tmp;
    HASH_ITER(hh, hashTable, e, tmp)
    {
        printf("%d: %d次\n", e->Key, e->count);
    }

    HASH_ITER(hh, hashTable, e, tmp)
    {
        HASH_DEL(hashTable, e);
        free(e);
    }
}

 

数组中第一个只出现一次的元素


#include <stdio.h>
#include "uthash.h"
#include <stdlib.h>




// 定义哈希表结构
typedef struct {
    int key;        // 数字
    int count;      // 出现次数
    UT_hash_handle hh; // 哈希句柄
} HashEntry;

int findFirstUnique(int* nums, int n) {
    HashEntry *hashTable = NULL;

    // 第一次遍历:统计每个数字出现次数
    for (int i = 0; i < n; i++) {
        int num = nums[i];
        HashEntry *entry;
        HASH_FIND_INT(hashTable, &num, entry);
        if (entry) {
            entry->count += 1;
        } else {
            entry = (HashEntry*)malloc(sizeof(HashEntry));
            entry->key = num;
            entry->count = 1;
            HASH_ADD_INT(hashTable, key, entry);
        }
    }

    // 第二次遍历:找出第一个只出现一次的数字
    int result = -1;
    for (int i = 0; i < n; i++) {
        HashEntry *entry;
        HASH_FIND_INT(hashTable, &nums[i], entry);
        if (entry && entry->count == 1) {
            result = nums[i];
            break;
        }
    }

    // 清理哈希表
    HashEntry *e, *tmp;
    HASH_ITER(hh, hashTable, e, tmp) {
        HASH_DEL(hashTable, e);
        free(e);
    }

    return result;
}

int main() {
    int nums[] = {4, 5, 1, 2, 1, 2, 0};
    int n = sizeof(nums) / sizeof(nums[0]);

    int result = findFirstUnique(nums, n);
    if (result != -1) {
        printf("第一个只出现一次的元素是:%d\n", result);
    } else {
        printf("没有只出现一次的元素\n");
    }

    return 0;
}

判断数组中是否存在重复元素

#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"

// 定义哈希结构
typedef struct {
    int key;            // 数组元素值
    UT_hash_handle hh;  // 哈希句柄
} HashEntry;

int containsDuplicate(int* nums, int numsSize) {
    HashEntry *hashTable = NULL;

    for (int i = 0; i < numsSize; i++) {
        int num = nums[i];
        HashEntry *entry;

        HASH_FIND_INT(hashTable, &num, entry);
        if (entry) {
            // 找到了,说明重复
            // 清理哈希表
            HashEntry *e, *tmp;
            HASH_ITER(hh, hashTable, e, tmp) {
                HASH_DEL(hashTable, e);
                free(e);
            }
            return 1; // true
        } else {
            // 没找到,加入哈希表
            entry = (HashEntry*)malloc(sizeof(HashEntry));
            entry->key = num;
            HASH_ADD_INT(hashTable, key, entry);
        }
    }

    // 清理哈希表
    HashEntry *e, *tmp;
    HASH_ITER(hh, hashTable, e, tmp) {
        HASH_DEL(hashTable, e);
        free(e);
    }

    return 0; // false
}

int main() {
    int nums1[] = {1, 2, 3, 4};       // 无重复
    int nums2[] = {1, 2, 3, 2};       // 有重复

    printf("nums1 是否有重复:%s\n", containsDuplicate(nums1, 4) ? "是" : "否");
    printf("nums2 是否有重复:%s\n", containsDuplicate(nums2, 4) ? "是" : "否");

    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"

// 定义哈希结构
typedef struct {
    int key;            // 数组元素值
    UT_hash_handle hh;  // 哈希句柄
} HashEntry;

int containsDuplicate(int* nums, int numsSize) {
    HashEntry *hashTable = NULL;

    for (int i = 0; i < numsSize; i++) {
        int num = nums[i];
        HashEntry *entry;

        HASH_FIND_INT(hashTable, &num, entry);
        if (entry) {
            // 找到了,说明重复
            // 清理哈希表
            HashEntry *e, *tmp;
            HASH_ITER(hh, hashTable, e, tmp) {
                HASH_DEL(hashTable, e);
                free(e);
            }
            return 1; // true
        } else {
            // 没找到,加入哈希表
            entry = (HashEntry*)malloc(sizeof(HashEntry));
            entry->key = num;
            HASH_ADD_INT(hashTable, key, entry);
        }
    }

    // 清理哈希表
    HashEntry *e, *tmp;
    HASH_ITER(hh, hashTable, e, tmp) {
        HASH_DEL(hashTable, e);
        free(e);
    }

    return 0; // false
}

int main() {
    int nums1[] = {1, 2, 3, 4};       // 无重复
    int nums2[] = {1, 2, 3, 2};       // 有重复

    printf("nums1 是否有重复:%s\n", containsDuplicate(nums1, 4) ? "是" : "否");
    printf("nums2 是否有重复:%s\n", containsDuplicate(nums2, 4) ? "是" : "否");

    return 0;
}

相关文章:

  • 9-函数的定义及用法
  • ASP.NET Core 性能优化:服务器端响应缓存
  • Lab Cloud FPGA 硬件在线实验云平台介绍
  • aviator 自定义表达式
  • 猫咪如厕检测与分类识别系统系列【二】多图上传及猫咪分类特征提取更新
  • 设计模式:工厂方法模式 - 高扩展性与低耦合的设计之道
  • 【AI】免费GPU算力平台部署wan2.1
  • 三肽-10瓜氨酸(核心蛋白聚糖肽)-抗皱抗衰 改善肤质
  • 华为的欧拉操作系统怎么进行开发、环境搭建、编译、调试等
  • 分库分表设计与Java实践:从理论到实现
  • 【KWDB 创作者计划】KWDB 数据库全维度解析手册
  • 机器学习--网格搜索
  • 第一部分——Docker篇 第四章 搭建镜像仓库
  • 路由器端口映射设置方法教程,和无公网IP内网穿透实现外网访问方案步骤
  • AIP-217 不可达资源
  • 【Redis】string类型
  • 算法---子序列[动态规划解决](最长递增子序列)
  • 在 Wireshark 中如何筛选数据包
  • 在线论坛系统
  • Charles抓包-安装和IOS抓包指导
  • 织梦大气绿色大气农业能源化工机械产品企业网站源码模版/百度提交工具
  • 做音乐的网站/百度竞价推广的技巧
  • 服装网站的设计理念/有没有推广app的平台
  • 菜谱网站后台代码/磁力引擎
  • 网站建设与网站主机的选择/百度网站介绍
  • 做网站买空间用共享ip/太原seo网络优化招聘网