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

数据结构——实验六·散列表

嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库🔥🔥🔥
本文专栏 ➡️ 数据结构

散列表查找

本实验基于C实现散列表的创建、插入、查找。

实验目的:

  • 掌握散列查找的基本思想
  • 掌握散列表的构造方法
  • 掌握散列表处理冲突的方法

实验内容:

假设有一个1000×1000的稀疏矩阵,其中 0.01%的元素为非零元素,现要求用散列表作存储结构。试设计一个散列表并编写相应算法,对给定的行值和列值确定矩阵元素在散列表上的位置。
在1000×1000的稀疏矩阵中,0.01%的元素为非零元素,即有100个非零元素,故选用散列函数为:H(k)-k%100,其中k是某一矩阵元素的第一下标与第二下标之和。采用拉链法解决碰撞,因此,设计若干条不带头结点的单链表,用于容纳同义词;然后设计一个指针数组,其中的元素分别指向各个单链表。
在设计时,首先建立散列表,散列表的建立可利用随机函数产生数组的行、列下标,再产生一个非零值,插入到散列表中。其次是查表,输入行、列坐标,即可输出该数组元素的值。


实验产出:

1.核心代码:

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

typedef int DataType; // 数组元素的类型

struct ZipNode {      // 结点的结构
    int row, column;  // 数组元素的行、列下标
    DataType value;
    ZipNode *next;
};

ZipNode *Hash[100];   // 散列表结构

// 查找散列表,查找成功,返回该结点的位置,查找失败返回NULL
ZipNode *Find_Hash(int row, int column) {
    int Hash_Value;
    ZipNode *ptr;
    Hash_Value = (row + column) % 100;
    ptr = Hash[Hash_Value];
    while (ptr) {
        if ((ptr->row == row) && (ptr->column == column))
            break; // 查找成功
        ptr = ptr->next;
    }
    return ptr;
}

// 在散列表中插入数组元素
void Insert_Hash(int row, int column, int value) {
    int Hash_Value;
    ZipNode *q;
    Hash_Value = (row + column) % 100;
    q = new(ZipNode);              // 申请一个结点
    q->row = row;
    q->column = column;
    q->value = value;
    q->next = Hash[Hash_Value];    // 按栈方式插入结点
    Hash[Hash_Value] = q;
}

void Create_Hash() {               // 创建散列表
    int i, row, column, value;
    for (i = 0; i < 100; i++) Hash[i] = NULL; // 初始化散列表
    srand((unsigned)time(NULL));              // 设置随机种子
    for (i = 0; i < 100; i++) {               // 产生100个非零元素
        row = rand() % 1000;                  // 产生行下标
        column = rand() % 1000;               // 产生列下标
        if (Find_Hash(row, column))           // 该数组元素已存在
            i--;
        else {
            value = rand() % 10000 + 1;      // 产生一个1-10000之间的随机数
            Insert_Hash(row, column, value); // 插入到散列表中
            printf("No.=%2d, row=%4d, column=%4d, value=%5d\n", i, row, column, value);
        }
    }
}

int main() {
    int row, column;
    ZipNode *ptr;
    Create_Hash(); // 建立散列表
    while (1) {    // 查找数组元素
    	printf("\n\t注意:行列号为(0-999)\n\n");
        printf("请输入行号(10000=结束):");
        scanf("%d", &row);
        if (row == 10000) break;
        printf("请输入列号:");
        scanf("%d", &column);
        if (row >= 1000 || row < 0 || column>=1000 || column < 0) {
        	printf("\t行列号错误!请重新输入!\n");
        	continue;
		}
        printf("row=%4d ", row);
        printf("column=%4d ", column);
        if ((ptr = Find_Hash(row, column))) { // 找到
            printf("value=%5d\n", ptr->value);
        } else {                              // 没找到
            printf("value=%5d\n", 0);
        }
    }
    return 0;
}

2.运行结果:
生成的散列表:
在这里插入图片描述在这里插入图片描述
输入非零元素的行列号:
在这里插入图片描述
输出:
在这里插入图片描述

3.调试:
输入行列号错误调试:
输入不存在的行列号,验证程序是否能够正确检测到信息错误并输出相应的提示信息。
预期结果:程序应提示“行列号错误!请重新输入!”,并重新输入行列号。
在这里插入图片描述


如果你觉得这篇文章对你有所启发,请为博客点赞👍、收藏⭐️、评论💬或分享🔗,你的支持是Tubishu不断前行的源泉✨!衷心感谢你的鼓励与陪伴🙏!
若你有任何疑问、见解或补充,欢迎随时留言💬,让我们在交流中共同成长📚!❤️
愿各位大佬们在技术的道路上,代码顺畅无阻💻,思路清晰如光💡,不断突破自我,向着更高的目标迈进,实现自己的梦想!🎉
再次感谢你的阅读🌸


http://www.kler.cn/a/514998.html

相关文章:

  • 会议签到系统的架构和实现
  • solidity基础 -- 存储类型
  • linux网络 | 传输层TCP | 认识tcp报头字段与分离
  • 基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)
  • CentOS 7乱码问题如何解决?
  • 【Mac】Python相关知识经验
  • Android SystemUI——通知栏构建流程(十六)
  • GA-CNN-LSTM-Attention、CNN-LSTM-Attention、GA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比
  • Java菜鸟养成计划(java基础)--- java中的变量
  • C语言--数据在内存中的存储
  • Android中关于View的几种属性赋值方式
  • JVM面试题解,垃圾回收之“对象存活判断”剖析
  • Haskell语言的数据可视化
  • C++17 新特性深入解析:constexpr 扩展、if constexpr 和 constexpr lambda
  • adb 命令使用大全
  • 贪心算法(题3)区间分组
  • 在SQL的SELECT中实现循环查找、双层和多层循环(迭代)查找 SQL如何实现编程语言的for循环查询 MySQL的Select子查询
  • Spring Boot 自定义属性
  • 代码随想录算法训练营第 15 天(树3)| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数
  • #攻防演练#应急响应#对于挖矿的检测以及防御方案
  • PCF8563一款工业级、低功耗多功能时钟/日历芯片
  • ChatGPT大模型极简应用开发-CH3-使用 GPT-4 和 ChatGPT 构建应用程序
  • 大模型:LangChain技术讲解
  • Linux 离线安装php+nginx+ftp
  • ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)
  • 【Elasticsearch】index.mapping.source.mode