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

news/2024/12/23 21:17:15 标签: 数据结构, 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.niftyadmin.cn/n/5797012.html

相关文章

Kafka快速扫描

Architecture 系统间解耦&#xff0c;异步通信&#xff0c;削峰填谷 Topic 消息主题&#xff0c;用于存储消息 Partition 分区&#xff0c;通过扩大分区&#xff0c;可以提高存储量 Broker 部署Kafka服务的设备 Leader kafka主分区 Follwer kafka从分区 高性能之道&#xff1a…

【开源库 | minizip】Linux(Ubuntu18.04)下,minizip的编译、交叉编译

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-12-20 …

【RK3588 Linux 5.x 内核编程】-内核中断与ThreadedIRQ

内核中断与ThreadedIRQ 文章目录 内核中断与ThreadedIRQ1、Threaded IRQ介绍2、Threaded IRQ相关API3、驱动实现4、驱动验证当 Interrupt 触发时,Interrupt handler 应该执行得非常快,它不应该运行更多的时间(它不应该执行耗时的任务)。 如果我们有执行更多任务的中断处理程…

MyBatis实现自定义MyBatis插件详解

MyBatis实现自定义MyBatis插件详解 初识插件拦截对象拦截实现加载流程xml配置插件XMLConfigBuilder加载插件创建插件对象 例子确定拦截对象实现拦截接口配置插件测试 MyBatis的一个重要的特点就是插件机制&#xff0c;使得MyBatis的具备较强的扩展性&#xff0c;我们可以根据My…

JavaIO 在 Android 中的应用

主要是学习如何设计这样的 IO 系统&#xff0c;学习思想而不是代码本身。 1、装饰模式在 IO 中的应用 IO 嵌套其实使用到了装饰模式。装饰模式在 Android 中有大量的使用实例&#xff0c;比如 Context 体系&#xff1a; 可以看到 Context 还是基本上遵循了标准装饰模式的结构…

windows C#-编写复制构造函数

C # 记录为对象提供复制构造函数&#xff0c;但对于类&#xff0c;你必须自行编写。 编写适用于类层次结构中所有派生类型的复制构造函数可能很困难。 如果类不是 sealed&#xff0c;则强烈建议考虑创建 record class 类型的层次结构&#xff0c;以使用编译器合成的复制构造函…

【C语言之】二进制的四种位运算:取反、与、或、异或

【C语言之】二进制的四种位运算&#xff1a;取反、与、或、异或 1、按位取反运算&#xff08; bit not : ~ &#xff09; 对操作数的每一位执行逻辑取反操作&#xff0c;即将每一位的 0 变为 1&#xff0c;1 变为 0。取反运算符&#xff0c;按二进制位进行"取反"运…

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…