数据结构 C/C++(实验五:图)

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

目录

提要:实验题目

一、实验目的

二、实验内容及要求

三、源程序及注释

[实验1代码 (折半查找)](#实验1代码 (折半查找))

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

实验3代码(哈希表)

五、实验结果

实验1结果

实验2结果

实验3结果


提要:实验题目

  1. 图的邻接矩阵存储结构和深度、广度优先遍历

  2. 图的邻接表存储结构和深度、广度优先遍历


一、实验目的

  1. 熟悉图的两种常用的存储结构,即邻接矩阵和邻接表,以及在这两种存储结构上的遍历图的方法,即深度优先遍历和广度优先遍历。
  2. 进一步掌握递归算法的设计方法。
  3. 了解图的典型应用的算法程序。

二、实验内容及要求

  1. 建立图的邻接矩阵存储结构(数组表示),并将邻接矩阵输出。
  2. 建立图的邻接表存储结构,并将邻接表输出。
  3. 图的深度优先遍历。
  4. 图的广度优先遍历。

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


、源程序及注释

实验1代码 (折半查找)

cpp 复制代码
#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代码(排序二叉树进行中序遍历)

cpp 复制代码
#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代码(哈希表)

cpp 复制代码
#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结果


(今日分享暂时到此为止啦!为不断努力的自己鼓鼓掌吧🥳。今日文案分享:人生没有标准答案,珍惜当下永远是最优解。)

相关推荐
yuanbenshidiaos8 分钟前
c++---------数据类型
java·jvm·c++
数据的世界0116 分钟前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐31 分钟前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
十年一梦实验室38 分钟前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
AI莫大猫38 分钟前
(6)YOLOv4算法基本原理以及和YOLOv3 的差异
算法·yolo
taoyong00141 分钟前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我581 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
Uu_05kkq1 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
fpcc1 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很1 小时前
C++ 集合 list 使用
c++