【数据结构】笔试面试中常用的数据结构操作

笔试面试中常用的数据结构操作

排序与查找

  • 请编写一个C程序,实现冒泡排序。
#include <stdio.h>
// 冒泡排序函数
void bubbleSort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);bubbleSort(arr, n);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
  • 请编写一个C程序,实现选择排序。
#include <stdio.h>
// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_idx;// 外循环:遍历数组中的所有元素for (i = 0; i < n - 1; i++) {// 将当前位置设为最小值的位置min_idx = i;// 内循环:从i+1到n-1中找到最小元素的索引for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_idx]) {min_idx = j;}}// 将找到的最小值交换到它应该在的位置if (min_idx != i) {int temp = arr[i];arr[i] = arr[min_idx];arr[min_idx] = temp;}}
}
int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);selectionSort(arr, n);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
  • 请编写一个C程序,实现插入排序。
#include <stdio.h>
// 插入排序函数
void insertionSort(int arr[], int n) {int i, key, j;// 外循环:从第二个元素开始遍历数组for (i = 1; i < n; i++) {key = arr[i]; // 当前要插入的元素j = i - 1; // 已经排序的最后一个元素的索引// 将arr[i]与已排序的数组进行比较,找到插入位置while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j]; // 向后移动元素j = j - 1; // 向前移动指针}arr[j + 1] = key; // 插入当前元素}
}
int main() {int arr[] = {12, 11, 13, 5, 6};int n = sizeof(arr) / sizeof(arr[0]);insertionSort(arr, n);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
  • 请编写一个C程序,实现快速排序。
#include <stdio.h>
// 快速排序的分区函数
int partition(int arr[], int low, int high) {int pivot = arr[high]; // 选择最后一个元素作为基准int i = (low - 1); // 较小元素的索引for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于基准if (arr[j] <= pivot) {i++; // 增加较小元素的索引int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return (i + 1);
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {if (low < high) {// 找到分区点int pi = partition(arr, low, high);// 分别对分区点左右的子数组进行快速排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}
int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr) / sizeof(arr[0]);quickSort(arr, 0, n - 1);printf("Sorted array: ");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}
  • 请编写一个C程序,实现二分查找。
#include <stdio.h>
// 二分查找函数
int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int m = l + (r - l) / 2; // 计算中间位置// 检查x是否在中间位置if (arr[m] == x) {return m; // 找到了x,返回它的索引}// 如果arr[m] < x,则x只能在右半部分if (arr[m] < x) {l = m + 1;} else { // 否则x只能在左半部分r = m - 1;}}// 如果没有找到x,返回-1return -1;
}
int main() {int arr[] = {2, 3, 4, 10, 40};int n = sizeof(arr) / sizeof(arr[0]);int x = 10;int result = binarySearch(arr, 0, n - 1, x);if (result == -1) {printf("Element is not present in array\n");} else {printf("Element is present at index %d\n", result);}return 0;
}

链栈队列树

  • 请编写一个C程序,实现链表的基本操作。
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct Node {int data; // 节点存储的数据struct Node *next; // 指向下一个节点的指针
};
// 创建一个新的链表节点
struct Node* newNode(int data) {struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));new_node->data = data;new_node->next = NULL;return new_node;
}
// 在链表的末尾添加一个新节点
void append(struct Node** head_ref, int new_data) {struct Node* new_node = newNode(new_data);struct Node *last = *head_ref; // 用于找到链表的最后一个节点// 如果链表为空,新节点就是头节点if (*head_ref == NULL) {*head_ref = new_node;return;}// 否则,遍历链表找到最后一个节点while (last->next != NULL) {last = last->next;}// 将新节点添加到链表的末尾last->next = new_node;
}
// 打印链表节点
void printList(struct Node *node) {while (node != NULL) {printf("%d ", node->data);node = node->next;}
}
int main() {struct Node* head = NULL; // 初始化链表为空// 向链表添加数据append(&head, 1);append(&head, 3);append(&head, 1);append(&head, 4);append(&head, 1);append(&head, 5);// 打印链表printf("Created linked list: ");printList(head);return 0;
}
  • 请编写一个C程序,实现栈的基本操作。
#include <stdio.h>
#include <stdlib.h>
// 定义栈节点结构
struct StackNode {int data; // 节点存储的数据struct StackNode *next; // 指向下一个节点的指针
};
// 判断栈是否为空
int isEmpty(struct StackNode *root) {return !root;
}
// 创建一个新的栈节点
struct StackNode* newNode(int data) {struct StackNode* stackNode = (struct StackNode*)malloc(sizeof(struct StackNode));stackNode->data = data;stackNode->next = NULL;return stackNode;
}
// 压栈操作
void push(struct StackNode** root, int data) {struct StackNode* stackNode = newNode(data);stackNode->next = *root;*root = stackNode;printf("%d pushed to stack\n", data);
}
// 弹栈操作
int pop(struct StackNode** root) {if (isEmpty(*root)) {return -1;}struct StackNode* temp = *root;*root = temp->next;int popped = temp->data;free(temp);return popped;
}
int main() {struct StackNode* root = NULL;// 压栈操作push(&root, 10);push(&root, 20);push(&root, 30);// 弹栈操作printf("%d popped from stack\n", pop(&root));printf("%d popped from stack\n", pop(&root));printf("%d popped from stack\n", pop(&root));// 再次尝试弹栈,此时栈为空printf("%d popped from stack\n", pop(&root));return 0;
}

以上程序演示了如何使用链表来实现栈的数据结构,包括压栈(push)和弹栈(pop)操作。栈是一种后进先出(LIFO)的数据结构,它在程序中经常用于解决临时存储需求,比如函数调用、表达式求值、括号匹配等问题。在这个示例中,我们定义了一个StackNode结构体来表示栈的节点,每个节点包含一个int类型的数据和一个指向下一个节点的指针。push函数用于向栈中添加一个新的元素,而pop函数用于从栈中移除最顶部的元素。如果栈为空,pop函数将返回-1。在main函数中,我们演示了如何使用这些函数来压栈和弹栈。

  • 请编写一个C程序,实现队列的基本操作。
#include <stdio.h>
#include <stdlib.h>
// 定义队列节点结构
struct QueueNode {int data; // 节点存储的数据struct QueueNode *next; // 指向下一个节点的指针
};
// 创建一个新的队列节点
struct QueueNode* newNode(int data) {struct QueueNode* queueNode = (struct QueueNode*)malloc(sizeof(struct QueueNode));queueNode->data = data;queueNode->next = NULL;return queueNode;
}
// 队列的入队操作
void enqueue(struct QueueNode** front_ref, struct QueueNode** rear_ref, int data) {struct QueueNode* new_node = newNode(data);// 如果队列为空,新节点即为头节点if (*rear_ref == NULL) {*front_ref = new_node;*rear_ref = new_node;return;}// 否则,将新节点添加到队列末尾(*rear_ref)->next = new_node;*rear_ref = new_node;
}
// 队列的出队操作
int dequeue(struct QueueNode** front_ref) {if (*front_ref == NULL) {return -1; // 队列为空}struct QueueNode* temp = *front_ref;*front_ref = (*front_ref)->next;int dequeued = temp->data;free(temp);return dequeued;
}
int main() {struct QueueNode* front = NULL;struct QueueNode* rear = NULL;// 入队操作enqueue(&front, &rear, 10);enqueue(&front, &rear, 20);enqueue(&front, &rear, 30);// 出队操作printf("%d dequeued from queue\n", dequeue(&front));printf("%d dequeued from queue\n", dequeue(&front));printf("%d dequeued from queue\n", dequeue(&front));// 再次尝试出队,此时队列为空printf("%d dequeued from queue\n", dequeue(&front));return 0;
}

以上程序演示了如何使用链表来实现队列的数据结构,包括入队(enqueue)和出队(dequeue)操作。队列是一种先进先出(FIFO)的数据结构,它在程序中经常用于解决需要有序处理的问题,比如打印任务、任务调度等。在这个示例中,我们定义了一个QueueNode结构体来表示队列的节点,每个节点包含一个int类型的数据和一个指向下一个节点的指针。enqueue函数用于将一个新的元素添加到队列中,而dequeue函数用于从队列中移除最前面的元素。如果队列为空,dequeue函数将返回-1。在main函数中,我们演示了如何使用这些函数来进行入队和出队操作。

  • 请编写一个C程序,实现二叉树的基本操作。
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
struct TreeNode {int data; // 节点存储的数据struct TreeNode *left; // 指向左子节点的指针struct TreeNode *right; // 指向右子节点的指针
};
// 创建一个新的二叉树节点
struct TreeNode* newNode(int data) {struct TreeNode* treeNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));treeNode->data = data;treeNode->left = NULL;treeNode->right = NULL;return treeNode;
}
// 插入节点到二叉树
void insert(struct TreeNode** root, int data) {if (*root == NULL) {*root = newNode(data);return;}if (data < (*root)->data) {insert(&(*root)->left, data);} else if (data > (*root)->data) {insert(&(*root)->right, data);}
}
// 打印二叉树节点
void inorder(struct TreeNode* node) {if (node == NULL) {return;}inorder(node->left);printf("%d ", node->data);inorder(node->right);
}
int main() {struct TreeNode* root = NULL;// 插入节点到二叉树insert(&root, 50);insert(&root, 30);insert(&root, 20);insert(&root, 40);insert(&root, 70);insert(&root, 60);insert(&root, 80);// 打印二叉树的中序遍历结果printf("Inorder traversal of the given tree: \n");inorder(root);return 0;
}

以上程序演示了如何使用链表来实现二叉树的数据结构,包括插入(insert)和遍历(inorder)操作。二叉树是一种树形数据结构,每个节点最多有两个子节点:一个左子节点和一个右子节点。在这个示例中,我们定义了一个TreeNode结构体来表示二叉树的节点,每个节点包含一个int类型的数据、一个指向左子节点的指针和一个指向右子节点的指针。insert函数用于向二叉树中添加一个新的元素,而inorder函数用于以中序遍历的方式打印二叉树中的所有元素。在main函数中,我们演示了如何使用这些函数来插入节点和打印二叉树的中序遍历结果。

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

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

相关文章

《金山 WPS AI 2.0:重塑办公未来的智能引擎》

AITOP100平台获悉&#xff0c;在 2024 世界人工智能大会这一科技盛宴上&#xff0c;金山办公以其前瞻性的视野和创新的技术&#xff0c;正式发布了 WPS AI 2.0&#xff0c;犹如一颗璀璨的星辰&#xff0c;照亮了智能办公的新征程&#xff0c;同时首次公开的金山政务办公模型 1.…

【python学习】将两个 数组连接起来

在Python中&#xff0c;将两个数组&#xff08;或列表&#xff09;连接起来非常简单。对于Python的原生列表&#xff0c;你可以使用加号()操作符或者extend()方法。对于NumPy数组&#xff0c;你可以使用numpy.concatenate()函数或numpy.append()函数&#xff08;尽管numpy.appe…

Spring AOP 使用方式

ProxyFactory代理工厂提供了基于切面构造代理对象的能力&#xff0c;Spring框架结合IOC对此进行了一层封装以适应多种场景。封装后为用户提供了一套Spring风格的“API”(使用方式)。 1 xml配置方式 引入AOP的schema: <beans xmlns"http://www.springframework.org/sche…

PyTorch | 加速模型训练的妙招

引言 提升机器学习模型的训练速度是每位机器学习工程师的共同追求。训练速度的提升意味着实验周期的缩短&#xff0c;进而加速产品的迭代过程。同时&#xff0c;这也表示在进行单一模型训练时&#xff0c;所需的资源将会减少。简而言之&#xff0c;我们追求的是效率。 熟悉 PyT…

padStart方法用来格式化数据

在别人写的代码中看到的padStart方法&#xff0c;没用过&#xff0c;浅浅记录一下~ padStart方法的使用 padStart是 字符串类型的方法&#xff0c;可以用来格式化字符串&#xff0c;在字符串添加指定的字符以达到指定的长度&#xff0c;例如&#xff1a;可以用来格式化日期 …

SpringSecurity框架【认证】

目录 一. 快速入门 二. 认证 2.1 登陆校验流程 2.2 原理初探 2.3 解决问题 2.3.1 思路分析 2.3.2 准备工作 2.3.3 实现 2.3.3.1 数据库校验用户 2.3.3.2 密码加密存储 2.3.3.3 登录接口 2.3.3.4 认证过滤器 2.3.3.5 退出登录 Spring Security是Spring家族中的一个…

Python爬虫并输出

1. Python爬虫并输出示例 下面是一个使用Python编写的简单网络爬虫示例&#xff0c;该爬虫将抓取某个网页&#xff08;例如&#xff0c;我们假设为https://example.com&#xff0c;但请注意实际使用时我们需要替换为一个真实且允许抓取的网站&#xff09;的标题&#xff08;Ti…

机器学习(V)--无监督学习(三)EM算法

EM算法 极大似然估计 极大似然估计&#xff1a;(maximum likelihood estimate, MLE) 是一种常用的模型参数估计方法。它假设观测样本出现的概率最大&#xff0c;也即样本联合概率&#xff08;也称似然函数&#xff09;取得最大值。 为求解方便&#xff0c;对样本联合概率取对…

工作理念分享

上份工作的上级&#xff0c;分享他的工作理念&#xff0c;做个整理&#xff1a; 1 士气上要奋发向上有追求&#xff0c;最低限度当然是要恰饭&#xff0c;保证生活&#xff0c;最好是做一些事情&#xff0c;把钱挣了的同时也能有更多的收获。 2 公司为社会&#xff0c;用户创造…

华为HCIP Datacom H12-821 卷36

1.单选题 在PIM- SM中&#xff0c;以下关于RP 的描述&#xff0c;错误的是哪一选项? A、在PIM-SM中&#xff0c;组播数据流量不一定必须经过RP的转发。 B、对于一个组播组来说&#xff0c;可以同时有多个RP地址&#xff0c;提升网络可靠性。 C、组播网络中&#xff0c;可以…

【BUG】已解决:JsonMappingException

已解决&#xff1a;JsonMappingException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 概述&#xff1a; 没有getter方法的实体的序列化&#xff0c;并解决Jackson引发的JsonMappingException异常。 默认情况下&#xff0c;Jackson 2只会处理公有字段或具有公有get…

vue 级联下拉框选择的思维

在原来的js的思维下&#xff0c;级联下拉框的选择往往是&#xff0c;先绑定一级下拉框的菜单&#xff0c;然后在该下拉框下onchange, 在onchange事件中获取当前选项&#xff0c;然后绑定二级下拉框的数据&#xff0c;以此类推…… 在vue框架下应该改变思维&#xff0c;首先设置…

经典再现,回顾常见排序算法之冒泡排序,附Java源码及优化改进实现

回顾一下排序算法&#xff0c;老酒装新瓶&#xff0c;给自己的技能点做个回放。 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素(或记录)的任意序列&#xff0c;重新排列成一个有序的序列&#xff0c;也可以理解为高矮个站队。 衡量排…

Renesas R7FA8D1BH (Cortex®-M85) 控制DS18B20

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置 2.1 硬件接口电路 2.2 FSB配置DS18B20的IO 2.3 生成Keil工程文件 3 DS18B20驱动代码 3.1 DS18B20介绍 3.2 DS18B20驱动实现 3.2.1 IO状态定义 3.2.2 读IO状态函数 3.2.3…

OpenCV:python图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

前言 仅供个人学习用&#xff0c;如果对各位朋友有参考价值&#xff0c;给个赞或者收藏吧 ^_^ 一. cv2.getRotationMatrix2D(center, angle, scale) 1.1 参数说明 parameters center&#xff1a;旋转中心坐标&#xff0c;是一个元组参数(col, row) angle&#xff1a;旋转角度…

Go-知识测试-模糊测试

Go-知识测试-模糊测试 1. 定义2. 例子3. 数据结构4. tesing.F.Add5. 模糊测试的执行6. testing.InternalFuzzTarget7. testing.runFuzzing8. testing.fRunner9. FuzzXyz10. RunFuzzWorker11. CoordinateFuzzing12. 总结 建议先看&#xff1a;https://blog.csdn.net/a1879272183…

一文入门【NestJs】Providers

Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS&#xff0c;作为Node.js的一个现代框架&#xff0c;采用了Angular的一些核…

Redis的安装配置及IDEA中使用

目录 一、安装redis&#xff0c;配置redis.conf 1.安装gcc 2.将redis的压缩包放到指定位置解压 [如下面放在 /opt 目录下] 3.编译安装 4.配置redis.conf文件 5.开机自启 二、解决虚拟机本地可以连接redis但是主机不能连接redis 1.虚拟机网络适配器网络连接设置为桥接模式…

VSCode上通过C++实现单例模式

单例模式实际上就是为了确保一个类最多只有一个实例&#xff0c;并且在程序的任何地方都可以访问这个实例&#xff0c;也就是提供一个全局访问点&#xff0c;单例对象不需要手动释放&#xff0c;交给系统来释放就可以了&#xff0c;单例模式的设计初衷就是为了在整个应用程序的…

vue 下拉菜单树形结构——vue-treeselect的组件使用

参考&#xff1a; https://www.cnblogs.com/syjtiramisu/p/17672866.htmlhttps://www.cnblogs.com/syjtiramisu/p/17672866.html vue-treeselect的使用 - 简书下载依赖 使用https://www.jianshu.com/p/459550e1477d 实际项目使用&#xff1a;