数据结构【第3章】——线性表

线性表的定义

线性表:零个或多个数据元素的有限序列。

1)线性表是一个序列。即元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且只有一个前驱和后继。

2)线性表强调是有限的,元素个数也是有限的。事实上,在计算机中处理的对象都是有限的,那么无限的数列,只存在于数学的概念中。

在这里插入图片描述
注意:位序是从1开始的

在较复杂的线性表中一个数据元素可以由若干个数据项组成。

线性表的抽象数据类型

在这里插入图片描述

注:
当你传递一个参数给函数的时候,这个参数是否在函数内被改动决定了使用什么参数形式。
1)如果需要被改动,则需要传递指向这个参数的指针。
2)如果不用被改动,可以会直接传递这个参数。

线性表的顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

线性表的每个数据元素的类型都相同,可以使用C语言的一维数组来实现顺序存储结构

随着数据的插入,线性表的长度开始变大,不过线性表的当前长度不能超过存储容量,即数组的长度。

定义

#define MAXSIZE 20          /* 存储空间初始分配量 */
typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
{ElemType data[MAXSIZE]; /* 数组,存储数据元素 */int length;             /* 线性表当前长度 */
}SqList;

顺序存储结构需要3个属性:
1:存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
2:线性表的最大存储容量:数组长度MAXSIZE。
3:线性表的当前长度:length。

注1:区别数组长度和线性表长度
线性表的长度是线性表中数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的。
线性表的长度<=数组的长度。

注2:线性表的第i个元素是要存储在数组下标为i-1的位置上
在这里插入图片描述
存储器中的每个存储单元都有自己的编号,这个编号称为地址。

假设占用的是c个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系
(LOC表示获得存储位置的函数)。
在这里插入图片描述
在这里插入图片描述
通过上述公式,可以随时算出线性表中任意位置的地址,且都是相同的时间,因此它的存取时间性能为O(1),这类存储结构称为随机存取结构

优缺点

优点:

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
  • 可以快速地存取表中任一位置的元素

缺点:

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的“碎片”

代码


#include "stdio.h"    #include "stdlib.h"  
#include "math.h"  
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 20          /* 存储空间初始分配量 */
typedef int ElemType;       /* ElemType类型根据实际情况而定,这里假设为int */
typedef struct
{ElemType data[MAXSIZE]; /* 数组,存储数据元素 */int length;             /* 线性表当前长度 */
}SqList;typedef int Status;         /* Status是函数的类型,其值是函数结果状态代码,如OK等 */Status visit(ElemType c)
{printf("%d ",c);return OK;
}/* 初始化顺序线性表 */
Status InitList(SqList *L) 
{ L->length=0;return OK;
}/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(SqList L)
{ if(L.length==0)return TRUE;elsereturn FALSE;
}/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(SqList *L)
{ L->length=0;return OK;
}/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(SqList L)
{return L.length;
}/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始 */
Status GetElem(SqList L,int i,ElemType *e)
{if(L.length==0 || i<1 || i>L.length)return ERROR;*e=L.data[i-1];return OK;
}/* 初始条件:顺序线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(SqList L,ElemType e)
{int i;if (L.length==0)return 0;for(i=0;i<L.length;i++){if (L.data[i]==e)break;}if(i>=L.length)return 0;return i+1;
}/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(SqList *L,int i,ElemType e)
{ int k;if (L->length==MAXSIZE)  /* 顺序线性表已经满 */return ERROR;if (i<1 || i>L->length+1)/* 当i比第一位置小或者比最后一位置后一位置还要大时 */return ERROR;if (i<=L->length)        /* 若插入数据位置不在表尾 */{for(k=L->length-1;k>=i-1;k--)  /* 将要插入位置之后的数据元素向后移动一位 */L->data[k+1]=L->data[k];}L->data[i-1]=e;          /* 将新元素插入 */L->length++;return OK;
}/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(SqList *L,int i,ElemType *e) 
{ int k;if (L->length==0)               /* 线性表为空 */return ERROR;if (i<1 || i>L->length)         /* 删除位置不正确 */return ERROR;*e=L->data[i-1];if (i<L->length)                /* 如果删除不是最后位置 */{for(k=i;k<L->length;k++)/* 将删除位置后继元素前移 */L->data[k-1]=L->data[k];}L->length--;return OK;
}/* 初始条件:顺序线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(SqList L)
{int i;for(i=0;i<L.length;i++)visit(L.data[i]);printf("\n");return OK;
}/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/
void unionL(SqList *La,SqList Lb)
{int La_len,Lb_len,i;ElemType e;                        /*声明与La和Lb相同的数据元素e*/La_len=ListLength(*La);            /*求线性表的长度 */Lb_len=ListLength(Lb);for (i=1;i<=Lb_len;i++){GetElem(Lb,i,&e);              /*取Lb中第i个数据元素赋给e*/if (!LocateElem(*La,e))        /*La中不存在和e相同数据元素*/ListInsert(La,++La_len,e); /*插入*/}
}int main()
{SqList L;SqList Lb;ElemType e;Status i;int j,k;i=InitList(&L);printf("初始化L后:L.length=%d\n",L.length);for(j=1;j<=5;j++)i=ListInsert(&L,1,j);printf("在L的表头依次插入1~5后:L.data=");ListTraverse(L); printf("L.length=%d \n",L.length);i=ListEmpty(L);printf("L是否空:i=%d(1:是 0:否)\n",i);i=ClearList(&L);printf("清空L后:L.length=%d\n",L.length);i=ListEmpty(L);printf("L是否空:i=%d(1:是 0:否)\n",i);for(j=1;j<=10;j++)ListInsert(&L,j,j);printf("在L的表尾依次插入1~10后:L.data=");ListTraverse(L); printf("L.length=%d \n",L.length);ListInsert(&L,1,0);printf("在L的表头插入0后:L.data=");ListTraverse(L); printf("L.length=%d \n",L.length);GetElem(L,5,&e);printf("第5个元素的值为:%d\n",e);for(j=3;j<=4;j++){k=LocateElem(L,j);if(k)printf("第%d个元素的值为%d\n",k,j);elseprintf("没有值为%d的元素\n",j);}k=ListLength(L); /* k为表长 */for(j=k+1;j>=k;j--){i=ListDelete(&L,j,&e); /* 删除第j个数据 */if(i==ERROR)printf("删除第%d个数据失败\n",j);elseprintf("删除第%d个的元素值为:%d\n",j,e);}printf("依次输出L的元素:");ListTraverse(L); j=5;ListDelete(&L,j,&e); /* 删除第5个数据 */printf("删除第%d个的元素值为:%d\n",j,e);printf("依次输出L的元素:");ListTraverse(L); //构造一个有10个数的Lbi=InitList(&Lb);for(j=6;j<=15;j++)i=ListInsert(&Lb,1,j);unionL(&L,Lb);printf("依次输出合并了Lb的L的元素:");ListTraverse(L); return 0;
}

线性表的链式存储结构

定义

在这里插入图片描述

我们把链表中第一个结点的存储位置叫做头指针。
线性链表的最后一个结点指针为“空”(通常用NULL或“^”符号表示

在这里插入图片描述
有时,我们为了更加方便地对链表进行操作,会在单链表的第一个结点前附设一个结点,称为头结点。头结点的数据域可以不存储任何信息,也可以存储如线性表的长度等附加信息,头结点的指针域存储指向第—个结点的指针。
在这里插入图片描述

头结点与头指针的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

typedef struct Node
{ElemType data;struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定义LinkList */

在这里插入图片描述

#include "stdio.h"    
#include "string.h"
#include "ctype.h"      
#include "stdlib.h"   #include "math.h"  
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 20 /* 存储空间初始分配量 */typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */Status visit(ElemType c)
{printf("%d ",c);return OK;
}typedef struct Node
{ElemType data;struct Node *next;
}Node;
typedef struct Node *LinkList; /* 定义LinkList *//* 初始化链式线性表 */
Status InitList(LinkList *L) 
{ *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */if(!(*L)) /* 存储分配失败 */return ERROR;(*L)->next=NULL; /* 指针域为空 */return OK;
}/* 初始条件:链式线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(LinkList L)
{ if(L->next)return FALSE;elsereturn TRUE;
}/* 初始条件:链式线性表L已存在。操作结果:将L重置为空表 */
Status ClearList(LinkList *L)
{ LinkList p,q;p=(*L)->next;           /*  p指向第一个结点 */while(p)                /*  没到表尾 */{q=p->next;free(p);p=q;}(*L)->next=NULL;        /* 头结点指针域为空 */return OK;
}/* 初始条件:链式线性表L已存在。操作结果:返回L中数据元素个数 */
int ListLength(LinkList L)
{int i=0;LinkList p=L->next; /* p指向第一个结点 */while(p)                        {i++;p=p->next;}return i;
}/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{int j;LinkList p;		/* 声明一结点p */p = L->next;		/* 让p指向链表L的第一个结点 */j = 1;		/*  j为计数器 */while (p && j<i)  /* p不为空或者计数器j还没有等于i时,循环继续 */{   p = p->next;  /* 让p指向下一个结点 */++j;}if ( !p || j>i ) return ERROR;  /*  第i个元素不存在 */*e = p->data;   /*  取第i个元素的数据 */return OK;
}/* 初始条件:链式线性表L已存在 */
/* 操作结果:返回L中第1个与e满足关系的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int LocateElem(LinkList L,ElemType e)
{int i=0;LinkList p=L->next;while(p){i++;if(p->data==e) /* 找到这样的数据元素 */return i;p=p->next;}return 0;
}/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 */
Status ListInsert(LinkList *L,int i,ElemType e)
{ int j;LinkList p,s;p = *L;   j = 1;while (p && j < i)     /* 寻找第i个结点 */{p = p->next;++j;} if (!p || j > i) return ERROR;   /* 第i个元素不存在 */s = (LinkList)malloc(sizeof(Node));  /*  生成新结点(C语言标准函数) */s->data = e;  s->next = p->next;      /* 将p的后继结点赋值给s的后继  */p->next = s;          /* 将s赋值给p的后继 */return OK;
}/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 */
Status ListDelete(LinkList *L,int i,ElemType *e) 
{ int j;LinkList p,q;p = *L;j = 1;while (p->next && j < i)	/* 遍历寻找第i个元素 */{p = p->next;++j;}if (!(p->next) || j > i) return ERROR;           /* 第i个元素不存在 */q = p->next;p->next = q->next;			/* 将q的后继赋值给p的后继 */*e = q->data;               /* 将q结点中的数据给e */free(q);                    /* 让系统回收此结点,释放内存 */return OK;
}/* 初始条件:链式线性表L已存在 */
/* 操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(LinkList L)
{LinkList p=L->next;while(p){visit(p->data);p=p->next;}printf("\n");return OK;
}/*  随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) */
void CreateListHead(LinkList *L, int n) 
{LinkList p;int i;srand(time(0));                         /* 初始化随机数种子 */*L = (LinkList)malloc(sizeof(Node));(*L)->next = NULL;                      /*  先建立一个带头结点的单链表 */for (i=0; i<n; i++) {p = (LinkList)malloc(sizeof(Node)); /*  生成新结点 */p->data = rand()%100+1;             /*  随机生成100以内的数字 */p->next = (*L)->next;    (*L)->next = p;						/*  插入到表头 */}
}/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */
void CreateListTail(LinkList *L, int n) 
{LinkList p,r;int i;srand(time(0));                      /* 初始化随机数种子 */*L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */r=*L;                                /* r为指向尾部的结点 */for (i=0; i<n; i++) {p = (Node *)malloc(sizeof(Node)); /*  生成新结点 */p->data = rand()%100+1;           /*  随机生成100以内的数字 */r->next=p;                        /* 将表尾终端结点的指针指向新结点 */r = p;                            /* 将当前的新结点定义为表尾终端结点 */}r->next = NULL;                       /* 表示当前链表结束 */
}int main()
{        LinkList L;ElemType e;Status i;int j,k;i=InitList(&L);printf("初始化L后:ListLength(L)=%d\n",ListLength(L));for(j=1;j<=5;j++)i=ListInsert(&L,1,j);printf("在L的表头依次插入1~5后:L.data=");ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L));i=ListEmpty(L);printf("L是否空:i=%d(1:是 0:否)\n",i);i=ClearList(&L);printf("清空L后:ListLength(L)=%d\n",ListLength(L));i=ListEmpty(L);printf("L是否空:i=%d(1:是 0:否)\n",i);for(j=1;j<=10;j++)ListInsert(&L,j,j);printf("在L的表尾依次插入1~10后:L.data=");ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L));ListInsert(&L,1,0);printf("在L的表头插入0后:L.data=");ListTraverse(L); printf("ListLength(L)=%d \n",ListLength(L));GetElem(L,5,&e);printf("第5个元素的值为:%d\n",e);for(j=3;j<=4;j++){k=LocateElem(L,j);if(k)printf("第%d个元素的值为%d\n",k,j);elseprintf("没有值为%d的元素\n",j);}k=ListLength(L); /* k为表长 */for(j=k+1;j>=k;j--){i=ListDelete(&L,j,&e); /* 删除第j个数据 */if(i==ERROR)printf("删除第%d个数据失败\n",j);elseprintf("删除第%d个的元素值为:%d\n",j,e);}printf("依次输出L的元素:");ListTraverse(L); j=5;ListDelete(&L,j,&e); /* 删除第5个数据 */printf("删除第%d个的元素值为:%d\n",j,e);printf("依次输出L的元素:");ListTraverse(L); i=ClearList(&L);printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));CreateListHead(&L,20);printf("整体创建L的元素(头插法):");ListTraverse(L); i=ClearList(&L);printf("\n删除L后:ListLength(L)=%d\n",ListLength(L));CreateListTail(&L,20);printf("整体创建L的元素(尾插法):");ListTraverse(L); return 0;
}

注:
1)若线性表需要频繁查找,很少进行插入和删除操作时宣采用顺序存储结构。
2)当线性表中的元素个数变化较大或者根本不知道有多大时,最好用单链表结构。

静态链表

我们让数组的元素都是由两个数据域组成,data和cur。也就是说,数组的每个下标都对应一个data和一个cur。数据域data用来存放数据元素,也就是通常我们要处理的数据;而cur相当于单链表中的next指针,存放该元素的后继在数组中的下标,我们把cur叫做游标。

我们把这种用数组描述的链表叫做静态链表

另外我们对数组第一个和最后—个元素作为特殊元素处理,不存数据。我们通常把未被使用的数组元素称为备用链表。而数组第一个元素,即下标为0的元素的cur就存放备用链表的第一个结点的下标;而数组的最后—个元素的cur则存放第一个有数值的元素的下标,相当于单链表中的头结点作用,当整个链表为空时,则为0。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

GitHub上删除项目后,IDEA分享项目到GitHub提示Remote is already on GitHub

文章目录 一、错误信息二、解决方法1.删除GitHub上的项目2.找到项目里的.git隐藏文件3.找到config文件4.打开config文件&#xff0c;删除[remote "git-test"]及下面两行内容5.继续使用IDEA分享项目到GitHub即可 一、错误信息 二、解决方法 1.删除GitHub上的项目 2.…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

HCIP-Cloud Service V3.0 真题和机构资料

通过认证验证的能力 具备传统企业应用架构和云原生架构设计上云的能力 建议掌握的知识 对IT相关技术有基本的了解&#xff1b;具备一定的公有云服务基础知识&#xff1b;对云计算、网络、存储、数据库等知识有一定的了解&#xff0c;具备Linux操作系统的基础知识 机构的考试大…

【机器学习】Cost Function for Logistic Regression

Cost Function for Logistic Regression 1. 平方差能否用于逻辑回归&#xff1f;2. 逻辑损失函数loss3. 损失函数cost附录 导入所需的库 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from plt_logistic_loss import plt_logistic_cost, plt_two_…

GD32F103VE睡眠与唤醒

GD32F103VE睡眠与唤醒&#xff0c;兆易官网给的程序没有测试。等测试后&#xff0c;才发现有问题。 现修改&#xff0c;测试如下&#xff1a; #include "SleepMode.h" #include "delay.h"u8 WFE_CMD_EnterSleepModeFlag;void Enter_DeepSleepMode(void);…

github国内镜像站点。解决assets转圈加载不出来的问题

github镜像站 https://hub.nuaa.cf/ https://gitclone.com/ 下载加速 https://gh.api.99988866.xyz/ https://ghproxy.com/ https://github.ur1.fun/ assets转圈加载不出来 f12打开开发者工具&#xff0c;根据前面的loadinglaze&#xff0c;找到这个网址 可以直接看到assets…

【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【计算机网络】数据链路层

文章目录 1. 数据链路层1.1 数据链路层简介1.2 数据链路层做了什么 2. 以太网协议2.1 以太网2.2 以太网帧的格式2.3 MAC地址2.4 MTU 3. 数据跨网络传输的整体过程4. ARP协议4.1 认识ARP协议4.2 ARP协议的格式4.3 ARP协议的工作流程 1. 数据链路层 1.1 数据链路层简介 数据链路…

MySql之索引

MySql之索引 1.索引概述 MySql官方对索引的定义为&#xff1a;索引是帮助MySql高效获取数据的数据结构。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找…

初识网络(JavaEE初阶系列9)

目录 前言&#xff1a; 1.网络的发展史 1.1独立模式 1.2网络互联 1.3局域网LAN 1.4广域网WAN 2.网络通信基础 2.1IP地址 2.2端口号 3.认识协议 3.1协议分层 3.2分层的作用 3.3TCP/IP五层&#xff08;或四层&#xff09;模型 3.4OSI七层模型 3.5网络设备所在分层 …

【JAVASE】继承

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 继承 1. 为什么要继承2. 继承概念3. 继承…

Linux笔记1(系统状态等)

man命令&#xff1a; man name: man section name: man -k regexp: 在 Linux 中&#xff0c;man 命令用于查看命令、函数或配置文件等的手册页&#xff0c;提供了详细的帮助文档。man 是 "manual" 的缩写。man 命令的用法如下&#xff1a; man [选项] [命令名]例如&…

单元测试之- mock工具mockito

常用的mock工具mockito 在编写单元测试时&#xff0c;需要mock依赖的对象&#xff0c;减少依赖对象对测试的影响&#xff0c;Mocktio是常用的mock工具之一&#xff0c;那么mockito提供了哪些功能呢&#xff1f; Mock对象的创建和配置&#xff1a;Mockito可以通过简单的语法创建…

DBeaver:Excel表格数据导入mysql数据库表内

1、准备Excel数据&#xff0c;并另存为 csv文件&#xff0c;编码格式为utf-8 2、打开DBeaver&#xff0c;选中要添加的表&#xff0c;右键-导入数据 这个时候表已经提前创建好了&#xff0c;字段也是一一对应 3、导入数据 第二步选中要导入的csv数据 第三步看一下表的映射关系是…

4G WWAN设备类型

WWAN设备类型 USB dongle是设备接入互联网的重要方式之一&#xff0c;典型的通过USB接口与主设备连接&#xff0c;然后主设备通过4G/5G接入互联网&#xff0c;作为移动宽带设备&#xff0c;它有那些设备类型及暴露方式呢&#xff1f; 移动宽带设备类型&#xff1a;ModemManage…

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

集成学习:机器学习模型如何“博采众长”

前置概念 偏差 指模型的预测值与真实值之间的差异&#xff0c;它反映了模型的拟合能力。 方差 指模型在不同的训练集上产生的预测结果的差异&#xff0c;它反映了模型的稳定性。 方差和偏差对预测结果所造成的影响 在机器学习中&#xff0c;我们通常希望模型的偏差和方差都…

C高级第三讲

1、思维导图 2、输入一个文件名&#xff0c;判断是否为shell脚本文件&#xff0c;如果是脚本文件&#xff0c;判断是否有可执行权限&#xff0c;如果有可执行权限&#xff0c;运行文件&#xff0c;如果没有可执行权限&#xff0c;给文件添加可执行权限。 #!/bin/bash read -p …

【性能测试】性能数据采集工具nmon安装使用及报告参数含义详解

目录 nmon nmon下载 解压安装 启动 数据采集配置 生成图形结果 nmon报告中的参数含义 资料获取方法 nmon nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c;它能在系统运行过程中实时地捕捉系统资源的使用情况&#xff0c;并且能输出结果到文…

c语言——求n之内的素数和

//求n之内的素数和 //列如&#xff1a;2、3、5等 #include<stdio.h> #include<math.h> int main() {int i,j,k,n0;scanf("%d",&n);for(i2;i<n;i){k(int)sqrt(i);for(j2;j<k;j)if(i%j0)break;if(j>k){printf("%d,",i);n;if(n%50)p…