编写算法建立线性表或二叉排序树并完成相应查找算法: 1. 先依次输入元素为简单类型(int、char)或自定义结构体类型(如订单信息或学生信息或员工信息)的数个数据元素建立顺序存储的线性表,然后①以该线性表为查找表进行顺序查找;②用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。

时间: 2024-03-21 16:43:06 浏览: 20
以下是使用 C++ 实现的线性表和二叉排序树,并完成相应的查找算法: ```c++ #include <iostream> #include <vector> #include <algorithm> using namespace std; // 定义订单信息结构体 struct Order { int id; string name; double price; }; // 定义学生信息结构体 struct Student { int id; string name; int age; double score; }; // 定义员工信息结构体 struct Employee { int id; string name; string department; double salary; }; // 定义简单类型元素的线性表类 template <typename T> class LinearList { public: // 构造函数 LinearList() { size = 0; capacity = 10; data = new T[capacity]; } // 析构函数 ~LinearList() { delete[] data; } // 在线性表尾部插入元素 void push_back(T element) { if (size == capacity) { capacity *= 2; T* new_data = new T[capacity]; for (int i = 0; i < size; i++) { new_data[i] = data[i]; } delete[] data; data = new_data; } data[size++] = element; } // 顺序查找元素 int sequential_search(T element) { for (int i = 0; i < size; i++) { if (data[i] == element) { return i; } } return -1; // 没有找到 } // 冒泡排序 void bubble_sort() { for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (data[j] > data[j + 1]) { swap(data[j], data[j + 1]); } } } } // 折半查找元素 int binary_search(T element) { int left = 0, right = size - 1; while (left <= right) { int mid = (left + right) / 2; if (data[mid] == element) { return mid; } else if (data[mid] < element) { left = mid + 1; } else { right = mid - 1; } } return -1; // 没有找到 } // 打印线性表元素 void print() { for (int i = 0; i < size; i++) { cout << data[i] << " "; } cout << endl; } private: T* data; // 数据存储区 int size; // 当前元素个数 int capacity; // 容量 }; // 定义二叉排序树节点类 template <typename T> class BSTNode { public: T data; // 数据 BSTNode<T>* left; // 左子树指针 BSTNode<T>* right; // 右子树指针 // 构造函数 BSTNode(T data) { this->data = data; left = nullptr; right = nullptr; } }; // 定义二叉排序树类 template <typename T> class BinarySearchTree { public: // 构造函数 BinarySearchTree() { root = nullptr; } // 析构函数 ~BinarySearchTree() { destroy(root); } // 在二叉排序树中插入元素 void insert(T data) { insert_helper(root, data); } // 中序遍历二叉排序树,输出排序后的结果 void inorder_traversal() { inorder_traversal_helper(root); cout << endl; } // 折半查找元素 int binary_search(T element) { return binary_search_helper(root, element); } private: BSTNode<T>* root; // 根节点 // 销毁二叉排序树 void destroy(BSTNode<T>* node) { if (node != nullptr) { destroy(node->left); destroy(node->right); delete node; } } // 插入元素辅助函数 void insert_helper(BSTNode<T>*& node, T data) { if (node == nullptr) { node = new BSTNode<T>(data); } else { if (data < node->data) { insert_helper(node->left, data); } else { insert_helper(node->right, data); } } } // 中序遍历二叉排序树辅助函数 void inorder_traversal_helper(BSTNode<T>* node) { if (node != nullptr) { inorder_traversal_helper(node->left); cout << node->data << " "; inorder_traversal_helper(node->right); } } // 折半查找元素辅助函数 int binary_search_helper(BSTNode<T>* node, T element) { if (node == nullptr) { return -1; // 没有找到 } else { if (node->data == element) { return 0; } else if (node->data < element) { int result = binary_search_helper(node->right, element); return result == -1 ? -1 : result + 1 + binary_search_helper(node->left, element); } else { int result = binary_search_helper(node->left, element); return result == -1 ? -1 : result + 1 + binary_search_helper(node->right, element); } } } }; int main() { // 测试简单类型元素的线性表 LinearList<int> list1; list1.push_back(5); list1.push_back(2); list1.push_back(4); list1.push_back(6); list1.push_back(1); list1.push_back(3); list1.print(); cout << "Sequential search: " << list1.sequential_search(4) << endl; list1.bubble_sort(); list1.print(); cout << "Binary search: " << list1.binary_search(4) << endl; // 测试自定义结构体类型的线性表 LinearList<Order> list2; list2.push_back({1, "book", 29.99}); list2.push_back({2, "pen", 3.99}); list2.push_back({3, "bag", 59.99}); list2.push_back({4, "notebook", 9.99}); list2.print(); cout << "Sequential search: " << list2.sequential_search({3, "bag", 59.99}) << endl; list2.bubble_sort(); list2.print(); cout << "Binary search: " << list2.binary_search({3, "bag", 59.99}) << endl; // 测试二叉排序树 BinarySearchTree<int> bst; bst.insert(5); bst.insert(2); bst.insert(4); bst.insert(6); bst.insert(1); bst.insert(3); bst.inorder_traversal(); cout << "Binary search: " << bst.binary_search(4) << endl; return 0; } ``` 需要注意的是,在二叉排序树中进行折半查找时,要统计节点的左子树和右子树中小于或等于或大于查找元素的节点个数,具体实现可以参考上面的代码。

相关推荐

最新推荐

recommend-type

〖程序设计基础〗练习题2及答案

一、选择题(每题1分,共30分) 下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确选项的标记写在题干后的括号内。 1.下列语句序列执行后,k 的值是( )。 int m=3, n=6, k=0; while( (m++) ( ...
recommend-type

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a

pre_o_1csdn63m9a1bs0e1rr51niuu33e.a
recommend-type

matlab建立计算力学课程的笔记和文件.zip

matlab建立计算力学课程的笔记和文件.zip
recommend-type

FT-Prog-v3.12.38.643-FTD USB 工作模式设定及eprom读写

FT_Prog_v3.12.38.643--FTD USB 工作模式设定及eprom读写
recommend-type

matlab基于RRT和人工势场法混合算法的路径规划.zip

matlab基于RRT和人工势场法混合算法的路径规划.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SPDK_NVMF_DISCOVERY_NQN是什么 有什么作用

SPDK_NVMF_DISCOVERY_NQN 是 SPDK (Storage Performance Development Kit) 中用于查询 NVMf (Non-Volatile Memory express over Fabrics) 存储设备名称的协议。NVMf 是一种基于网络的存储协议,可用于连接远程非易失性内存存储器。 SPDK_NVMF_DISCOVERY_NQN 的作用是让存储应用程序能够通过 SPDK 查询 NVMf 存储设备的名称,以便能够访问这些存储设备。通过查询 NVMf 存储设备名称,存储应用程序可以获取必要的信息,例如存储设备的IP地址、端口号、名称等,以便能
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。