数据结构——实验一·线性表
海~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种变成资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库!🔥
本文专栏 ➡️ 数据结构
实验目的:
- 掌握线性表的顺序/链接存储结构
- 验证顺序表/链表及其基本操作的实现
- 掌握数据结构及算法的程序实现的基本方法
实验内容:
请选择使用顺序表或链表(单链表或双链表)实现以下操作,要求设计菜单,并根据菜单提示进行操作:
- 插入一个新元素到第i个位置
- 删除第i个位置的元素
- 显示线性表中所有元素的值
- 检索表中第i个元素
- 求表的长度
顺序表操作
实验产出:
1.核心代码:
#include <bits/stdc++.h>
using namespace std;#define ERROR 0
#define OK 1
#define ListSize 100typedef char ElemType;
typedef struct
{ ElemType data[ListSize]; // 存放顺序表元素int length; // 存放顺序表的长度
} SeqList; // 顺序表的类型定义// 构造一个空的顺序表L//顺序表的初始化
int InitList_Sq (SeqList *&L)
{ L = new SeqList; // 为顺序表分配空间if(!L) // 存储分配失败return ERROR; // 初始化失败L->length=0; // 空表长度为0return OK; // 初始化成功
}// 销毁顺序表
void DestroyList_Sq(SeqList *&L)
{delete L;L = NULL;
}// 清空顺序表L
void ClearList_Sq (SeqList *L)
{L->length=0; //将线性表的长度置为0
}// 求顺序表L的长度
int ListLength_Sq (SeqList *L)
{return (L->length);
}// 判断顺序表L是否为空
int ListEmpty_Sq (SeqList *L)
{return L->length == 0;
}// 根据给定元素的序号查找。
int GetElem_Sq (SeqList *L, int i, ElemType &e)
{if ( i<1 || i>L->length) return ERROR; // 判断i值是否合理,若不合理,返回ERRRORe = L->data[i-1]; // 数组中第i-1的单元存储着线性表中第i个数据元素的内容return OK;
}// 根据给定的数据元素的值查找
int LocateElem_Sq (SeqList *L, ElemType e)
{for (int i=0; i< L->length; i++)if (L->data[i]==e) return i+1;return 0;
}// 插入数据元素
int ListInsert_Sq (SeqList *L,int i,ElemType e)
{if (L->length == ListSize)return ERROR; // 检查是否有剩余空间if ( i<1|| i>L->length+1)return ERROR; // 检查i值是否合理for (int j=L->length-1; j>=i-1; j--) // 将顺序表第i个元素之后的所有元素向后移动L->data[j+1]=L->data[j];L->data[i-1]=e; // 将新元素的内容放入顺序表的第i个位置,L->length++; // 表长增1return OK;
}// 删除顺序表中的元素
int ListDelete_Sq (SeqList *L, int i, ElemType &e)
{if (ListEmpty_Sq(L)) // 检测顺序表是否为空return ERROR; if (i<1||i>L->length) // 检查i值是否合理return ERROR; e = L->data[i-1]; // 将欲删除的数据元素内容保留在变量e中for (int j=i;j<=L->length-1;j++) // 将线性表第i+1个元素之后的所有元素向前移动L->data[j-1]=L->data[j];L->length--;return OK;
}void DispList_Sq(SeqList *L) //输出线性表
{int i;printf("顺序表:");if (ListEmpty_Sq(L)) {printf("表空!\n");return; }for (i=0;i<L->length;i++)printf("%c ",L->data[i]);printf("\n");
}// 显示菜单
void showmenu()
{printf("\n\n\n");printf(" --线性表顺序存储基本运算演示-- \n");printf("********************************************\n");printf("* 1-------顺序表的初始化 *\n");printf("* 2-------销毁顺序表 *\n");printf("* 3-------清空顺序表 *\n");printf("* 4-------求顺序表的长度 *\n");printf("* 5-------判断顺序表是否为空 *\n");printf("* 6-------检索表中第i个元素的值 *\n");printf("* 7-------检索元素值为e的位序 *\n");printf("* 8-------插入数据元素 *\n");printf("* 9-------删除数据元素 *\n");printf("* *\n");printf("* 0-------退出 *\n");printf("********************************************\n");
}void List_Sq()
{int choice;ElemType item; int Position;SeqList *L = NULL;int flag =0; // 是否创建好了顺序表while (choice!=0){//flushall();printf("\n请选择菜单号(0--9): ");scanf("%d",&choice);switch(choice){case 1:printf("初始化顺序表操作\n");if (InitList_Sq(L)) {printf("初始化成功!\n"); flag = 1; // 标志顺序表的存在}elseprintf("初始化失败!\n"); break;case 2:if (flag) // 顺序表存在{DestroyList_Sq(L);flag = 0; // 顺序表已删除printf("顺序表删除成功!\n");}else {printf("顺序表不存在,操作失败!\n");}break;case 3:if (flag) // 顺序表存在{ClearList_Sq (L); printf("顺序表清空成功!\n");DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 4:if (flag) // 顺序表存在{ printf("顺序表元素个数为 %d \n",ListLength_Sq(L));DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 5:if (flag) // 顺序表存在{ printf("顺序表%s。\n",ListEmpty_Sq(L)?"空":"不空");DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 6:if (flag) // 顺序表存在{ printf("请输入元素的位序号:");scanf("%d",&Position);if (GetElem_Sq(L,Position,item)){printf("第%d个元素为:%c\n",Position,item);}else {printf("输入的位序号错误!\n");} DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 7:if (flag) // 顺序表存在{ printf("请输入元素的值:");//flushall();scanf(" %c", &item);Position=LocateElem_Sq(L,item);if (Position){printf("该元素找到,位序是%d。\n",Position);}else {printf("该元素没找到!\n");} DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 8:if (flag) // 顺序表存在{ printf("请输入元素的值:");scanf(" %c", &item);printf("请输入要插入数据元素的位置序号:");scanf("%d",&Position);if (ListInsert_Sq (L, Position, item)) printf("该元素插入成功。\n");else printf("输入的位序号错误!\n");DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 9:if (flag) // 顺序表存在{printf("请输入要删除元素的位置序号:");scanf("%d",&Position);if (ListDelete_Sq (L, Position, item)) {printf("删除的元素为 %c \n",item);} else {printf("输入的位序号错误!\n");}DispList_Sq(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case 0:printf("\t 程序结束!\n");DestroyList_Sq(L);break;default:printf("\t 选择错误,请重新输入!\n");break;} }}int main()
{showmenu();List_Sq();return 0;
}
2.运行结果:
3.性能分析:
时间复杂度:
插入操作:由于需要从插入点开始向后移动所有后续元素,时间复杂度为O(n)。当插入位置接近表尾时效率较高,但插入到表头的效率较低。
删除操作:与插入类似,需要移动所有后续元素,时间复杂度也是O(n)。
检索操作:顺序表通过数组下标直接访问目标元素,时间复杂度为O(1)。
空间复杂度:
顺序表使用连续的数组存储元素,其空间复杂度为O(n),但需事先预留空间。如果表的最大容量(MaxSize)设置过大,可能导致空间浪费;若容量不足,则无法继续插入新元素。
实验总结与体会
(1) 掌握了线性表的顺序结构;
(2) 熟悉了顺序表及其基本操作的实现;
(3) 掌握了相关数据结构及算法的程序实现的基本方法。
单链表操作
实验产出:
1.核心代码:
#include <stdio.h>#define ERROR 0
#define OK 1
#define ListSize 100typedef char ElemType;
typedef struct Node{ElemType data; // 存放单链表元素值struct Node *next;
} LNode, *LinkList;// 构造一个空的单链表L
int InitList_L (LinkList &L)
{ L = new LNode; // 为头结点分配存储单元if (!L) return ERROR; // 无足够的内存空间,初始化失败L->next = NULL;return OK;
}// 销毁链表
int DestroyList_L (LinkList &L)
{LinkList p;while(L) {p=L;L=L->next;delete p; }return OK;
}// 将L重置为空表
void ClearList_L (LinkList & L)
{LinkList p,q;p=L->next; // p指向第一个结点while(p) { // 没到表尾 q=p->next; delete p;p=q;}L->next=NULL; // 头结点指针域为空
}// 返回L中数据元素个数
int ListLength_L(LinkList L)
{LinkList p=L->next; // p指向第一个结点int i=0; while(p) { // 遍历单链表,统计结点数i++;p=p->next;} return i;
}int ListEmpty_L (LinkList L)
{ // 若L为空表,则返回true,否则返回falsereturn (L->next==NULL);
}int LocateELem_L(LinkList L, ElemType e)
{ LinkList p;int i=1;p=L->next; while(p && p->data!=e){p=p->next;i++;} return i; // 返回L中值为e的数据元素的位置,查找失败返回NULL
}int GetElem_L (LinkList L, int i, ElemType &e)
{ // 在带头结点的单链表L中查找第i个元素LinkList p=L->next;int j=1;while (p != NULL && j<i ) {p=p->next;j++;}if (!p || i<1 ) return ERROR;e = p->data;return OK;
}int ListInsert_L (LinkList &L, int i, ElemType e)
{ // 将值为e的新结点插入到表的第i个结点的位置上LinkList p=L, q;int j=0; while (p&&j<i-1) { // 寻找第i-1个结点 p=p->next;++j;} if( !p || i<1) return ERROR; // i大于表长+1或者小于1q=new LNode; // 生成新结点q q->data=e; // 将结点q的数据域置为e q->next=p->next; // 将结点q插入L中 p->next=q; return OK;
}// 按序号删除结点
int ListDelete_L( LinkList &L, int i,ElemType &e)
{LinkList p=L, q;int j=0; while (p->next && j<i-1){ // 寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if( !(p->next) || i<1)return ERROR; // 删除位置不合理 q=p->next; // 临时保存被删结点的地址以备释放 p->next=q->next; // 改变被删除结点前驱结点的指针域 e = q->data; // 保存被删除结点的数据域 delete q; // 释放被删除结点的空间 return OK;
} // 按值删除结点
int ListDeleteValue_L( LinkList &L, ElemType e)
{LinkList p=L, q=L->next;while (q && q->data != e){ // 寻找元素值等于e的结点,并令p指向其前驱 p = q;q=q->next; } if( !q) return ERROR; // 没找到值为e的结点 p->next=q->next; // 改变被删除结点前驱结点的指针域 delete q; // 释放被删除结点的空间 return OK;
} // 在单链表的头部插入结点建立单链表
void CreateList_F_L ( LinkList &L, int n)
{ // 逆位序输入n个元素的值,建立单链表L// 要求,在用前插法创建单链表之前,需要执行InitList_L()初始化单链表,// 即先建立一个带表头结点的空表LinkList p;printf("请按逆序依次输入元素的值: ");for (int i=n; i>0; --i ) { p= new LNode; // 生成新结点scanf(" %c", &p->data); // 输入元素值 p->next = L->next; L->next=p; // 插入到表头 }
} // 在单链表的尾部插入结点建立单链表
void CreateList_L_L ( LinkList &L, int n)
{ // 正位序输入n个元素的值,建立带头结点的单链表L// 要求,在用尾插法创建单链表之前,需要执行InitList_L()初始化单链表,// 即先建立一个带表头结点的空表LinkList p, r = L;printf("请按正序依次输入元素的值: ");for (int i=0; i<n; i++ ) { p= new LNode; // 生成新结点scanf(" %c", &p->data); // 输入元素值 p->next = NULL;r->next = p; // 插入到表尾r = p; // r指向新的尾结点 }
}void DispList_L(LinkList L) //输出线性表
{printf("单链表:");if (ListEmpty_L(L)) {printf("表空!\n");return; }LinkList p=L->next;while (p) {printf("%c ",p->data);p=p->next;}printf("\n");
}// 显示菜单
void showmenu()
{printf("\n\n\n");printf(" --线性表链式存储基本运算演示-- \n");printf("********************************************\n");printf("* 1-------单链表的初始化 *\n");printf("* 2-------销毁单链表 *\n");printf("* 3-------清空单链表 *\n");printf("* 4-------求单链表的长度 *\n");printf("* 5-------判断单链表是否为空 *\n");printf("* 6-------检索表中第i个元素的值 *\n");printf("* 7-------检索元素值为e的元素 *\n");printf("* 8-------插入数据元素 *\n");printf("* 9-------按序号删除数据元素 *\n");printf("* a-------按值删除数据元素 *\n");printf("* b-------按头插法创建单链表 *\n");printf("* c-------按尾插法创建单链表 *\n");printf("* *\n");printf("* 0-------退出 *\n");printf("********************************************\n");}void List_L()
{char choice='N';ElemType item; int Position;int number;LinkList L;int flag =0; // 是否创建好了单链表while (choice!='0'){//flushall();printf("\n请选择菜单号(0--c): ");scanf(" %c",&choice);switch(choice){case '1':printf("初始化单链表操作\n");if (InitList_L(L)) {printf("初始化成功!\n"); flag = 1; // 标志顺序表的存在}elseprintf("初始化失败!\n"); break;case '2':if (flag) { // 单链表存在DestroyList_L(L);flag = 0; // 单链表已删除printf("单链表删除成功!\n");}else {printf("单链表不存在,操作失败!\n");}break;case '3':if (flag) { // 单链表存在ClearList_L(L); printf("单链表清空成功!\n");DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '4':if (flag) { // 单链表存在printf("单链表元素个数为 %d \n",ListLength_L(L));DispList_L(L); //输出线性表}else {printf("顺序表不存在,操作失败!\n");}break;case '5':if (flag) { // 单链表存在printf("单链表%s。\n",ListEmpty_L(L)?"空":"不空");DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '6':if (flag) { // 单链表存在printf("请输入元素的位序号:");scanf("%d",&Position);if (GetElem_L(L,Position,item)){printf("第%d个元素为:%c\n",Position,item);}else {printf("输入的位序号错误!\n");} DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '7':if (flag) { // 单链表存在printf("请输入元素的值:");//flushall();scanf(" %c",&item);//LinkList P = LocateELem_L(L,item);int P = LocateELem_L(L,item);if (P){//printf("该元素找到,地址为%x!\n",P);printf("该元素找到,地址为%d\n",P);}else {printf("该元素没找到!\n");} DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '8':if (flag) { // 单链表存在printf("请输入元素的值:");//flushall();scanf(" %c",&item);printf("请输入要插入数据元素的位置序号:");scanf("%d",&Position);if (ListInsert_L(L, Position, item)) printf("该元素插入成功。\n");else printf("输入的位序号错误!\n");DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '9':if (flag) { // 单链表存在printf("请输入要删除元素的位置序号:");scanf("%d",&Position);if (ListDelete_L(L, Position, item)) {printf("删除的元素为 %c \n",item);} else {printf("输入的位序号错误!\n");}DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'a':case 'A':if (flag) { // 单链表存在printf("请输入要删除元素的值:");//flushall();scanf(" %c",&item);if (ListDeleteValue_L(L, item)) {printf("删除的元素为 %c \n",item);} else {printf("改元素不存在,删除失败!\n");}DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'b':case 'B':if (flag) { // 单链表存在ClearList_L(L); // 清空单链表printf("按头插法创建单链表\n");printf("请输入要插入数据元素的个数:"); scanf("%d",&number);//flushall();CreateList_F_L(L, number); DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case 'c':case 'C':if (flag) { // 单链表存在ClearList_L(L); // 清空单链表printf("按尾插法创建单链表\n");printf("请输入要插入数据元素的个数:"); scanf("%d",&number);//flushall();CreateList_L_L(L, number); DispList_L(L); //输出线性表}else {printf("单链表不存在,操作失败!\n");}break;case '0':printf("\t 程序结束!\n");DestroyList_L(L);break;default:printf("\t 选择错误,请重新输入!\n");break;} }
}int main()
{showmenu();List_L();return 0;
}
2.运行结果:
3.性能分析:
时间复杂度:
插入操作:链表的插入只需找到第i-1个节点并修改指针,时间复杂度为O(n)(查找节点耗时),但不涉及元素移动操作。因此链表的插入效率比顺序表高,尤其在插入到表头或表尾时表现更为突出。
删除操作:链表删除同样需要找到目标节点及其前驱节点,时间复杂度为O(n)。与插入类似,删除操作无需移动后续节点,因此效率高于顺序表。
检索操作:由于链表需逐节点遍历才能找到目标元素,时间复杂度为O(n),随机访问效率较低。
空间复杂度:
链表的空间复杂度也是O(n),但因其动态分配存储空间,节省了顺序表中预留的多余空间。然而,链表每个节点需要额外存储一个指针,因此比顺序表更占用内存。
总结
在C语言中,scanf()函数用于从标准输入(通常是键盘)读取格式化输入。然而,scanf()函数在读取输入时会留下换行符(‘\n’)在输入缓冲区中,如果后面紧接着有需要读取字符的函数,比如getchar(),那么这个换行符就会被getchar()读取,导致程序的行为可能不是预期的。
使用getchar()来清除缓冲区中的换行符是一种常见的做法,这样可以确保下一次读取字符时,不会立即读取到这个残留的换行符。这样做可以避免程序逻辑中的错误,特别是在需要精确控制输入和输出时。
在scanf()函数中,在格式字符串的‘%’符号前加一个空格同样可以解决这个问题,这是用来告诉scanf()忽略任何空白字符,包括空格、制表符和换行符。这意味着,当在‘%’前面加一个空格时,scanf()会跳过这些空白字符,直到遇到非空白字符才开始匹配格式字符串。
这个空格告诉scanf()忽略前面的所有空白字符,所以即使用户在输入数字之前按下了空格键或者输入数字后按下了回车键,scanf()也会忽略这些空白字符,直接读取数字。
这样做的好处是,它不仅会忽略用户输入的换行符,还会忽略其他任何形式的空白字符,使得输入更加灵活。用户可以在数字之间插入任意数量的空格,而scanf()仍然能够正确地读取数字。
相关文章:

数据结构——实验一·线性表
海~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种变成资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)
本文基于服务器端环境展开,使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版,仅包含Conda和Python,如果只做深度学习,可使用miniconda。 [注]:Anaconda、Conda与Miniconda Conda:创建和管…...
OpenCV相机标定与3D重建(66)对立体匹配生成的视差图(disparity map)进行验证的函数validateDisparity()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 使用左右检查来验证视差。矩阵 “cost” 应该由立体对应算法计算。 cv::validateDisparity 函数是 OpenCV 库中用于对立体匹配生成的视差图&…...

2025年新开局!谁在引领汽车AI风潮?
汽车AI革命已来。 在2025年伊始开幕的CES展上,AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱,为下一代智能汽车的人机交互、场景创新率先打样。 其中,东软集团也携带AI驱动、大数据支撑…...

Spring自定义BeanPostProcessor实现bean的代理Java动态代理知识
上文:https://blog.csdn.net/qq_26437925/article/details/145241149 中大致了解了spring aop的代理的实现,其实就是有个BeanPostProcessor代理了bean对象。顺便复习下java代理相关知识 目录 自定义BeanPostProcessor实现aopJava动态代理知识动态代理的几…...
三篇物联网漏洞挖掘综述
由于物联网设备存在硬件资源受限、硬件复杂异构, 代码、文档未公开的问题, 物联网设备的漏洞挖掘存在较大的挑战: 硬件资源受限性: 通用动态二进分析技术需要在运行程序外围实施监控分析。由于物联网设备存储资源(存储)的受限性,…...
Pytorch深度学习指南 卷I --编程基础(A Beginner‘s Guide) 第1章 一个简单的回归
本章正式开始使用pytorch的接口来实现对应的numpy的学习的过程,来学习模型的实现,我们会介绍numpy是如何学习的,以及我们如何一步步的通过torch的接口来实现简单化的过程,优雅的展示我们的代码,已经我们的代码完成的事…...
【EXCEL_VBA_实战】多工作薄合并深入理解
工作背景:多个工作薄存在冲突的名称,需快速合并 困难点:工作表移动复制时,若有冲突的名称,会不断弹出对话框待人工确认 思路:利用代码确认弹出的对话框 关键代码:Application.DisplayAlerts …...
mysql之表的外键约束
MySQL表的外键约束详细介绍及代码示例 外键约束是数据库中用于维护数据完整性和一致性的重要机制。它确保一个表中的数据与另一个表中的数据相关联,防止无效的数据引用。本文将详细介绍了外键约束的各个方面,并通过具体的代码示例进行演示。 1. 外键约束…...

Tuning the Go HTTP Client Settings
记录一次Go HTTP Client TIME_WAIT的优化 业务流程 分析 通过容器监控发现服务到事件总线的负载均衡之间有大量的短链接,回看一下代码 发送请求的代码 func SendToKEvent(ev *KEvent) error {data, err : json.Marshal(ev.Data)if err ! nil {return err}log.Pri…...
第二十四课 Vue中子组件调用父组件数据
Vue中子组件调用父组件数据 Vue是不建议在不同的组件直接传递值的,我们需要使用props方法来进行组件间的值传递 子组件调用父组件数据 父模板的数据,子组件是无法直接调用的 无法直接调用 1)组件调用顶级对象中的data <div class&quo…...
Jenkins-pipeline语法说明
一. 简述: Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile: 1. Sections部分: Pipeline里的Sections通常包含一个或多个Direc…...

小米Vela操作系统开源:AIoT时代的全新引擎
小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统,并将其命名为OpenVela。这一举动在AIoT(人工智能物联网)领域掀起了不小的波澜,也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…...
NodeJs如何做API接口单元测试? --【elpis全栈项目】
NodeJs API接口单元测试 api单元测试需要用到的 assert:断言库 (还要一些断言库比如:Chai)supertest: 模拟http请求 简单的例子: const express require(express); const supertest require(supertest); const assert require(assert);…...
bundletool来特定设备规范的json安装aab包
1、获取自己设备的设备规范json java -jar ./bundletool.jar get-device-spec --outputj:/device-spec.json 2、根据设备规范生成apks包 java -jar ./bundletool.jar build-apks --device-specj:/device-spec.json --bundleapp-dev-release.aab --output随便的文件名.apks -…...

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数
快速分解质因数 完整题目和在线测评可点击下方链接前往: 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找,题…...

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...

chrome游览器JSON Formatter插件无效问题排查,FastJsonHttpMessageConverter导致Content-Type返回不正确
问题描述 chrome游览器又一款JSON插件叫JSON Formatter,游览器GET请求调用接口时,如果返回的数据是json格式,则会自动格式化展示,类似这样: 但是今天突然发现怎么也格式化不了,打开一个json文件倒是可以格…...

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…...

docker 安装 nginx 详解
在平常的开发工作中,我们经常会用到 nginx,那么在 docker 中 如何安装 nginx呢?又有哪些需要注意的事项呢?简单来说,第一步:拉取 nginx 镜像;第二步:创建 挂载目录并设置 nginx.conf…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...