希哈表的学习

news2025/5/17 13:59:59
#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt之OpenGL使用Qt封装好的着色器和编译器

代码 #include "sunopengl.h"sunOpengl::sunOpengl(QWidget *parent) {}unsigned int VBO,VAO; float vertices[]{0.5f,0.5f,0.0f,0.5f,-0.5f,0.0f,-0.5f,-0.5f,0.0f,-0.5f,0.5f,0.0f };unsigned int indices[]{0,1,3,1,2,3, }; unsigned int EBO; sunOpengl::~sunO…

零基础开始学习鸿蒙开发-智能家居APP离线版介绍

目录 1.我的小屋 2.查找设备 3.个人主页 前言 好久不发博文了&#xff0c;最近都忙于面试&#xff0c;忙于找工作&#xff0c;这段时间终于找到工作了。我对鸿蒙开发的激情依然没有减退&#xff0c;前几天做了一个鸿蒙的APP&#xff0c;现在给大家分享一下&#xff01; 具体…

不再卡顿!如何根据使用需求挑选合适的电脑内存?

电脑运行内存多大合适&#xff1f;在选购或升级电脑时&#xff0c;除了关注处理器的速度、硬盘的容量之外&#xff0c;内存&#xff08;RAM&#xff09;的大小也是决定电脑性能的一个重要因素。但究竟电脑运行内存多大才合适呢&#xff1f;这篇文章将帮助你理解不同使用场景下适…

华为云 云化数据中心 CloudDC | 架构分析与应用场景

云化数据中心 CloudDC 云化数据中心 (CloudDC)是一种满足传统DC客户云化转型诉求的产品&#xff0c;支持将客户持有服务器设备部署至华为云机房&#xff0c;通过外溢华为云的基础设施管理、云化网络、裸机纳管、确定性运维等能力&#xff0c;帮助客户DC快速云化转型。 云化数据…

【射频仿真学习笔记】变压器参数的Mathematica计算以及ADS仿真建模

变压器模型理论分析 对于任意的无源电路或者等效电路&#xff0c;当画完原理图后&#xff0c;能否认为已经知道其中的两个节点&#xff1f;vin和vout之间的明确解析解 是否存在一个通用的算法&#xff0c;将这里的所有元素都变成了符号&#xff0c;使得这个算法本身就是一个函…

Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程

&#xfeff;今天和大家分享一款在 G 站获得了 26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes 的中文版如何在 Linux 环境使用 docker 本地部署&#xff0c;并结合 cpolar 内网穿透工具配置公网地址&#xff0c;轻松实现远程在线协作的详细教程。 Trilium Notes 是…

C++基础精讲-01

1C概述 1.1初识C 发展历程&#xff1a; C 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发&#xff0c;它在 C 语言的基础上增加了面向对象编程的特性&#xff0c;最初被称为 “C with Classes”&#xff0c;后来逐渐发展成为独立的 C 语言。 语言特点 &#xff08;1&#x…

为什么Java不支持多继承?如何实现多继承?

一、前言 Java不支持多继承&#xff08;一个类继承多个父类&#xff09;主要出于文中设计考虑&#xff1b;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因&#xff1a;菱形继承/钻石继承问题&#xff08;Diamond Problem&#xff09; 假设存在如下继承关系&…

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…

Express中间件(Middleware)详解:从零开始掌握(1)

1. 中间件是什么&#xff1f; 想象中间件就像一个"加工流水线"&#xff0c;请求(Request)从进入服务器到返回响应(Response)的过程中&#xff0c;会经过一个个"工作站"进行处理。 简单定义&#xff1a;中间件是能够访问请求对象(req)、响应对象(res)和下…

现代工业测试的核心支柱:电机试验工作台?(北重机械厂家)

电机试验工作台是现代工业测试中的核心支柱之一。这种工作台通常用于对各种类型的电机进行性能测试、负载测试和耐久性测试。通过电机试验工作台&#xff0c;工程师可以评估电机的效率、功率输出、转速、扭矩、温度等关键参数&#xff0c;从而确保电机的设计符合要求&#xff0…

oracle 11g密码长度和复杂度查看与设置

verify_function_11G 的密码复杂性要求: 密码长度至少为 8 个字符。 密码必须包含至少一个数字和一个字母字符。 密码不能与用户名相同或相似。 密码不能是服务器名或其变体。 密码不能是常见的弱密码&#xff08;如 welcome1、oracle123 等&#xff09;。 注意事项&…

CVE-2025-32375 | Windows下复现 BentoML runner 服务器远程命令执行漏洞

目录 1. 漏洞描述2. 漏洞复现1. 安装 BentoML 1.4.72. 创建模型3. 构建模型4. 托管模型5. 执行exp 3. POC4. 补充学习 参考链接&#xff1a; https://mp.weixin.qq.com/s/IxLZr83RvYqfZ_eXhtNvgg https://github.com/bentoml/BentoML/security/advisories/GHSA-7v4r-c989-xh26 …

某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)

帮朋友看一个税某局的加密算法。 传送门 &#xff08;需要帐号登陆的 普通人没授权也看不了&#xff09; 废话不多说直接抓包开干 这里可以看到一个headers中的加密参数 lzkqow23819 以及url路径里面的6eMrZlPH(这个有点像瑞数里面的&#xff09; 还有就是cookies里面的这几个…

AlmaLinux9.5 修改为静态IP地址

查看当前需要修改的网卡名称 ip a进入网卡目录 cd /etc/NetworkManager/system-connections找到对应网卡配置文件进行修改 修改配置 主要修改ipv4部分&#xff0c;改成自己的IP配置 [ipv4] methodmanual address1192.168.252.129/24,192.168.252.254 dns8.8.8.8重启网卡 …

操作系统 4.4-从生磁盘到文件

文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块&#xff08;block&#xff09;和文件&#xff08;file&#xff09;之间&#xff0c;使得用户可以以更直观和易于理解的方式与磁盘交互&#xff0c;而无需直接处理磁盘的物理细节如扇区&#xff08;se…

免费多语言文档翻译软件推荐

软件介绍 今天给大家介绍一款文档翻译助手。它能够支持PDF、Word等多种文档格式&#xff0c;涵盖中文、英文、日语等多语言互译。此软件在翻译过程中精选保留文档原貌&#xff0c;每段文字、每个图表的匹配都十分完美&#xff0c;还依托顶尖翻译大模型&#xff0c;让翻译结果符…

安全序列(DP)

#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶&#xff1a;延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…

【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

教程总体简介&#xff1a;2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…