数据结构——实验一·线性表

海~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种变成资源,那么你就来对地方啦🌟
Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐🔥
当然,如果你也好的资源推荐,欢迎在评论区分享,让我们共同打造一个丰富的编程资源库!🔥
本文专栏 ➡️ 数据结构

实验目的:

  • 掌握线性表的顺序/链接存储结构
  • 验证顺序表/链表及其基本操作的实现
  • 掌握数据结构及算法的程序实现的基本方法

实验内容:

请选择使用顺序表或链表(单链表或双链表)实现以下操作,要求设计菜单,并根据菜单提示进行操作:

  1. 插入一个新元素到第i个位置
  2. 删除第i个位置的元素
  3. 显示线性表中所有元素的值
  4. 检索表中第i个元素
  5. 求表的长度

顺序表操作

实验产出:

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()仍然能够正确地读取数字。

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

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

相关文章

vector的使用,以及部分功能的模拟实现(C++)

1.vector的介绍及使用 1.1 vector的介绍 vector是STL容器中的一种常用的容器&#xff0c;和数组类似&#xff0c;由于其大小(size)可变&#xff0c;常用于数组大小不可知的情况下来替代数组。 vector也是一种顺序容器&#xff0c;在内存中连续排列&#xff0c;因此可以通过下标…

【Postgres_Python】使用python脚本批量创建和导入多个PG数据库

之前批量创建和导入数据库分为2个python脚本进行&#xff0c;现整合优化代码合并为一个python脚本&#xff0c;可同步实现数据库的创建和数据导入。之前的文章链接&#xff1a; 【Postgres_Python】使用python脚本批量创建PG数据库 【Postgres_Python】使用python脚本将多个.S…

U-Net - U型网络:用于图像分割的卷积神经网络

U-Net是一种专为图像分割任务设计的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;最初由Olaf Ronneberger等人于2015年提出。它被广泛应用于医学影像分析、遥感图像分割、自动驾驶和其他许多需要对图像进行像素级分类的任务中。U-Net具有强大的特征提取和恢复能力&…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

联想电脑怎么用u盘装系统_联想电脑用u盘装win10系统教程

联想电脑怎么重装系统&#xff1f;在当今科技发展迅猛的时代&#xff0c;联想电脑已经成为了人们生活中不可或缺的一部分。然而&#xff0c;随着时间的推移&#xff0c;我们可能会遇到一些问题&#xff0c;例如系统崩溃或者需要更换操作系统。这时&#xff0c;使用U盘来重新安装…

基于ESP32-IDF驱动GPIO输出控制LED

基于ESP32-IDF驱动GPIO输出控制LED 文章目录 基于ESP32-IDF驱动GPIO输出控制LED一、点亮LED3.1 LED电路3.2 配置GPIO函数gpio_config()原型和头文件3.3 设置GPIO引脚电平状态函数gpio_set_level()原型和头文件3.4 代码实现并编译烧录 一、点亮LED 3.1 LED电路 可以看到&#x…

电路研究9.1.1——合宙 Air780EP 模组外围线路

本来要继续研究AT指令来着&#xff0c;结果发现后面还有之前用到的电路设计资料&#xff0c;所以就贴过来了。 5.3.2 工作模式&#xff1a; 注意&#xff1a;  当模块进入休眠模式或深度休眠模式后&#xff0c; VDD_EXT 电源会掉电&#xff0c;相应电压域的 GPIO 以及串口…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…

JavaScript笔记APIs篇01——DOM获取与属性操作

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p78https://www.bilibili.com/video/BV1Y84y1L7Nn?…

【2024年 CSDN博客之星】我的2024年创作之旅:从C语言到人工智能,个人成长与突破的全景回顾

我的2024年创作之旅&#xff1a;从C语言到人工智能&#xff0c;个人成长与突破的全景回顾 引言 回望2024年&#xff0c;我不仅收获了技术上的成长&#xff0c;更收获了来自CSDN平台上无数粉丝、朋友以及网友们的支持与鼓励。在这条创作之路上&#xff0c;CSDN不仅是我展示技术成…

回归人文主义,探寻情感本质:从文艺复兴到AI时代,我的情感探索之旅

回归人文主义&#xff0c;探寻情感本质&#xff1a;从文艺复兴到AI时代&#xff0c;我们的情感探索之旅 多年来&#xff0c;我们的团队一直关注人工智能&#xff0c;尤其是AI在音乐领域的应用研究。随着技术的不断演进&#xff0c;我们也不断反思&#xff1a;在“算法、代码、…

【java】签名验签防篡改研究测试

上一篇文章写了接口安全通过一次性校验码和 时间戳可以防接口重放攻击、本篇将通过 signatrue签名模式进行研究性&#xff0c;知其所以然 说明本次实验是验证签名合法性该前端使用不安全加密&#xff0c;存在安全风险密钥在jsp中暴露 1、实现原理 2、前端 将 username 和 p…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

Java实现简易银行账户管理系统

目录 1、项目概述 1.1 项目结构 1.2 技术栈 2、核心功能说明 2.1 账户管理 2.2 异常处理体系 3、设计理念解析 3.1 面向对象设计 3.2 关键设计点 4、使用指南 4.1 运行流程 4.2 注意事项 5、扩展建议 5.1增加功能 5.2优化方向 6、主要的功能模块代码说明 6.1exception 6.2main …

【2024年华为OD机试】(B卷,100分)- 数据分类 (Java JS PythonC/C++)

一、问题描述 题目描述 对一个数据a进行分类,分类方法为: 此数据a(四个字节大小)的四个字节相加对一个给定的值b取模,如果得到的结果小于一个给定的值c,则数据a为有效类型,其类型为取模的值;如果得到的结果大于或者等于c,则数据a为无效类型。 比如一个数据a=0x010…

使用飞桨AI Studio平台训练数据,并进行图像识别分析得牡丹花测试

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

Next.js:构建大模型智能体GPT研究者应用的 Web开发框架

Next.js&#xff1a;构建大模型智能体GPT研究者应用的 Web开发框架 Next.js 基础知识 Next.js 是由 Vercel 公司开发维护的框架&#xff0c;极大地简化了 React 应用的开发流程。其核心特性包括&#xff1a; 服务器端渲染&#xff08;SSR&#xff09;与静态站点生成&#xff…

Redis vs. 其他数据库:深度解析,如何选择最适合的数据库?

一、如何为项目选择合适的数据库&#xff1f; 选择合适的数据库是一个复杂的过程&#xff0c;需要综合考虑多个因素。下面几个维度来详细阐述&#xff1a; 1.数据模型 关系型数据库&#xff08;RDBMS&#xff09;&#xff1a;适用于高度结构化、关联性强的数据&#xff0c;如电…

Linux内存管理(Linux内存架构,malloc,slab的实现)

文章目录 前言一、Linux进程空间内存分配二、malloc的实现机理三、物理内存与虚拟内存1.物理内存2.虚拟内存 四、磁盘和物理内存区别五、页页的基本概念&#xff1a;分页管理的核心概念&#xff1a;Linux 中分页的实现&#xff1a;总结&#xff1a; 六、伙伴算法伙伴算法的核心…