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

数据结构 C/C++(实验六:查找)

(大家好,今天分享的是数据结构的相关知识,大家可以在评论区进行互动答疑哦~加油!💕)

目录

提要:实验题目

 一、实验目的 

二、实验内容及要求

三、源程序及注释 

实验1代码(折半查找)

实验2代码(排序二叉树进行中序遍历)

实验3代码(哈希表) 

四、实验结果

实验1结果

 实验2结果

 实验3结果 


提要:实验题目

  1. 折半查找               
  2. 排序二叉树进行中序遍历 
  3. 哈希表的基本操作       

 一、实验目的 

  1. 掌握几种典型的查找方法(折半查找、二叉排序树的查找、哈希查找)。
  2. 各种查找算法的特点、使用范围和效率有进一步的了解。
  3. 了解图的典型应用的算法程序。

二、实验内容及要求

  1. 编程实现折半查找。
  2. 读入一串整数构成一棵二叉排序树,对该排序二叉树进行中序遍历,输出其结果。
  3. 用除留余数法构造哈希函数,并用线性探测再散列处理冲突,实现哈希表的基本操作,即表的构造和查找。

注:前两个题目必做,第3题选做。


、源程序及注释 

实验1代码(折半查找)

#include <iostream>
using namespace std;

// 折半查找函数
int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;

    cout << "查找过程如下:\n";

    while (left <= right) {
        int mid = left + (right - left) / 2;  // 计算中间位置

        // 打印当前查找区间及中间元素
        cout << "当前查找区间:[" << left << ", " << right << "],中间元素:arr[" << mid << "] = " << arr[mid] << endl;

        // 如果目标值等于中间值,返回索引
        if (arr[mid] == target) {
            cout << "找到了目标元素 " << target << ",位置为:" << mid << endl;
            return mid;
        }
        // 如果目标值小于中间值,缩小查找范围到左半部分
        else if (arr[mid] > target) {
            right = mid - 1;
        }
        // 如果目标值大于中间值,缩小查找范围到右半部分
        else {
            left = mid + 1;
        }
    }

    cout << "未找到目标元素 " << target << endl;
    return -1;  // 如果未找到目标值,返回-1
}

int main() {
    int size;
    cout << "请输入数组的大小:";
    cin >> size;

    int arr[size];
    
    cout << "请输入数组元素(要求数组是升序的):" << endl;
    for (int i = 0; i < size; i++) {
        cin >> arr[i];
    }

    int target;
    cout << "请输入要查找的目标值:";
    cin >> target;

    // 调用折半查找函数
    int result = binarySearch(arr, size, target);

    if (result != -1) {
        cout << "元素 " << target << " 在数组中的索引位置是: " << result << endl;
    } else {
        cout << "元素 " << target << " 不在数组中。" << endl;
    }

    return 0;
}
//请输入数组的大小:6
//请输入数组元素(要求数组是升序的):
//10 20 30 40 50 60
//请输入要查找的目标值:40

//查找过程如下:
//当前查找区间:[0, 5],中间元素:arr[2] = 30
//当前查找区间:[3, 5],中间元素:arr[4] = 50
//当前查找区间:[3, 3],中间元素:arr[3] = 40
//找到了目标元素 40,位置为:3
//元素 40 在数组中的索引位置是: 3

实验2代码排序二叉树进行中序遍历)

#include <iostream>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 插入节点到二叉排序树
TreeNode* insert(TreeNode* root, int val) {
    if (root == nullptr) {
        return new TreeNode(val);
    }
    if (val < root->val) {
        root->left = insert(root->left, val);
    } else {
        root->right = insert(root->right, val);
    }
    return root;
}

// 中序遍历
void inorder(TreeNode* root) {
    if (root != nullptr) {
        inorder(root->left);
        cout << root->val << " ";
        inorder(root->right);
    }
}

int main() {
    int n, val;
    TreeNode* root = nullptr;

    cout << "Enter number of elements: ";
    cin >> n;

    cout << "Enter the elements: ";
    for (int i = 0; i < n; ++i) {
        cin >> val;
        root = insert(root, val);
    }

    cout << "Inorder traversal: ";
    inorder(root);
    cout << endl;

    return 0;
}
//Enter number of elements: 7
//Enter the elements: 50 30 20 40 70 60 80
//Inorder traversal: 20 30 40 50 60 70 80

实验3代码(哈希表) 

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

// 哈希表的最大大小
#define MAX_SIZE 100

// 哈希表结构
typedef struct HashTable {
    int *table;
    int size;
} HashTable;

// 哈希函数:除留余数法
int hash(int key, int size) {
    return key % size;
}

// 初始化哈希表
void initHashTable(HashTable *ht, int size) {
    ht->size = size;
    ht->table = (int *)malloc(sizeof(int) * size);

    // 初始化哈希表中的所有槽为 -1,表示空槽
    for (int i = 0; i < size; i++) {
        ht->table[i] = -1;
    }
}

// 线性探测法处理冲突
int linearProbe(HashTable *ht, int key) {
    int index = hash(key, ht->size);
    int i = 0;

    // 查找空槽
    while (i < ht->size && ht->table[(index + i) % ht->size] != -1) {
        i++;
    }

    // 返回下一个空槽的索引
    return (index + i) % ht->size;
}

// 插入操作
void insert(HashTable *ht, int key) {
    int index = hash(key, ht->size);

    // 如果当前槽位已经被占用,则进行线性探测
    if (ht->table[index] != -1) {
        index = linearProbe(ht, key);
    }

    // 将元素插入哈希表
    ht->table[index] = key;
}

// 查找操作
int find(HashTable *ht, int key) {
    int index = hash(key, ht->size);
    int i = 0;

    // 查找元素
    while (i < ht->size) {
        int probeIndex = (index + i) % ht->size;
        if (ht->table[probeIndex] == -1) {
            return 0;  // 没有找到
        }
        if (ht->table[probeIndex] == key) {
            return 1;  // 找到元素
        }
        i++;
    }
    return 0;  // 没有找到
}

// 打印哈希表
void printHashTable(HashTable *ht) {
    for (int i = 0; i < ht->size; i++) {
        if (ht->table[i] != -1) {
            printf("Index %d: %d\n", i, ht->table[i]);
        } else {
            printf("Index %d: empty\n", i);
        }
    }
}

// 主函数
int main() {
    int size, numElements, element, key;

    // 用户输入哈希表大小
    printf("Enter the size of the hash table: ");
    scanf("%d", &size);

    // 创建哈希表
    HashTable ht;
    initHashTable(&ht, size);

    // 用户输入插入的元素数量
    printf("Enter the number of elements you want to insert: ");
    scanf("%d", &numElements);

    // 插入元素
    printf("Enter %d elements to insert into the hash table:\n", numElements);
    for (int i = 0; i < numElements; i++) {
        scanf("%d", &element);
        insert(&ht, element);
    }

    // 打印哈希表内容
    printf("\nHash Table contents:\n");
    printHashTable(&ht);

    // 查找操作
    printf("\nEnter an element to search in the hash table: ");
    scanf("%d", &key);
    printf("Find %d: %s\n", key, find(&ht, key) ? "Found" : "Not Found");

    // 释放内存
    free(ht.table);
    return 0;
}

四、实验结果

实验1结果

 实验2结果

 实验3结果 


(今日分享暂时到此为止啦!为不断努力的自己鼓鼓掌吧🥳。今日文案分享:行于途,不究终点,沿途皆终点。) 


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

相关文章:

  • RTMW:实时多人2D和3D 全人体姿态估计
  • 蓝牙BLE开发——解决iOS设备获取MAC方式
  • 1.微服务灰度发布(方案设计)
  • 独立站是什么?有什么用?
  • 【debug】
  • MyBatis如何处理延迟加载?
  • 35. TCP网络编程
  • 2024国赛A题第一问
  • 【ubuntu基础软件安装】
  • Weex购物车长列表横滑操作优化“编年史”
  • 成本高,周期长,家电行业如何突破重实验轻仿真的瓶颈?
  • 整合语音命令与大型语言模型 (LLM) 及传感器在人类和机器人之间进行有效的自然语言交流 以简化装配操作并提高生产车间的安全性
  • Redis可视化工具 RDM mac安装使用
  • 【C语言】判断素数
  • 电商平台能挡住恶意网络爬虫的攻击吗?
  • 一键自动创建删除磁盘的逻辑卷信息
  • 大模型日报 2024-12-20
  • 完成SSH连接与端口映射并运行hello_world.py
  • 鸿蒙UI开发——使用WidthTheme实现局部深浅色
  • flink-1.16 table sql 消费 kafka 数据,指定时间戳位置消费数据报错:Invalid negative offset 问题解决
  • Vue项目中env文件的作用和配置
  • 分布式光纤传感|分布式光纤测温|线型光纤感温火灾探测器DTS|DTS|DAS|BOTDA的行业16年的总结【2024年】
  • 【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
  • 【物联网技术与应用】实验15:电位器传感器实验
  • 浏览器工作原理与实践-12|栈空间和堆空间:数据是如何存储的
  • ChatGPT助力数据可视化与数据分析效率的提升(一)