c语言编程题经典100例——(31~35例)

1,实现深度优先搜索算法。

以下是使用 C 语言实现深度优先搜索算法的示例代码:

#include <stdio.h>  
#include <stdbool.h>  #define MAX_VERTICES 100  // 图的最大顶点数  // 图的邻接表表示  
typedef struct {  int edges[MAX_VERTICES][MAX_VERTICES];  int n; // 顶点数  
} Graph;  // 初始化图  
void initGraph(Graph *g, int n) {  g->n = n;  for (int i = 0; i < n; i++) {  for (int j = 0; j < n; j++) {  g->edges[i][j] = -1; // 无边用-1表示  }  }  
}  // 添加边  
void addEdge(Graph *g, int u, int v) {  g->edges[u][v] = 1; // 有边用1表示  g->edges[v][u] = 1; // 无向图需要添加双向边  
}  // 深度优先搜索算法  
void dfs(Graph *g, int v, bool visited[]) {  visited[v] = true; // 标记当前顶点已被访问过  printf("%d ", v); // 输出当前顶点编号  for (int i = 0; i < g->n; i++) {  if (g->edges[v][i] == 1 && !visited[i]) { // 如果当前顶点与下一个顶点之间有边且下一个顶点未被访问过,则继续搜索下一个顶点  dfs(g, i, visited);  }  }  
}  int main() {  Graph g; // 定义一个图结构体变量  initGraph(&g, 6); // 初始化图  addEdge(&g, 0, 1); // 添加边  addEdge(&g, 0, 2);  addEdge(&g, 1, 3);  addEdge(&g, 2, 3);  addEdge(&g, 3, 4);  addEdge(&g, 3, 5);  bool visited[MAX_VERTICES]; // 标记每个顶点是否被访问过,初始值为false  for (int i = 0; i < g.n; i++) { // 初始化visited数组为false  visited[i] = false;  }  printf("DFS顺序:"); // 输出深度优先搜索的结果  dfs(&g, 0, visited); // 从顶点0开始进行深度优先搜索  printf("\n");  return 0;  
}

该代码中,Graph结构体表示一个无向图,使用邻接表表示。initGraph函数用于初始化图,addEdge函数用于添加边,dfs函数实现了深度优先搜索算法。在main函数中,首先初始化图,然后标记每个顶点是否被访问过,最后从顶点0开始进行深度优先搜索并输出搜索结果。

2,实现广度优先搜索算法。

以下是使用C语言实现广度优先搜索算法的示例代码:

#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  #define MAX_VERTICES 100  // 图的最大顶点数  // 图的邻接表表示  
typedef struct {  int edges[MAX_VERTICES][MAX_VERTICES];  int n; // 顶点数  
} Graph;  // 初始化图  
void initGraph(Graph *g, int n) {  g->n = n;  for (int i = 0; i < n; i++) {  for (int j = 0; j < n; j++) {  g->edges[i][j] = -1; // 无边用-1表示  }  }  
}  // 添加边  
void addEdge(Graph *g, int u, int v) {  g->edges[u][v] = 1; // 有边用1表示  g->edges[v][u] = 1; // 无向图需要添加双向边  
}  // 广度优先搜索算法  
void bfs(Graph *g, int start) {  int queue[MAX_VERTICES]; // 队列用于存储待访问的顶点编号  int front = 0, rear = 0; // 队列的前队和后队指针  bool visited[MAX_VERTICES]; // 标记每个顶点是否被访问过,初始值为false  for (int i = 0; i < g->n; i++) { // 初始化visited数组为false  visited[i] = false;  }  visited[start] = true; // 将起始顶点标记为已访问过  printf("%d ", start); // 输出起始顶点编号  queue[rear++] = start; // 将起始顶点加入队列  while (front < rear) { // 当队列不为空时,依次取出队首元素并访问其相邻顶点  int v = queue[front++]; // 取出队首元素v  for (int i = 0; i < g->n; i++) { // 遍历v的所有相邻顶点i  if (g->edges[v][i] == 1 && !visited[i]) { // 如果顶点i与v之间有边且未被访问过,则将其标记为已访问过并加入队列中  printf("%d ", i); // 输出顶点i的编号  visited[i] = true; // 将顶点i标记为已访问过  queue[rear++] = i; // 将顶点i加入队列中  }  }  }  
}  int main() {  Graph g; // 定义一个图结构体变量  initGraph(&g, 6); // 初始化图  addEdge(&g, 0, 1); // 添加边  addEdge(&g, 0, 2);addEdge(&g, 0, 3);addEdge(&g, 0, 4);addEdge(&g, 0, 5);addEdge(&g, 0, 6);
}

3,实现链表的操作(插入、删除、反转等)。

以下是一个使用 C 语言实现链表操作的基本示例。我们将创建一个简单的链表结构,并实现插入、删除和反转功能。

#include <stdio.h>  
#include <stdlib.h>  // 定义链表节点  
struct Node {  int data;  struct Node* next;  
};  // 插入节点至链表末尾  
void insertNode(struct Node** head, int data) {  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  newNode->data = data;  newNode->next = NULL;  if (*head == NULL) { // 如果链表为空,新节点为头节点  *head = newNode;  return;  }  struct Node* temp = *head;  while (temp->next != NULL) { // 遍历找到链表的末尾  temp = temp->next;  }  temp->next = newNode; // 将新节点插入链表末尾  
}  // 删除指定数据的节点  
void deleteNode(struct Node** head, int data) {  if (*head == NULL) { // 如果链表为空,直接返回  return;  }  if ((*head)->data == data) { // 如果头节点就是要删除的节点  struct Node* temp = *head;  *head = (*head)->next; // 删除头节点,并更新头指针  free(temp); // 释放旧的头节点的内存  return;  }  struct Node* temp = *head;  while (temp->next != NULL && temp->next->data != data) { // 遍历找到要删除的节点的前一个节点  temp = temp->next;  }  if (temp->next != NULL) { // 如果找到了要删除的节点,删除并更新前一个节点的next指针  struct Node* toDelete = temp->next;  temp->next = temp->next->next; // 删除节点,并更新前一个节点的next指针  free(toDelete); // 释放被删除节点的内存  }  
}  // 反转链表  
void reverseList(struct Node** head) {  struct Node* prev = NULL;  struct Node* current = *head;  struct Node* next = NULL;  while (current != NULL) { // 遍历链表,逐个反转节点的next指针方向  next = current->next; // 暂时保存下一个节点,因为反转后current节点的next会变为NULL,无法再访问下一个节点了。  current->next = prev; // 将当前节点的next指向前一个节点,完成反转。  prev = current; // 移动prev和current节点,继续下一个循环。  current = next; // 移动current节点。  }  *head = prev; // 将反转后的链表的头节点设置为prev,因为原先的头节点已经变成了反转后的最后一个节点。  
}
 

4,实现二叉树的操作(遍历、查找等)。

以下是使用 C 语言实现二叉树的基本操作(遍历、查找等)的示例代码:

#include <stdio.h>  
#include <stdlib.h>  // 定义二叉树节点  
struct Node {  int data;  struct Node* left;  struct Node* right;  
};  // 创建新节点  
struct Node* createNode(int data) {  struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));  newNode->data = data;  newNode->left = NULL;  newNode->right = NULL;  return newNode;  
}  // 插入节点至二叉树中  
void insertNode(struct Node** root, int data) {  if (*root == NULL) { // 如果二叉树为空,创建新节点作为根节点  *root = createNode(data);  return;  }  if (data < (*root)->data) { // 如果要插入的数据比根节点小,插入到左子树中  insertNode(&((*root)->left), data);  } else { // 否则,插入到右子树中  insertNode(&((*root)->right), data);  }  
}  // 中序遍历二叉树(左子树-根节点-右子树)  
void inorderTraversal(struct Node* root) {  if (root != NULL) { // 如果节点不为空,先遍历左子树  inorderTraversal(root->left);  printf("%d ", root->data); // 访问根节点数据  inorderTraversal(root->right); // 再遍历右子树  }  
}  // 二分查找(左边界-查找数据-右边界)是否存在于二叉搜索树中  
int binarySearch(struct Node* root, int target) {  int left = 0; // 左边界为0(最小值)  int right = 100000; // 右边界为100000(最大值)  while (left <= right) { // 当左边界小于等于右边界时,继续查找  int mid = (left + right) / 2; // 中间值为mid(取整)  if (root == NULL || root->data == target) { // 如果二叉树为空或者找到了目标数据,返回对应的索引值(0表示找到了,-1表示未找到)  return root == NULL ? 0 : -1;  } else if (root->data < target) { // 如果当前节点的值小于目标数据,将左边界更新为mid+1,继续在右子树中查找  left = mid + 1;  } else { // 否则,将右边界更新为mid-1,继续在左子树中查找  right = mid - 1;  }  }  return -1; // 在二叉搜索树中未找到目标数据,返回-1表示未找到。  
}

5,实现堆排序算法。

以下是使用C语言实现堆排序算法的示例代码:

#include <stdio.h>  // 交换数组中两个元素的位置  
void swap(int* arr, int i, int j) {  int temp = arr[i];  arr[i] = arr[j];  arr[j] = temp;  
}  // 调整堆,使其满足堆的性质  
void heapify(int* arr, int n, int i) {  int largest = i; // 初始化根节点索引为最大值  int left = 2 * i + 1; // 左子节点索引  int right = 2 * i + 2; // 右子节点索引  // 如果左子节点比根节点大,则更新最大值索引  if (left < n && arr[left] > arr[largest]) {  largest = left;  }  // 如果右子节点比最大值索引对应的值大,则更新最大值索引  if (right < n && arr[right] > arr[largest]) {  largest = right;  }  // 如果最大值索引不是根节点,则交换根节点和最大值索引对应的值,并递归调整子树  if (largest != i) {  swap(arr, i, largest);  heapify(arr, n, largest);  }  
}  // 堆排序函数  
void heapSort(int* arr, int n) {  // 构建最大堆(从最后一个非叶子节点开始)  for (int i = n / 2 - 1; i >= 0; i--) {  heapify(arr, n, i);  }  // 从最后一个元素开始,依次将最大元素与当前元素交换,并调整堆  for (int i = n - 1; i >= 0; i--) {  swap(arr, 0, i);  heapify(arr, i, 0);  }  
}  int main() {  int arr[] = {5, 3, 8, 4, 2, 1, 9, 7, 6}; // 待排序数组  int n = sizeof(arr) / sizeof(arr[0]); // 数组长度  heapSort(arr, n); // 排序  printf("排序结果:");  for (int i = 0; i < n; i++) {  printf("%d ", arr[i]); // 输出排序结果  }  printf("\n");  return 0;  
}

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

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

相关文章

充电桩绝缘检测原理与示例

1、背景 充电桩绝缘检测是保证电动车充电安全的重要环节&#xff0c;通过对充电桩绝缘检测单租的测量和评估&#xff0c;来判断充电桩是否存在漏电等安全隐患&#xff0c;从而保证用户及周围环境的电器安全。 绝缘电阻&#xff1a;是指在特定的条件下&#xff0c;电气设备与接…

python之高级语法

文章目录 版权声明property属性property属性装饰器方式property属性类属性方式 with语句和上下文管理器with语句使用\上下文管理器定义 生成器生成器推导式创建生成器的方式生成器推导式yield 关键字 浅拷贝和深拷贝可变类型和不可变类型浅拷贝深拷贝总结 正则表达式正则表达式…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言&#xff1a; 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用&#xff0c;以其沉浸式、交互式的特点&#xff0c;正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

10 OAuth2.0实战:认证授权中心搭建

木谷博客系统的认证授权中心使用Spring Cloud Security+OAuth2搭建,完全遵循OAuth2.0规范。 实战部分只介绍木谷博客系统中的重点,关于细节请看笔者之前的文章:实战干货!Spring Cloud Gateway集成OAuth2.0 实现分布式统一认证授权! 客户端信息存储 OAuth2.0中的四种模式…

以太坊2.0-升级节点详细搭建文档

文章目录 一、配置 JWT 认证二、部署执行节点geth2.1 下载geth二进制文件2.2 geth节点启动三、部署共识节点Prysm3.1 下载Prysm脚本3.2 Prysm容器生成四、检查节点是否同步完成4.1 检查geth执行节点4.2 检查prysm共识节点4.3 geth常用命令一、配置 JWT 认证 使用执行客户端生成…

网易云音频数据如何爬取?

在当今数字化时代&#xff0c;音频数据的获取和处理变得越来越重要。本文将详细介绍如何使用Objective-C语言构建音频爬虫程序&#xff0c;以爬取网易云音乐为案例。我们将从Objective-C的基础知识开始&#xff0c;逐步深入到爬取思路分析、构建爬虫框架、完整爬取代码等方面&a…

P18 C++ 继承

目录 前言 01 不使用继承会让你多打很多无用的代码 02 继承 最后的话 前言 本期我们学习 C 面向对象编程中的继承。 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#…

Flask 实现Token认证机制

在Flask框架中&#xff0c;实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt&#xff0c;我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌&#xff08;Token&#xff09;&…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

【深度学习笔记】02 线性代数基础

线性代数基础 线性代数基础标量向量长度、维度和形状矩阵张量算法的基本性质降维非降维求和点积&#xff08;Dot Product&#xff09;矩阵-向量积矩阵-矩阵乘法范数 线性代数基础 标量 标量由只有一个元素的张量表示 import torchx torch.tensor(3.0) y torch.tensor(2.0)…

一文读懂 | AI技术如何驱动企业供应链智能化,赋能企业降本增效?

近年以来&#xff0c;随着互联网技术的发展&#xff0c;AI的创新研究加速。随着大数据、云计算、物联网等信息技术的发展&#xff0c;以深度神经网络为代表的AI技术迅速发展&#xff0c;图像分类、语音识别、知识问答、无人驾驶等AI技术实现了从“不能用、不好用”到“可以用”…

Mybatis入门(一)

安装 要使用 MyBatis&#xff0c; 只需将 mybatis-x.x.x.jar 文件置于类路径&#xff08;classpath&#xff09;中即可。 如果使用 Maven 来构建项目&#xff0c;则需将下面的依赖代码置于 pom.xml 文件中&#xff1a; <dependency><groupId>org.mybatis</gr…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成&#xff0c;…

优化前端性能

一次在前端面试中问到优化前端性能的方式 一、主要通过两种方式&#xff1a; reflow(回流)和repaint(重绘)。整个在浏览器的渲染过程中&#xff08;页面初始化&#xff0c;用户行为改变界面样式&#xff0c;动画改变界面样式等&#xff09;reflow(回流)和repaint(重绘) 会大大影…

数据结构—树

文章目录 9.树(1).树的基本概念#1.基本定义#2.树的广义表表示法#3.基本术语 (2).树的存储结构#1.标准形式(常用)#2.逆存储形式#3.孩子兄弟存储法 (3).并查集#1.我们到底想解决什么问题#2.并查集结点#2.Find(查)#3.Union(并)#4.例子 (4).树的遍历#1.前序遍历#2.后序遍历#3.遍历的…

winform联合halcon读取图像出现问题

1.在Form1.cs和Form.Designer.cs中添加using HalconDotNet&#xff1b; 2. 3.添加Halcon导入.cs的程序 4.注释掉导出文件的主函数&#xff0c;不然会报错。 .

Python 安装 启动项目 有线版/离线版

测试机器&#xff1a;Linux Centos7 一&#xff0c;安装Python 有线版&#xff1a; 1、首先检查机器的gcc版本&#xff08;要求版本在4.8.5&#xff09; gcc --version 2、安装前置依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel rea…

MLIR笔记(4)

4.3.3. 控制流与SSACFG区域 在MLIR里&#xff0c;区域的控制流语义由RegionKind::SSACFG表示。非正式地&#xff0c;这些区域支持这样的语义&#xff1a;区域里的操作“顺序执行”。在执行一个操作前&#xff0c;它的操作数有定义良好的值。在操作执行后&#xff0c;操作数有相…