C语言经典面试题目(十五)

1、如何在C语言中实现堆数据结构?

在C语言中,可以通过动态内存分配来实现堆数据结构。一种常见的方式是使用数组来表示堆,并使用堆的性质来维护数组的结构。以下是一个简单的堆数据结构的示例:

#include <stdio.h>
#include <stdlib.h>#define MAX_HEAP_SIZE 100typedef struct {int *elements;int size;int capacity;
} Heap;Heap *createHeap(int capacity) {Heap *heap = (Heap *)malloc(sizeof(Heap));heap->elements = (int *)malloc(sizeof(int) * (capacity + 1));heap->size = 0;heap->capacity = capacity;return heap;
}void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}void heapifyUp(Heap *heap, int index) {while (index > 1 && heap->elements[index] > heap->elements[index / 2]) {swap(&heap->elements[index], &heap->elements[index / 2]);index /= 2;}
}void heapifyDown(Heap *heap, int index) {int largest = index;int left = 2 * index;int right = 2 * index + 1;if (left <= heap->size && heap->elements[left] > heap->elements[largest]) {largest = left;}if (right <= heap->size && heap->elements[right] > heap->elements[largest]) {largest = right;}if (largest != index) {swap(&heap->elements[index], &heap->elements[largest]);heapifyDown(heap, largest);}
}void insert(Heap *heap, int value) {if (heap->size >= heap->capacity) {printf("Heap is full\n");return;}heap->elements[++(heap->size)] = value;heapifyUp(heap, heap->size);
}int removeMax(Heap *heap) {if (heap->size == 0) {printf("Heap is empty\n");return -1;}int maxValue = heap->elements[1];heap->elements[1] = heap->elements[heap->size--];heapifyDown(heap, 1);return maxValue;
}void printHeap(Heap *heap) {for (int i = 1; i <= heap->size; i++) {printf("%d ", heap->elements[i]);}printf("\n");
}int main() {Heap *heap = createHeap(MAX_HEAP_SIZE);insert(heap, 10);insert(heap, 5);insert(heap, 15);insert(heap, 20);printHeap(heap); // 输出:20 10 15 5printf("Max value removed: %d\n", removeMax(heap)); // 输出:Max value removed: 20printHeap(heap); // 输出:15 10 5return 0;
}

2、C语言中的标准输入输出函数有哪些?请列举几个常用的标准输入输出函数。

C语言中常用的标准输入输出函数包括:

  1. printf:用于向标准输出流(stdout)打印输出。
  2. scanf:用于从标准输入流(stdin)读取输入。
  3. getchar:用于从标准输入流中读取一个字符。
  4. putchar:用于向标准输出流中输出一个字符。
  5. gets:用于从标准输入流中读取一行字符串。
  6. puts:用于向标准输出流中输出一行字符串。

3、C语言中的函数调用过程是怎样的?请解释函数调用栈的作用。

函数调用过程是指在程序执行过程中,函数被调用时所发生的一系列操作,包括参数传递、栈帧的创建、函数执行和返回值的传递等。

函数调用栈是用来管理函数调用过程的数据结构,通常是一个后进先出(LIFO)的栈。每次函数调用时,会在栈上创建一个新的栈帧(activation record),用于存储函数的局部变量、参数值和返回地址等信息。当函数执行完毕时,对应的栈帧会被弹出,控制权返回到调用函数处。

函数调用栈的作用包括:

  1. 存储函数调用的信息:每次函数调用时,函数的相关信息会被存储在栈帧中,包括参数值、局部变量、返回地址等。
  2. 管理函数的执行顺序:函数调用栈按照后进先出的顺序管理函数的调用顺序,保证函数执行的顺序正确。
  3. 支持递归调用:函数调用栈的特性使得递归函数调用成为可能,每次递归调用都会在栈上创建一个新的栈帧。

4、如何在C语言中实现动态数组数据结构?

在C语言中,可以通过动态内存分配来实现动态数组。一种常见的方式是使用指针和malloc函数来动态分配内存,并使用realloc函数来调整数组大小。以下是一个简单的动态数组的示例:

#include <stdio.h>
#include <stdlib.h>#define INITIAL_CAPACITY 10typedef struct {int *array;int size;int capacity;
} DynamicArray;DynamicArray *createDynamicArray() {DynamicArray *dynArray = (DynamicArray *)malloc(sizeof(DynamicArray));dynArray->array = (int *)malloc(sizeof(int) * INITIAL_CAPACITY);dynArray->size = 0;dynArray->capacity = INITIAL_CAPACITY;return dynArray;
}void resize(DynamicArray *dynArray, int newCapacity) {dynArray->array = (int *)realloc(dynArray->array, sizeof(int) * newCapacity);dynArray->capacity = newCapacity;
}void append(DynamicArray *dynArray, int value) {if (dynArray->size >= dynArray->capacity) {resize(dynArray, dynArray->capacity * 2);}dynArray->array[dynArray->size++] = value;
}void printDynamicArray(DynamicArray *dynArray) {for (int i = 0; i < dynArray->size; i++) {printf("%d ", dynArray->array[i]);}printf("\n");
}int main() {DynamicArray *dynArray = createDynamicArray();for (int i = 0; i < 20; i++) {append(dynArray, i);}printDynamicArray(dynArray); // 输出:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19free(dynArray->array);free(dynArray);return 0;
}

5、C语言中的信号处理函数有哪些?请列举几个常用的信号处理函数。

C语言中常用的信号处理函数包括:

  1. signal:用于设置信号的处理函数。
  2. kill:向指定进程发送信号。
  3. raise:向当前进程发送信号。
  4. abort:向当前进程发送SIGABRT信号,导致程序异常终止。

以下是一个简单的示例,演示了如何使用signal函数设置信号的处理函数:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>void signalHandler(int signum) {printf("Received signal %d\n", signum);
}int main() {signal(SIGINT, signalHandler); // 设置SIGINT信号的处理函数为signalHandlerprintf("Waiting for SIGINT signal...\n");while (1) {// 死循环等待信号}return 0;
}

在上面的示例中,当接收到SIGINT信号(Ctrl+C)时,将调用signalHandler函数进行处理。

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

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

相关文章

​ubuntu图形界面卡住了​,通过以下几种方法解决

Ubuntu图形界面卡住的问题可以通过以下几种方法解决&#xff1a; 强制重启。长按电源按钮强制关机&#xff0c;然后再次开机。1 使用命令行界面。同时按住Ctrl和Alt键&#xff0c;然后按住SysRq键&#xff08;有的键盘上是PrtSc键&#xff09;和R键&#xff0c;接着依次按E、…

DragDiffusion的Win10部署方案

DragDiffusion就不再过多介绍。这是之前的一个Win10部署工作。文章链接这里就不贴了。 源代码 直接上Win10改好的程序下载链接&#xff1a;CSDN下载 Github我没有上传&#xff0c;因为实在是太大了。。。 接下来&#xff0c;您需要下载好上述文件&#xff0c;同时您需要去G…

【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示&#xff1a; 背景需求&#xff1a; 把python实现docx表格文字和段落文字的“手动换行符&#xff08;软回车&#xff09;”变成“段落标记&#xff08;硬回车&#xff09;合并在一起统计数量 【技术类-02】python实现docx段落文字的“手动换行符&#xff08;软回车&a…

2024年AI辅助研发:科技创新的引擎

CSND - 个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《人工智能》 技术进展 进入2024年&#xff0c;人工智能&#xff08;AI&#xff09;在科技界和工业界的焦点地位更加巩固&#xff0c;其在辅助研发领域的技术进步尤为显著。深度学习技术的突飞猛进使得数据分…

面视题之——悲观锁和乐观锁

面视题之——悲观锁和乐观锁 概念 悲观锁 悲观锁是在执行线程任务时直接加锁&#xff0c;以确保同一时刻只有一个线程可以访问共享资源。在使用悲观锁时&#xff0c;每次访问共享资源时都会尝试获取锁&#xff0c;如果锁已经被其他线程占用&#xff0c;当前线程就会被阻塞&a…

数据结构 之 优先级队列(堆) (PriorityQueue)

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

Mysql:行锁,间隙锁,next-key锁?

注&#xff1a;以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1&#xff1a;只加了一行写锁&#xff0c;锁住要修改的这一行。语义问题数据一致性问题 猜想2&#xff1a;要修改的这一行加写锁&#xff0c;扫描过程中遇到其它行加读锁猜想3&#xff1a;要修改的这一行加写锁&…

怎么利用视频截取gif?三步在线转换gif

在当今的社交媒体和网络世界中&#xff0c;GIF图像已经成为了一种非常受欢迎的表达方式。它们以简洁、循环播放的形式&#xff0c;能够生动地展示一系列图像的变化。你可能好奇&#xff0c;如何从视频中提取GIF图呢&#xff1f;很简单&#xff0c;使用视频转gif工具手机、pc均可…

测评报告|2024 年主流实时音视频SDK提供商

引言 随着2024年的到来&#xff0c;实时通讯&#xff08;RTC&#xff09;技术已成为推动数字经济发展的关键因素。从最基础的文本、音频和视频通信扩展到即时消息、文件共享、语音呼叫、直播互动以及视频会议等多元化功能&#xff0c;RTC技术在各个行业中的应用日益广泛。根据…

GaN HEMTs在电力电子应用中的交叉耦合与基板电容分析与建模

来源&#xff1a;Analysis and Modeling of Cross-Coupling and Substrate Capacitances in GaN HEMTs for Power-Electronic Applications&#xff08; TED 17年&#xff09; 摘要 本文提出了一种考虑了基板电容与场板之间交叉耦合效应的场板AlGaN/GaN高电子迁移率晶体管(HE…

RabbitMQ学习总结-基础篇

1..RabbitMQ 本身是一个消息中间件&#xff0c;在服务应用中&#xff0c;可解决高性能&#xff0c;高并发&#xff0c;高应用的问题&#xff0c;极大程度上解决了应用的性能问题。 2.MQ的使用分为生产者和消费者&#xff0c;生产者生产消息&#xff0c;消费者去消费消息。 3.…

力扣每日一题 卖木头块 线性DP

Problem: 2312. 卖木头块 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神题解 复杂度 时间复杂度: O ( n m ( m n ) ) O(nm(mn)) O(nm(mn)) 空间复杂度: O ( n m ) O(nm) O(nm) Code class Solution {public long sellingWood(int n, int m, int…

DELETE、TRUNCATE 和 DROP 在MySQL中的区别及使用示例

在MySQL数据库中&#xff0c;DELETE、TRUNCATE TABLE 和 DROP 这三个命令分别适用于不同的数据删除需求&#xff0c;它们在工作原理、应用场景以及特性上有所区别。接下来&#xff0c;我们通过实例演示来明确这三者的不同之处。 DELETE 命令 功能与示例&#xff1a;DELETE 语…

AI基础知识问答(1)

1.什么是线性判别分析法&#xff08;FDA&#xff09;&#xff1f; 线性判别分析是一种对于监督数据降维的经典方法。通过对数据标准化&#xff0c;求得类内散度矩阵和类间散度矩阵&#xff0c;寻找一个投影矩阵W&#xff0c;使得同类样例的投影点尽可能接近&#xff0c;异类样…

基于高德地图JS API实现Vue地图选点组件

基于高德地图JS API2.0实现一个搜索选择地点后返回给父组件位置信息的功能&#xff0c;同时可以进行回显 目录 1 创建key和秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 使用组件前准备2.1 导入loader2.2 在对应的组件设置秘钥2.3 引入css样式 3 功能实现…

Leetcode 1514 概率最大的路径

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 原题链接&#xff1a;Leetcode 1514 概率最大的路径 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b…

HTML静态网页成品作业(HTML+CSS)——非遗昆曲介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

【测试开发学习历程】在CentOS7上安装Docker

前言&#xff1a; 内容进入到Docker的时间虽然不是特别长&#xff0c; 但是呢在虚拟机上安装Docker的步骤还是不能少&#xff0c; 因为自己以后也是可能用到这个东西的。 注意&#xff0c;下文中提到的保存退出的命令是&#xff1a; :wq 如果要编辑文件的步骤&#xff0c;…

CIDR网络地址、广播地址、网段区间计算说明与计算工具

文章目录 开始问题参考答案 答案解析计算工具测试 开始 好久没有看计算网络&#xff0c;感觉已经完全返给老师了。 最近&#xff0c;有同事遇到个问题&#xff0c;网络一直不对&#xff0c;又开始重新看一下。 相信很多朋友长时间不看也忘了&#xff0c;所以&#xff0c;这里…

pdf转图片(利用pdf2image包)

参考&#xff1a; pdf2image pip install pdf2image代码&#xff1a; from pdf2image import convert_from_path, convert_from_bytes import osoutput_folder ./xx/ dpi_value 600 pdf_start_page 1 # pdf显示的第一页 start_page 1 # 真实页码 prex # 图像前缀def to_…