数据结构------C语言经典题目(6)

1.数据结构都学了些什么?

1.基本数据类型

算数类型:

        char(字符)、int(整数)、float(单精度浮点数)、double(双精度浮点数)等。

枚举类型:

        enum,自定义一组命名的整形常量。例如颜色:enum Color {RED ,GREEN ,BLUE}:

2.构造数据类型

数组(Array):

        固定大小、连续存储的同类型元素集合;

        支持通过下标快速访问元素,但插入/删除操作效率低。

结构体(Struct):

        自定义的复合数据类型,可以包含不同类型的成员(如学生信息);

struct Student {char name[20];int age;float score;
};

联合体(Union):

        多个不同类型的变量共享同一段内存空间,同一时刻只能存储其中一个成员的值(节省内存)。

3.动态数据结构

通过指针动态分配内存,结构灵活。

链表:

        由节点组成,每个节点包含数据和指向下一个节点的指针。

        有单向链表、双向链表、循环链表等,插入/删除操作高效(无需移动大量元素),但访问效率低(需遍历)。

栈:

        遵循   后进先出  原则,可以通过数组或链表实现。

        常见操作:入栈、出栈、取栈顶元素。

队列:

        遵循   先进先出   原则,有入队、出队。

树:

        分层结构,由节点和边组成,根节点无父节点,子节点有唯一父节点。

        常见类型:二叉树(每个节点最多两个子节点)、二叉搜索树(左根右)、堆(用于优先队列)等。

图:    

        由顶点(节点)和边组成,用于表示复杂关系(社交网络、地图路径)。

        分为有向图、无向图、带权图。

4.数据结构的核心操作

查找:

        如顺序查找、二分查找(仅适用于有序数组)。

插入:

        在指定位置添加元素。

删除:

        移动指定元素。

排序:

        冒泡排序、快速排序、希尔排序。

遍历:

        按一定顺序访问元素。

5.指针与数据结构

        通过malloc()、calloc()等函数动态分配内存(如创建链表节点)。

        指针操作需注意内存泄漏(分配的内存未释放)和野指针(指向已释放的内存)问题。

6.应用场景

数组:

        适合需要快速随机访问、数据大小固定的场景(存储学生成绩)。

链表:

        适合频繁插入/删除、数据大小动态变化的场景。

栈:

        用于函数调用栈、表达式求值、括号匹配等。

队列:

        用于任务调度等。

树和图:

        用于文件系统目录结构等。

2.数据结构中的顺序表和链表有什么区别?

存储结构:

顺序表:

        1.存储方式:数据元素在内存中连续存储,逻辑上相邻的元素在物理地址上也相邻。

        2.实现方式:通常由数组实现,通过数组下标访问元素。

        3.内存分配:需要预先分配固定大小的内存空间,若数量动态变化会导致空间浪费或溢出。

链表:

        1.存储方式:数据元素分散存储,每个元素(节点)包含数据域和指针域,指针指向下一个节点的地址。

        2.实现方式:通过结构体和指针动态创建节点,节点之间通过指针链接。

        3.内存分配:按需动态分配内存,无需预先指定最大容量,比较灵活。

访问方式:

顺序表:

        随机访问:可以通过下标直接访问任意元素,时间复杂度为O(1)。

链表:        

        顺序访问:必须从表头开始逐个遍历节点,直到找到目标元素,时间复杂度为O(n)。

插入和删除操作:

顺序表:

        插入:在开头或中间任意位置插入元素,都需要移动后续所有元素。

        删除:删除中间或开头元素,需移动后续元素填补空缺。

        尾插尾删无需移动元素。

链表:

        插入/删除:只需修改指针指向,无需移动其他元素,但要找到插入位置的前驱节点。

        示例:在节点p后插入新节点:

        new_node  ->  next  =  p->next;

        p->next = new_node;

适用场景:

顺序表:       

        适合频繁随机访问的场景。

链表:

        适合频繁插入/删除的场景。

3.单向链表和双向链表有什么区别?

单向链表:

        每个节点包含一个数据域和一个指向下一个节点的指针(next)

Node1 → Node2 → Node3 → ... → NULL

        节点定义代码示例:

struct Node {int data;struct Node* next;
};

        遍历只能从头节点开始,沿next指针单向遍历(向后),无法反向访问前面的节点。

        插入节点时,只需修改当前节点的next 指针指向新节点,或新节点的next 指针指向后续节点。

        删除节点时,需找到要删除的节点的前驱节点,修改其next指针跳过要删除的节点。

        每个节点包含一个指针,内存占用相对较小。

双向链表:

        每个节点包含一个数据域、一个指向前一个节点的指针(prev)和一个指向下一个节点的指针(next)

NULL ← Node1 ↔ Node2 ↔ Node3 ← ... ← NULL

        节点定义代码示例:

struct Node {int data;struct Node* prev;struct Node* next;
};

        可以从头节点或尾节点开始,通过prev和next指针双向遍历。

        插入节点后,需同时修改新节点的prev(指向前驱节点)和next(指向后继节点)。

        删除节点时,可通过当前节点的prev指针直接找到前驱节点,通过next指针找到后继节点,修改两者的指针即可。

        每个节点包含两个指针(prev和next),内存占用比单向链表多约一倍。

4.什么是内存泄漏?如何排查和避免内存泄漏?

        内存泄漏是指程序动态分配的内存空间(如malloc、calloc、realloc等函数申请)在使用完毕后未被正确释放。即未调用free函数。导致这部分内存无法被系统重新分配利用的现象。

内存泄漏常见场景:

1.直接申请内存后未调用free释放

例如:

void function() 
{int *p = (int *)malloc(sizeof(int));// 使用 p// 未调用 free(p)
}  // p 离开作用域后,内存泄漏

2.重复释放或错误释放:

        释放已释放的指针(多次调用free(p)),导致程序崩崩溃。

        释放非动态分配的内存(局部变量的地址),导致段错误。

3.指针被覆盖:

        分配内存后,指针指向其他地址,导致原内存地址丢失,无法释放:

int *p = (int *)malloc(sizeof(int));
p = (int *)malloc(sizeof(int));  // 新分配覆盖了 p,原内存未释放
free(p);  // 仅释放了最后一次分配的内存

4.循环或条件分支中的分配未释放

        当循环或条件判断中分配内存,但某些分支未执行释放逻辑。

while (condition) 
{int *p = (int *)malloc(sizeof(int));if (some_case) {continue;  // 直接跳过释放}free(ptr);
}

如何排查:

1.手动排查:

检查所有malloc、calloc、realloc是否有对应的free,且释放次数正确。

        确保指针在释放后被置为NULL(避免野指针)。

2.使用内存检测工具

        通过memcheck根据动态检测内存泄漏,能精准定位未释放的内存及分配位置。

valgrind --leak-check=full ./your_program

3.调试器(GDB)

        在程序退出前检查堆内存状态,结合断点定位泄漏点。

如何避免:

        遵循:分配-使用-释放  的配对原则

        在释放内存后,立即将指针置为NULL,防止后续误操作(野指针)。

5.什么是内存碎片?如何避免内存碎片?

        内存碎片是指程序运行过程中,由于频繁地申请和释放内存,导致内存中出现大量不连续的小空闲块,这些空闲块虽然总容量足够,但无法满足较大内存块的分配请求,从而影响内存使用效率的现象。

分类:

1.内部碎片:

        当分配的内存块大于实际所需大小时,多余的空间未被使用,形成内部空闲空间。

2.外部碎片:

        多次分配和释放内存后,空闲内存被分割为不连续的小块,虽然总空闲内存足够,但无法找到单个足够大的连续块满足新的分配请求。

如何避免:

1.减少动态内存分配和释放的次数:

        尽量复用已分配的内存。

2.使用内存池:

        预先分配一大块内存,划分为多个固定大小的小块,通过池管理和回收,避免碎片化。

        分配/释放速度快(无需系统调用),碎片控制在池内。

// 简化的内存池结构
typedef struct {char* buffer;       // 池内存起始地址size_t block_size;  // 每个块大小size_t num_blocks;  // 块总数int* free_blocks;   // 记录可用块索引
} MemoryPool;

6.如何实现双向链表的插入?删除?

        示例代码如下:

// 定义双向链表节点结构
// 每个节点包含数据域(data)、前驱指针(prev)和后继指针(next)
typedef struct Node {int data;               // 存储节点数据struct Node* prev;      // 指向前驱节点的指针(NULL表示无前驱)struct Node* next;      // 指向后继节点的指针(NULL表示无后继)
} Node;// 创建新节点并初始化数据
// 参数:data - 节点存储的数据
// 返回:新创建的节点指针(内存分配失败时返回NULL)
Node* createNode(int data) 
{Node* newNode = (Node*)malloc(sizeof(Node));  // 分配节点内存if (newNode == NULL) {printf("内存分配失败!\n");exit(1);  // 终止程序防止空指针操作}newNode->data = data;        // 初始化数据域newNode->prev = NULL;        // 新节点初始无前驱newNode->next = NULL;        // 新节点初始无后继return newNode;              // 返回新节点指针
}// 在链表头部插入新节点
// 参数:head - 指向头节点指针的指针(用于修改头节点),data - 插入的数据
// 功能:将新节点插入到链表头部,更新头指针及前后指针关系
void insertAtHead(Node** head, int data) 
{Node* newNode = createNode(data);  // 创建新节点// 处理空链表情况:新节点成为唯一节点if (*head == NULL) {*head = newNode;  // 头指针指向新节点return;}// 非空链表处理:新节点成为新头节点newNode->next = *head;          // 新节点的后继指向原头节点(*head)->prev = newNode;        // 原头节点的前驱指向新节点*head = newNode;                // 更新头指针为新节点
}// 在链表尾部插入新节点
// 参数:head - 指向头节点指针的指针,data - 插入的数据
// 功能:遍历链表找到尾节点,将新节点连接到尾部
void insertAtTail(Node** head, int data) 
{Node* newNode = createNode(data);  // 创建新节点// 处理空链表情况:新节点成为唯一节点if (*head == NULL) {*head = newNode;  // 头指针指向新节点return;}// 查找尾节点:从头部开始遍历直到next为NULLNode* current = *head;while (current->next != NULL) {current = current->next;  // 移动到下一个节点}// 连接新节点到尾节点之后current->next = newNode;       // 尾节点的后继指向新节点newNode->prev = current;       // 新节点的前驱指向尾节点
}// 在指定节点之后插入新节点
// 参数:targetNode - 目标节点(新节点将插入到其之后),data - 插入的数据
// 功能:在目标节点之后插入新节点,处理前后节点的指针关系
void insertAfterNode(Node* targetNode, int data) 
{if (targetNode == NULL) {       // 检查目标节点是否存在printf("目标节点不存在!\n");return;}Node* newNode = createNode(data);  // 创建新节点// 新节点的后继指向目标节点的后继(可能为NULL)newNode->next = targetNode->next;// 新节点的前驱指向目标节点newNode->prev = targetNode;// 如果目标节点有后继节点,更新其后继的前驱指针if (targetNode->next != NULL) {targetNode->next->prev = newNode;}// 目标节点的后继指向新节点targetNode->next = newNode;
}// 删除指定节点
// 参数:head - 指向头节点指针的指针,targetNode - 待删除的目标节点
// 功能:从链表中移除目标节点,处理前后节点的指针连接并释放内存
void deleteNode(Node** head, Node* targetNode) 
{if (*head == NULL || targetNode == NULL) {  // 检查链表是否为空或节点是否存在printf("链表为空或目标节点不存在!\n");return;}// 处理删除头节点的情况:更新头指针if (*head == targetNode) {*head = targetNode->next;  // 头指针指向原头节点的后继}// 调整前驱节点的后继指针(如果存在前驱)if (targetNode->prev != NULL) {targetNode->prev->next = targetNode->next;  // 前驱的后继指向目标节点的后继}// 调整后继节点的前驱指针(如果存在后继)if (targetNode->next != NULL) {targetNode->next->prev = targetNode->prev;  // 后继的前驱指向目标节点的前驱}// 释放目标节点内存并置空指针(防止野指针)free(targetNode);targetNode = NULL;
}// 打印链表内容(从头部到尾部)
// 参数:head - 头节点指针
// 功能:遍历链表并输出每个节点的数据
void printList(Node* head) 
{Node* current = head;  // 当前节点从头部开始printf("双向链表内容: ");while (current != NULL) {  // 遍历直到NULL(链表末尾)printf("%d ", current->data);  // 输出当前节点数据current = current->next;       // 移动到下一个节点}printf("\n");
}// 主函数:演示双向链表操作
int main() 
{Node* head = NULL;  // 初始化空链表// 头部插入操作演示:插入10 → 链表:10// 再次头部插入20 → 链表:20 10insertAtHead(&head, 10);insertAtHead(&head, 20);// 尾部插入操作演示:插入30 → 链表:20 10 30// 再次尾部插入40 → 链表:20 10 30 40insertAtTail(&head, 30);insertAtTail(&head, 40);// 在节点20(头节点的下一个节点head->next)之后插入50// 插入后链表:20 50 10 30 40insertAfterNode(head->next, 50);// 删除节点50(此时是head->next节点)// 删除后链表恢复:20 10 30 40Node* nodeToDelete = head->next;  // 获取待删除节点(值为50的节点)deleteNode(&head, nodeToDelete);printList(head);  // 输出最终链表内容// 释放链表所有节点内存(防止内存泄漏)while (head != NULL) {Node* temp = head;       // 保存当前节点指针head = head->next;       // 头指针指向下一个节点free(temp);              // 释放当前节点内存}return 0;
}

7.怎么判断一个链表是否有环?

        可以使用快慢指针法来判断链表是否有环。

        快指针每次移动两步,慢指针每次移动一步。

        若链表存在环,快指针最终会追上慢指针。

        若快指针到达链表末尾(即指向NULL),则链表无环。

        示例代码如下:

// 定义链表节点结构
typedef struct ListNode {int val;                // 节点存储的整数值struct ListNode *next;  // 指向下一个节点的指针
} ListNode;// --------------------------
// 函数功能:判断链表是否存在环
// 输入参数:head - 链表头节点指针
// 输出参数:1 - 存在环;0 - 不存在环
// 算法:快慢指针法(弗洛伊德龟兔赛跑算法)
// 原理:快指针每次移动2步,慢指针每次移动1步。若存在环,快指针必然追上慢指针;若快指针到达链表末尾,则无环
// --------------------------
int hasCycle(ListNode *head) 
{// 处理特殊情况:空链表或单个节点(无后续节点,不可能形成环)if (head == NULL || head->next == NULL) {return 0;}// 初始化快慢指针:// 慢指针从头节点开始,每次移动1步// 快指针从头节点的下一个节点开始(领先1步),避免初始位置相同导致循环不执行(当链表有环时,至少需要2个节点才能形成环)ListNode *slow = head;ListNode *fast = head->next;// 循环条件:快慢指针未相遇(相遇则说明有环)while (fast != slow) {// 快指针到达链表末尾(无环):// 快指针每次移动2步,需检查当前节点和下一个节点是否为NULL,避免越界访问if (fast == NULL || fast->next == NULL) {return 0;  // 无环}// 慢指针移动1步slow = slow->next;// 快指针移动2步(先移动1步,再移动1步)fast = fast->next->next;}// 循环退出时,快慢指针相遇,说明存在环return 1;
}// --------------------------
// 函数功能:创建一个带环的链表(用于测试)
// 结构:1 -> 2 -> 3 -> 2(形成环,尾节点指向第二个节点)
// 返回值:链表头节点指针
// --------------------------
ListNode* createCycleList() 
{// 分配3个节点的内存空间ListNode *nodes = (ListNode*)malloc(3 * sizeof(ListNode));// 初始化节点值和连接关系nodes[0].val = 1;nodes[1].val = 2;nodes[2].val = 3;// 正常连接:1->2->3nodes[0].next = &nodes[1];nodes[1].next = &nodes[2];// 形成环:3->2(尾节点指向第二个节点,构成环)nodes[2].next = &nodes[1];return nodes;  // 返回头节点(第一个节点)
}// --------------------------
// 函数功能:创建一个无环的链表(用于测试)
// 结构:1 -> 2 -> 3 -> NULL(正常尾节点)
// 返回值:链表头节点指针
// --------------------------
ListNode* createAcyclicList() 
{// 分配3个节点的内存空间ListNode *nodes = (ListNode*)malloc(3 * sizeof(ListNode));// 初始化节点值和连接关系nodes[0].val = 1;nodes[1].val = 2;nodes[2].val = 3;// 正常连接:1->2->3->NULL(尾节点指向NULL,无环)nodes[0].next = &nodes[1];nodes[1].next = &nodes[2];nodes[2].next = NULL;return nodes;  // 返回头节点(第一个节点)
}int main() 
{// 测试带环链表ListNode *cycleHead = createCycleList();printf("带环链表检测结果:%s\n", hasCycle(cycleHead) ? "有环" : "无环");  // 预期输出"有环"// 测试无环链表ListNode *acyclicHead = createAcyclicList();printf("无环链表检测结果:%s\n", hasCycle(acyclicHead) ? "有环" : "无环");  // 预期输出"无环"// 释放内存(避免内存泄漏)// 注意:实际使用中需确保所有动态分配的内存都被正确释放free(cycleHead);free(acyclicHead);return 0;
}

主函数的打印逻辑也可以这么写:

int result = hasCycle(cycleHead); // 获取返回值(1或0)
if (result)         // 等价于 if (result != 0)
{                    printf("带环链表检测结果:有环\n");
} 
else 
{printf("带环链表检测结果:无环\n");
}

8.队列和栈有什么区别?在什么场景下使用?

队列:

        1.先进先出

        2.只能在队尾插入,队头删除

        3.入队、出队、查看队头

        4.适合“顺序处理”数据,如任务调度、缓冲区管理

        5.常用链表(避免数组的固定大小限制)或循环数组

        队列就像排队买票,先到的人先处理。数据只能从队尾加入,从队头移除。

        队列需要手动实现,一般用链表(动态分配内存,避免固定大小限制)或循环数组。

栈:

        1.后进先出

        2.只能在栈顶进行插入和删除

        3.压栈、弹栈、查看栈顶

        4.适合“回溯”的场景,如函数调用、表达式求值

        5.可以用数组或链表实现,数组实现需注意栈溢出

        栈就像一叠盘子,最后放上去的盘子最先被拿走,插入和删除只能在栈顶进行,例如函数调用时的参数传递和局部变量存储。

        栈的内存管理是由编译器自动管理的,用于存储局部变量、函数参数等,内存分配和释放效率高,但大小固定(通常只有几MB),超过会导致栈溢出。

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

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

相关文章

如何封装一个线程安全、可复用的 HBase 查询模板

目录 一、前言:原生 HBase 查询的痛点 (一)连接管理混乱,容易造成资源泄露 (二)查询逻辑重复,缺乏统一的模板 (三)多线程/高并发下的线程安全性隐患 (四…

【中间件】bthread_基础_TaskControl

TaskControl 1 Definition2 Introduce**核心职责** 3 成员解析**3.1 数据结构与线程管理****3.2 任务调度与负载均衡****3.3 线程停放与唤醒(ParkingLot)****3.4 统计与监控** 4 **工作流程**5 **设计亮点**6 **使用场景示例**7 **总结**8 学习过程中的疑…

win11 终端 安装ffmpeg 使用终端Scoop

1、安装scoop (Windows 包管理器) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iwr -useb get.scoop.sh | iex 2、使用scoop来安装ffmpeg scoop install ffmpeg 3、测试一下ffmpeg,将Mp3文件转为Wav文件 ffmpeg -i A.mp3 A.wav 然后我们就看到A.wav生成…

力扣838.推多米诺随笔

“生活就像海洋,只有意志坚强的人,才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。 每过一秒,倒向左边的多米诺骨牌会推动其左侧…

超级好用的​​参数化3D CAD 建模​​图形库 (CadQuery库介绍)

CadQuery 库详细介绍​​ ​​CadQuery​​ 是一个基于 ​​Python​​ 的 ​​参数化 3D CAD 建模​​ 库,允许用户通过编写代码(而不是传统 GUI)来创建精确的 ​​3D 模型​​。它特别适用于 ​​自动化设计、机械工程、3D 打印​​ 等场景…

HBM的哪些事

命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈,关于HBM的奇淫技巧,随后出专题介绍。

Python基于深度学习的网络舆情分析系统(附源码,部署)

大家好,我是Python徐师兄,一个有着7年大厂经验的程序员,也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 🍅文末获取源码联系🍅 2025年最全的计算机软件毕…

滑动窗口leetcode 209和76

一、leetcode 209. 长度最小的子数组 代码&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int n nums.size();int left 0;int sum 0;int res 100001;for(int right 0;right <n;right){sum nums[right];while(s…

node.js 实战——mongoDB 续一

mongoDB的基本指令 进入mongodb mongo显示当前的所有数据库 show dbs # 或者 show databases切换数据库/进入指定数据库 使用这个命令的时候&#xff0c;是不要求这个数据库是否创建 use 数据库名显示当前数据库 db显示数据库中所有集合 show collections数据库的CRUD的…

SVMSPro平台获取Websocket视频流规则

SVMSPro平台获取Websocket视频流规则 Websocket 的服务端口为&#xff1a;53372&#xff0c;如需要公网访问需要开启这个端口 这里讲的是如何获取长效URL&#xff0c;短效&#xff08;时效性&#xff09;URL也支持&#xff0c;下回讲 一、如何获取Websocket实时流视频 ws:/…

Arduino按键开关编程详解

一、按键开关的基本原理与硬件连接 1.1 按键开关的工作原理 按键开关是一种常见的输入设备&#xff0c;其核心原理基于机械触点的闭合与断开。当用户按下按键时&#xff0c;内部的金属片会连接电路两端&#xff0c;形成通路&#xff1b;松开按键后&#xff0c;金属片在弹簧作…

我的日记杂文

Sequoia sempervirens 北美红杉树 Troll 洞穴巨人 喜欢在网上搞事的人 piss off 滚开 让人恼火的 欧洲美甲 60euor - 30euro 拖车 mobie house Motel 汽车旅馆 Minoxidil 米诺地尔 Health insurance 医疗保险 casetify 香港手机品牌 coolant 汽车防冻液 Auto tint film 汽车贴…

数字智慧方案5867丨智慧建造(BIM技术智慧工地)在施工阶段的实践与应用方案(90页PPT)(文末有下载方式)

资料解读&#xff1a;智慧建造(BIM技术智慧工地)在施工阶段的实践与应用方案 详细资料请看本解读文章的最后内容。 在当今的建筑行业中&#xff0c;智慧建造已成为提升施工效率和质量的关键手段。随着科技的进步&#xff0c;智慧建造结合了物联网、大数据、人工智能等技术&am…

机器学习中的标签策略:直接标签、代理标签与人工数据生成

机器学习中的标签策略&#xff1a;直接标签、代理标签与人工数据生成 摘要 本文深入探讨了机器学习领域中标签的关键概念&#xff0c;包括直接标签与代理标签的定义、优缺点比较&#xff0c;以及人工生成数据的相关内容。通过详细实例和练习&#xff0c;帮助读者理解如何选择…

从0搭建Transformer

1. 位置编码模块&#xff1a; import torch import torch.nn as nn import mathclass PositonalEncoding(nn.Module):def __init__ (self, d_model, dropout, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdropout)# [[1, 2, 3],# [4, 5…

【Bootstrap V4系列】学习入门教程之 表格(Tables)和画像(Figure)

Bootstrap V4系列 学习入门教程之 表格&#xff08;Tables&#xff09;和画像&#xff08;Figure&#xff09; 表格&#xff08;Tables&#xff09;一、Examples二、Table head options 表格头选项三、Striped rows 条纹行四、Bordered table 带边框的表格五、Borderless table…

在C# WebApi 中使用 Nacos02: 配置管理、服务管理实战

一、配置管理 1.添加一个新的命名空间 这里我都填写为publicdemo 2.C#代码配置启动 appsetting.json加上&#xff1a; (nacos默认是8848端口) "NacosConfig": {"ServerAddresses": [ "http://localhost:8848" ], // Nacos 服务器地址"Na…

如何搭建spark yarn 模式的集群集群。

下载 App 如何搭建spark yarn 模式的集群集群。 搭建Spark on YARN集群的详细步骤 Spark on YARN模式允许Spark作业在Hadoop YARN资源管理器上运行&#xff0c;利用YARN进行资源调度。以下是搭建步骤&#xff1a; 一、前提条件 已安装并配置好的Hadoop集群&#xff08;包括HDF…

C++--入门基础

C入门基础 1. C的第一个程序 C继承C语言许多大多数的语法&#xff0c;所以以C语言实现的hello world也可以运行&#xff0c;C中需要把文件定义为.cpp&#xff0c;vs编译器看是.cpp就会调用C编译器编译&#xff0c;linux下要用g编译&#xff0c;不再是gcc。 // test.cpp #inc…

从实列中学习linux shell9 如何确认 服务器反应迟钝是因为cpu还是 硬盘io 到底是那个程序引起的。cpu负载多高算高

在 Linux 系统中,Load Average(平均负载) 是衡量系统整体压力的关键指标,但它本身没有绝对的“高/低”阈值,需要结合 CPU 核心数 和 其他性能指标 综合分析。以下是具体判断方法: 一、Load Average 的基本含义 定义:Load Average 表示 单位时间内处于可运行状态(R)和不…