C或C++中实现数据结构课程中的链表、数组、树和图案例

1. 双向链表(Doubly Linked List)-----支持双向遍历。

C++实现

#include <iostream>struct Node {int data;Node* prev;Node* next;
};class DoublyLinkedList {
private:Node* head;
public:DoublyLinkedList() : head(nullptr) {}// 在链表末尾插入节点void append(int data) {Node* newNode = new Node{data, nullptr, nullptr};if (!head) {head = newNode;} else {Node* temp = head;while (temp->next) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;}}// 打印链表void print() {Node* temp = head;while (temp) {std::cout << temp->data << " <-> ";temp = temp->next;}std::cout << "nullptr" << std::endl;}~DoublyLinkedList() {Node* temp;while (head) {temp = head;head = head->next;delete temp;}}
};int main() {DoublyLinkedList list;list.append(1);list.append(2);list.append(3);list.print();return 0;
}

2. 循环链表(Circular Linked List)-----尾节点指向头节点。

C语言实现

#include <stdio.h>
#include <stdlib.h>struct Node {int data;struct Node* next;
};// 在循环链表末尾插入节点
void append(struct Node** head, int data) {struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));newNode->data = data;if (*head == NULL) {*head = newNode;newNode->next = *head;} else {struct Node* temp = *head;while (temp->next != *head) {temp = temp->next;}temp->next = newNode;newNode->next = *head;}
}// 打印循环链表
void printList(struct Node* head) {if (head == NULL) return;struct Node* temp = head;do {printf("%d -> ", temp->data);temp = temp->next;} while (temp != head);printf("HEAD\n");
}int main() {struct Node* head = NULL;append(&head, 1);append(&head, 2);append(&head, 3);printList(head);return 0;
}

3. 二叉搜索树(Binary Search Tree, BST)--支持插入、查找和中序遍历。

C++实现

#include <iostream>struct TreeNode {int data;TreeNode* left;TreeNode* right;TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}
};// 插入节点
TreeNode* insert(TreeNode* root, int data) {if (root == nullptr) {return new TreeNode(data);}if (data < root->data) {root->left = insert(root->left, data);} else {root->right = insert(root->right, data);}return root;
}// 查找节点
bool search(TreeNode* root, int data) {if (root == nullptr) return false;if (root->data == data) return true;if (data < root->data) return search(root->left, data);return search(root->right, data);
}// 中序遍历
void inorder(TreeNode* root) {if (root != nullptr) {inorder(root->left);std::cout << root->data << " ";inorder(root->right);}
}int main() {TreeNode* root = nullptr;root = insert(root, 5);insert(root, 3);insert(root, 7);insert(root, 2);insert(root, 4);std::cout << "中序遍历结果: ";inorder(root);std::cout << std::endl;std::cout << "查找节点 4: " << (search(root, 4) ? "找到" : "未找到") << std::endl;return 0;
}

4. 图的深度优先搜索(DFS)---深度优先和广度优先遍历。

C++实现

#include <iostream>
#include <list>
#include <vector>class Graph {
private:int V; // 顶点数std::vector<std::list<int>> adj; // 邻接表void DFSUtil(int v, std::vector<bool>& visited) {visited[v] = true;std::cout << v << " ";for (int neighbor : adj[v]) {if (!visited[neighbor]) {DFSUtil(neighbor, visited);}}}public:Graph(int V) : V(V), adj(V) {}void addEdge(int v, int w) {adj[v].push_back(w);}void DFS(int start) {std::vector<bool> visited(V, false);DFSUtil(start, visited);}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);std::cout << "从顶点 2 开始的DFS遍历结果: ";g.DFS(2);std::cout << std::endl;return 0;
}

5. 图的广度优先搜索(BFS)

C++实现

#include <iostream>
#include <list>
#include <queue>class Graph {
private:int V; // 顶点数std::vector<std::list<int>> adj; // 邻接表public:Graph(int V) : V(V), adj(V) {}void addEdge(int v, int w) {adj[v].push_back(w);}void BFS(int start) {std::vector<bool> visited(V, false);std::queue<int> queue;visited[start] = true;queue.push(start);while (!queue.empty()) {int v = queue.front();std::cout << v << " ";queue.pop();for (int neighbor : adj[v]) {if (!visited[neighbor]) {visited[neighbor] = true;queue.push(neighbor);}}}}
};int main() {Graph g(4);g.addEdge(0, 1);g.addEdge(0, 2);g.addEdge(1, 2);g.addEdge(2, 0);g.addEdge(2, 3);g.addEdge(3, 3);std::cout << "从顶点 2 开始的BFS遍历结果: ";g.BFS(2);std::cout << std::endl;return 0;
}

6. 堆(Heap)

最小堆(C++实现)-----支持插入和弹出最小元素。

#include <iostream>
#include <vector>
#include <algorithm>class MinHeap {
private:std::vector<int> heap;void heapifyUp(int index) {while (index > 0) {int parent = (index - 1) / 2;if (heap[index] >= heap[parent]) break;std::swap(heap[index], heap[parent]);index = parent;}}void heapifyDown(int index) {int left, right, smallest;while (true) {left = 2 * index + 1;right = 2 * index + 2;smallest = index;if (left < heap.size() && heap[left] < heap[smallest]) {smallest = left;}if (right < heap.size() && heap[right] < heap[smallest]) {smallest = right;}if (smallest == index) break;std::swap(heap[index], heap[smallest]);index = smallest;}}public:void push(int value) {heap.push_back(value);heapifyUp(heap.size() - 1);}int pop() {int root = heap[0];heap[0] = heap.back();heap.pop_back();heapifyDown(0);return root;}void print() {for (int i : heap) {std::cout << i << " ";}std::cout << std::endl;}
};int main() {MinHeap heap;heap.push(5);heap.push(3);heap.push(8);heap.push(1);heap.push(2);heap.print();std::cout << "弹出最小元素: " << heap.pop() << std::endl;heap.print();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils 文章目录 HarmonyOS NEXT动画系统实现教程&#xff1a;深入理解FuncUtils1. 动画系…

AI日报 - 2025年3月17日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | GPT-o1在卡内基梅隆大学数学考试中获满分&#xff0c;展示AI数学能力新高度 成本仅5美分/题&#xff0c;推理速度不到1分钟 ▎&#x1f4bc; 商业动向 | Figure推出BotQ机器人制造设施&…

Tauri + Vite + SvelteKit + TailwindCSS + DaisyUI 跨平台开发详细配置指南(Windows)

Tauri Vite SvelteKit TailwindCSS DaisyUI 跨平台开发详细配置指南&#xff08;Windows&#xff09; 本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议。转载请注明出处及本声明 原文链接&#xff1a;[你的文章链接] &#x1f6e0;️ 环境准备 1. 安装核心工具…

在 macOS 上优化 Vim 用于开发

简介 这篇指南将带你通过一系列步骤&#xff0c;如何在 macOS 上优化 Vim&#xff0c;使其具备 代码补全、语法高亮、代码格式化、代码片段管理、目录树等功能。此外&#xff0c;我们还会解决在安装过程中可能遇到的常见错误。 1. 安装必备工具 在开始 Vim 配置之前&#xff…

golang开发支持onlyoffice的token功能

一直都没去弄token这块&#xff0c;想着反正docker run的时候将jwt置为false即可。 看了好多文章&#xff0c;感觉可以试试&#xff0c;但是所有文件几乎都没说思路。 根据我的理解和成功的调试&#xff0c;思路是&#xff1a; 我们先定义2个概念&#xff0c;一个是文档下载…

Android wifi的开关Settings值异常分析

Android wifi的开关Settings值异常分析 文章目录 Android wifi的开关Settings值异常分析一、前言二、异常分析1、adb或者串口获取Settings的wifi开关值2、代码获取wifi开关值3、根据日志分析代码(1)logcat 对应的wifi开启日志的代码①WifiServiceImpl.java② WifiSettingsStore…

C#的委托Action

在 C# 中&#xff0c;Action 是一个预定义的委托类型&#xff0c;它位于 System 命名空间下。下面详细介绍它的作用和使用方法。 作用 Action 委托的主要作用是封装一个方法&#xff0c;这个方法没有返回值&#xff08;即返回类型为 void&#xff09;。它提供了一种简洁的方式…

Qt MainWindow简单例子(文本编辑)

使用Qt控件练习文本编辑窗口的创建。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLabel> #include <QProgressBar>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public Q…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切换版本之后。 关闭终端&#xff0c;再次打开&#xff0c;输入 node -v 还是得到之前的 node 版本。 原因&#xff1a; 在这里这个 default 中有个 node 的版本号&#xff0c;使用 nvm use 时&a…

织梦dedecmsV5.7提示信息提示框美化(带安装教程和效果展示)

一、效果展示 1、安装前效果 2、安装后效果 二、安装说明 1、安装测试版本&#xff1a;DedeCMS-V5.7.117-UTF8&#xff1b; 2、必须在修改代码之前请做好文件备份&#xff0c;以免误操无法恢复&#xff1b; 3、为了兼容其他版本&#xff0c;请在安装时&#xff0c;最好将替…

Science Advances 视触觉传感机制的交互装置,可以实时测量来自手不同部位的分布力

近日&#xff0c;由香港科技大学&#xff08;HKUST&#xff09;电子与计算机工程学系申亚京教授领导的研究团队&#xff0c;提出了一种基于数字通道的触觉交互系统&#xff0c;可以实时测量来自手不同部位的分布力&#xff0c;有望在医学评估、体育训练、机器人和虚拟现实&…

MySQL单表查询大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;总能登顶&#xff1b;路再长&#xff0c;走下去&#xff0c;定能到达。 Mysql中Select 的用法 ------前言------【SELECT】0.【准备工作】0.1 创建一个库0.2 库中创建表0.3 表中加入一些数据 1.【查询全部】2.【查询指定列】2.1查询指定列…

Vue调用子组件init方法时报错Cannot read properties of undefined (reading ‘init‘)解决方法

调用init方法语句写在this.$nextTick(() > {});方法里&#xff0c;因为nextTick方法在页面元素加载完之后调用 this.$nextTick(() > {this.$refs.chartComponent.init();});如果还报错&#xff1a;Error in nextTick: "TypeError: Cannot read properties of undef…

怎么解决在Mac上每次打开文件夹都会弹出一个新窗口的问题

在Mac上每次打开文件夹都会弹出一个新窗口的问题&#xff0c;可以通过以下方法解决‌ ‌调整Finder设置‌&#xff1a; 打开Finder&#xff0c;点击“Finder”菜单&#xff0c;选择“偏好设置”。在偏好设置中&#xff0c;选择“通用”标签。取消勾选“在标签页中打开文件夹”或…

从 Prop Drilling 到 Context:React 状态管理的演进与抉择

Context的出现解决了什么问题&#xff1f; Vue中的provide/inject和React中的Context非常相似&#xff0c;具体区别如下&#xff1a; 可以看到实际上最大的区别在于Vue是响应式&#xff0c;React是非响应式 那么context具体解决了什么问题&#xff1f;我们先看下面这个例子&a…

考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表

线性表的顺序存储结构 - 顺序表 1. 顺序表的定义 ​ 用一组地址连续的存储单元依次存储线性表的数据元素&#xff0c;从而使逻辑上相邻的两个元素在物理位置上也相邻 2. 顺序表的特点 随机访问&#xff1a; 即通过首地址和元素序号可以在O(1) 时间内找到指定元素&#xff0…

【经验分享】SpringBoot集成WebSocket开发02 之 实现一个基本示例并Spring Bean注入的方式来组织代码

结合Spring Boot和WebSocket实现一个基本示例&#xff0c;并且使用Spring Bean注入的方式来组织代码。 1. 创建Spring Boot项目 首先&#xff0c;确保你有一个Spring Boot项目&#xff0c;并在pom.xml文件中引入了WebSocket相关的依赖。 <dependencies><!-- Spring…

DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析

1. DeepSeek-R1大模型架构设计与技术特性 1.1 架构设计 DeepSeek-R1作为超大规模语言模型,其核心架构设计包含以下创新: 专家混合架构(MoE) 采用6710亿参数的混合专家架构(MoE),每个推理过程仅激活370亿参数,实现计算效率与资源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…