首页 > 其他分享 >数据结构实验五

数据结构实验五

时间:2025-01-10 16:56:07浏览次数:1  
标签:return 哈希 int pos curPos 实验 Key 数据结构

石 家 庄 铁 道 大 学
实 验 报 告

课程名称: 数据结构与算法设计 任课教师: 刘 丹 实验日期:2024.12.15
班 级: 信2305-3 姓 名: 徐戌 学 号: 20234316

实验项目名称:实验五
一、 实验目的
1.掌握散列表的建立
2.掌握散列查找算法的实现。
二、 实验内容

三、 设计文档

四、 源程序
6-2 线性探测法的查找函数

include <stdio.h>

define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */

typedef int ElementType; /* 关键词类型用整型 /
typedef int Index; /
散列地址类型 /
typedef Index Position; /
数据所在位置与散列地址是同一类型 /
/
散列单元状态类型,分别对应:有合法元素、空单元、有已删除元素 */
typedef enum { Legitimate, Empty, Deleted } EntryType;

typedef struct HashEntry Cell; /* 散列表单元类型 /
struct HashEntry{
ElementType Data; /
存放元素 /
EntryType Info; /
单元状态 */
};

typedef struct TblNode HashTable; / 散列表类型 /
struct TblNode { /
散列表结点定义 /
int TableSize; /
表的最大长度 */
Cell Cells; / 存放散列单元数据的数组 */
};

HashTable BuildTable(); /* 裁判实现,细节不表 */
Position Hash( ElementType Key, int TableSize )
{
return (Key % TableSize);
}

define ERROR -1

Position Find( HashTable H, ElementType Key );

int main()
{
HashTable H;
ElementType Key;
Position P;

H = BuildTable(); 
scanf("%d", &Key);
P = Find(H, Key);
if (P==ERROR)
    printf("ERROR: %d is not found and the table is full.\n", Key);
else if (H->Cells[P].Info == Legitimate)
    printf("%d is at position %d.\n", Key, P);
else
    printf("%d is not found.  Position %d is returned.\n", Key, P);

return 0;

}
Position Find( HashTable H, ElementType Key )
{
Index hashAddr = Hash(Key, H->TableSize);
int curPos = hashAddr;
// 开始线性探测查找
while (1)
{
if (H->Cells[curPos].Info == Empty)
{
return curPos;
}
else if (H->Cells[curPos].Info == Legitimate && H->Cells[curPos].Data == Key)
{
return curPos;
}
curPos = (curPos + 1) % H->TableSize;
if (curPos == hashAddr)
{
// 说明转了一圈,表已满
return ERROR;
}
}
}
7-1 整型关键字的散列映射

include <stdio.h>

include <stdbool.h>

// 判断一个数是否为素数
bool isPrime(int num) {
if (num < 2) return false;
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) return false;
}
return true;
}

// 找到大于等于n的最小素数
int findPrime(int n) {
while (!isPrime(n)) {
n++;
}
return n;
}

int main() {
int n, p;
scanf("%d %d", &n, &p);
// 获取合适的素数作为散列表长度
p = findPrime(p);

int hashTable[p];
// 初始化散列表,-1表示空位置
for (int i = 0; i < p; i++) {
    hashTable[i] = -1;
}

int keys[n];
for (int i = 0; i < n; i++) {
    scanf("%d", &keys[i]);
}

// 插入关键字到散列表
for (int i = 0; i < n; i++) {
    int pos = keys[i] % p;
    while (hashTable[pos]!= -1 && hashTable[pos]!= keys[i]) {
        pos = (pos + 1) % p;
    }
    hashTable[pos] = keys[i];
}

// 输出各关键字在散列表中的位置
for (int i = 0; i < n; i++) {
    int pos = keys[i] % p;
    while (hashTable[pos]!= keys[i]) {
        pos = (pos + 1) % p;
    }
    if (i > 0) {
        printf(" ");
    }
    printf("%d", pos);
}
printf("\n");

return 0;

}
五、 个人体会
遇到的问题:
在实现线性探测法的查找函数时,对于循环结束条件的判断容易出错,一开始没有准确记录初始哈希地址,导致无法正确判断是否已经遍历完整个哈希表一圈都没找到元素的情况,出现死循环或者错误判断元素存在与否的问题。
对哈希表初始化时,没有考虑好合适的表示空位的默认值,导致插入和查找过程中逻辑混乱。
解决办法:
通过仔细分析线性探测的原理和流程,添加变量来记录初始哈希地址,在每次位置更新后与初始地址比较,以此准确判断是否遍历完一圈,完善了查找函数的循环结束条件判断逻辑。
对于哈希表初始化,参考相关资料和示例,根据实际插入元素的范围,选择了不会与正常元素值冲突的 -1 来表示空位,重新梳理了插入和查找过程基于这个空位表示的逻辑。
实验感想:
通过这次实验,深刻体会到了哈希表中线性探测法的原理和实现细节的重要性。一个看似简单的查找函数,却需要严谨地考虑各种边界情况和逻辑处理,小小的疏忽就可能导致功能出错。同时也明白了在遇到问题时,仔细分析原理、参考资料以及耐心调试是解决问题的关键,这让我对数据结构中的哈希相关知识有了更扎实的掌握。

标签:return,哈希,int,pos,curPos,实验,Key,数据结构
From: https://www.cnblogs.com/-Xuxu/p/18664252

相关文章

  • 数据结构实验3
    7-3修改数组(蓝桥杯)给定一个长度为N的数组A=[A1,A2,⋅⋅⋅AN],数组中有可能有重复出现的整数。现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2,A3,⋅⋅⋅,AN。当修改Ai时,小明会检查Ai是否在A1∼Ai−1中出现过。如果出现过,则小明会给Ai加上......
  • 数据结构实验四
    石家庄铁道大学实验报告课程名称:信2305-3 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验四一、 实验目的1)掌握图的邻接矩......
  • 数据结构实验4
    7-2栈实现表达式求值使用键盘输入数学表达式(含数字,四种运算符+、-、、/和小括号,其中运算数都是一位数(0~9)),将数学表达式转化成后缀表达式输出,利用后缀表达式求表达式的值并输出。输入格式:输入正确的表达式(可以有空格)后回车,得到后缀表达式和结果。输入括号缺失的表达式,输出"ERR......
  • 数据结构实验六
    石家庄铁道大学实验报告课程名称:数据结构与算法设计 任课教师:刘丹 实验日期:2024.12.15班级:信2305-3 姓名:徐戌 学号:20234316实验项目名称:实验六一、 实验目的1.掌握插入排......
  • 【西南科技大学计算机学院、智能计算与系统结构实验室主办 | ACM独立出版 | 往届均已
    ACM独立出版|往届均已成功检索,最快刊后1个月内实现EI检索征稿主题范围广:计算机网络安全、软件工程、信号处理、程序分析等领域主办单位:西南科技大学计算机学院、智能计算与系统结构实验室第五届计算机网络安全与软件工程国际学术会议(CNSSE2025)20255thInternational......
  • 数据结构(红黑树)
    问题的起源学习一个知识模块,一般先要厘清学习的目的,一个技术分支的出现必然是应对某个具体问题而产生的解决方案,搞清楚了问题的起源,对解决问题的思路就有了根本性的理解,来龙去脉把握清楚了学习起来就既有动力又有目标了。回归到红黑树的问题,红黑树其实也是一种平衡树,之前......
  • JSP开放实验室预约管理系统2118f--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义随着教育和科研的不断发展,实验室资源的有效管理和开放共享成为重要议题。传统的人工管理方式存在效率低、资源浪费等问题,无法满......
  • 数据结构全书简答题汇总(期末、考研)三万多字
    第一章:绪论-灰灰考研汇总1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并 被计算机程序处理的符号的集合。2.数据元素:数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。3.数据项:数据项是数据结构中讨论的最小单位。 是数据......
  • 从上千份大厂面经呕心沥血整理:大厂高频手撕面试题(数据结构和算法篇 ,C++实现亲试可跑)
    目录 怎么判断两个链表是否相交?怎么优化?(字节跳动、货拉拉)手撕冒泡排序(美团)手撕快速排序(作业帮)手撕堆排序(美团)手撕归并排序(美团)手撕二分查找(VIVO)字符串的全排列(要求去重)(字节跳动)求一个字符串中最长不重复子串的长度(字节跳动) 反转字符串的单词:如何在原字符串上翻转......
  • 数据结构真难
    在期末周算是被数据结构狠狠折磨了,当然自己在之前在数据结构方面的学习还存在着欠缺,自己往后得多加上心,总的来说呢,数据结构是一门具有一定难度的课程,在复习过程中难免会遇到各种困难和挫折,如复杂的算法理解、难以调试的代码等。但是,只要保持克服困难的毅力和决心,不断地尝试和探索,......