数据结构 链表

单链表:单链表用来写邻接表,邻接表用来存储图和树

双链表:用来优化某些问题

单链表

链式存储

#include<stdio.h>

#include<stdlib.h>

int cont = 0;

//结构体

typedef struct List {

int data; //数据域

struct List* next; //指针域,指向当前结点的下一个结点,next指针的作用:1.直接访问下一个结点2.进行链表的遍历

}List,*Listptr; //类型名

//创建链表

_Bool CreateList(Listptr *head) { //若改变一级指针的值【一级指针所存储的地址】,只能找到二级指针进行修改,Listptr本身就是一级指针,Listptr*是二级指针【传参过程,如果想要改变参数本身,只能使用指针/引用进行】

*head = (Listptr)malloc(sizeof(List));//为第一个结点【头节点,什么都不放】申请空间 “=”改变指针的指向 malloc()请的空间是void*类型

//C语言指针赋值的规则:基类型相容,修饰符种类与个数:左边>右边

if(*head){

(*head)->data = 0;

(*head)->next = NULL;//指向为空,避免野指针的出现

return 1;

}

else

return 0;

}

//头插法

void Insert(Listptr head) {

Listptr temp;//要插入的结点

CreateList(&temp);//对新的结点进行申请空间和初始化结点

scanf("%d", &temp->data);

temp->next = head->next;//改变next指针的指向,先进行这一步,防止数据丢失

head->next = temp;

}

//尾插法,引入一个Listptr end(尾结点),指向最后一个结点

//尾插法 未引入尾结点

void Bottom_Insert(Listptr head) {

Listptr temp;

CreateList(&temp);

scanf("%d", &temp->data);

while (head->next) {

head = head->next;

}

head->next = temp;

}

//特定位置插

void Particular_Insert(Listptr head, int index) {

Listptr temp;

CreateList(&temp);

scanf("%d", &temp->data);

int i = 0; //此时位置从0开始算起

//int i = 1; 此时位置从1开始算起

while (i < index && head) {

i++;

head = head->next;

}

if (i == index && head) { //找到特定位置,并且该位置不是尾结点

temp->next = head->next;

head->next = temp;

}

else if (i == index && !head) { //找到特定位置,但是该位置是尾结点

head->next = temp;

}

else { //未找到特定位置

printf("插入失败\n");

}

}

//查——遍历查找

Listptr Search(Listptr head,int check) {

Listptr i = head;//i指针指向头结点,头结点不存放数据,故不用判断

while (i->next) {//i->next!=NULL;的时候进行循环

i = i->next;

cont++;

if (i->data == check) {

return i;

}

}

return NULL;

}

//按个数查找,只查找一个

Listptr SearchIndex(Listptr head, int index) {

int i = 0;

while (i < index && head != NULL) { //当查到找到或者查到末尾时停止

i++;

head = head->next;

}

if (head && i==index) //找到

return head;

else

return NULL;

}

//输出——遍历输出

void Print(Listptr head) {

Listptr i = head;//i本身就是一个指针

while (i->next) {//i->next!=NULL;的时候进行循环

i = i->next;

printf("%d ", i->data);

}

printf("\n");

}

//删1——删除特定的结点——按结点个数来查找

//需要遍历查到特定结点

_Bool DeleteNode(Listptr head,int index,int *e){

int i = 0;

Listptr front = head;

i = 1;

head = head->next;

while (i < index && head!= NULL) {

front = head;

head = head->next;

i++;

}

if (i == index && head != NULL) {//head就是查找的结点,front就是查找的前一个值

Listptr t = head;

front->next = head->next;

*e = t->data;

free(t);

return 1;

}

return 0;

}

//删2——删除特定结点——按结点个数查找

//使用查找函数查找

_Bool DeleteNode_SearchIndex(Listptr head, int index, int* e) {

Listptr front = SearchIndex(head, index - 1);

head = SearchIndex(head, index);

if (head && front) {

Listptr t = head;

front->next = head->next;

*e = t->data;

free(t);

return 1;

}

return 0;

}

//改

_Bool Alert(Listptr head, int index, int data) {

head = SearchIndex(head, index);

if (head) {

head->data = data;

return 1;

}

else

return 0;

}

int main() {

Listptr head; //第一个结点的指针

CreateList(&head);//对链表进行初始化

for (int i = 0;i < 10;i++) {

Insert(head);//插入

}

Print(head);//输出

for (int i = 0;i < 5;i++) {

int index = 0;

scanf("%d", &index);

printf("%d\n", SearchIndex(head, index)->data);

scanf("%d", &index);

int data;//删除

if (DeleteNode(head, index, &data)) {

printf("删除成功,删除值为%d\n", data);

}

else

printf("删除失败\n");

Print(head);

scanf("%d%d", &index, &data);

if (Alert(head, index, data)) {//更改

printf("更改成功\n");

}

else

printf("更改失败\n");

Print(head);

}

for (int i = 0;i < 10;i++) {

int check = 0;

scanf("%d", &check);

if (!Search(head, check)) {//查找

printf("没查到\n");

}

else

printf("第%d个结点\n",cont);

}

return 0;

}

自己码代码

#include<stdio.h>

#include<stdlib.h>

typedef struct List {

int data;

struct List* next;

}List,*Listptr;

int cont=0;

//初始化

_Bool CreateList(Listptr* head) {

*head = (Listptr)malloc(sizeof(List));

if (*head) {

(*head)->data = 0;

(*head)->next = NULL;

return 1;

}

else

return 0;

}

//头插法

void Insert(Listptr head) {

Listptr temp;

CreateList(&temp);

scanf("%d", &temp->data);

temp->next = head->next;

head->next = temp;

}

//尾插法

void Bottom_Insert(Listptr head) {

Listptr temp;

CreateList(&temp);

scanf("%d", &temp->data);

while (head->next) {

head = head->next;

}

head->next = temp;

}

//特定位置插

void Particular_Insert(Listptr head, int index) {

Listptr temp;

CreateList(&temp);

scanf("%d", &temp->data);

int i = 0;

while (i < index && head) {

i++;

head = head->next;

}

if (i == index && head) {

temp->next = head->next;

head->next = temp;

}

else if (i == index && !head) {

head->next = temp;

}

else {

printf("插入失败\n");

}

}

//查1——按值查找

Listptr Search(Listptr head, int check) {

Listptr i;

i = head;

while (i->next) {

i = i->next;

cont++;

if (i->data == check) {

return i;

}

}

return NULL;

}

//查2——按结点位置查找

Listptr SearchIndex(Listptr head, int index) {

int i = 0;

while (i < index && head) {

i++;

head = head->next;

}

if (head && i == index) {

return head;

}

else

return NULL;

}

//输出

void Print(Listptr head) {

Listptr i = head;

while (i->next) {

i = i->next;

printf("%d ", i->data);

}

printf("\n");

}

//删——删除特定节点

_Bool DeleteNode(Listptr head, int index, int* e) {

Listptr front = SearchIndex(head, index - 1);

head = SearchIndex(head, index);

if (head && front) {

Listptr t = head;

front->next = head->next;

*e = t->data;

free(t);

return 1;

}

return 0;

}

//改

_Bool Alert(Listptr head, int index, int data) {

head = SearchIndex(head, index);

if (head) {

head->data = data;

return 1;

}

else

return 0;

}

int main() {

Listptr head;

CreateList(&head);

for (int i = 0;i < 5;i++) {

Insert(head);//头插法

}

Print(head);

Bottom_Insert(head);//尾插法

Print(head);

int index1;

scanf("%d", &index1);

Particular_Insert(head, index1);//特定位置插入

Print(head);

int check;

scanf("%d", &check);

Search(head, check);//按值查找

printf("值为%d的是第%d个结点\n", check, cont);

int index2;

scanf("%d", &index2);

printf("第%d个结点的值为%d\n", index2, SearchIndex(head, index2)->data);//按位置查找

int index3;

scanf("%d", &index3);

int data1;

if (DeleteNode(head, index3, &data1)) {//删

printf("删除成功,删除值为%d\n", data1);

}

else

printf("删除失败\n");

Print(head);

int index4, data2;

scanf("%d%d", &index4, &data2);

if (Alert(head, index4, data2)) {//改

printf("更改成功\n");

}

else

printf("更改失败\n");

Print(head);

return 0;

}

顺序存储

用数组模拟链表,静态链表,比动态链表快(因为 new 生成新结点慢)

//链表的顺序存储,用数组来模拟链表

#include<stdio.h>

#define N 100

typedef struct List {//typedef作用:将后面的定义变量的语句变成给类型重命名的语句

int data;

int next;//索引,下标可以替代next指针,以此来访问下一个结点

}List, * Listptr;

List heap[100] = { 0 };//数组代表堆这个空间

//确定数组未使用空间为空 1.逐个遍历——麻烦 2.将空余空间构成链表【整体过程存在两个链表,一个是有数据即将使用的链表,一个是空余未使用空间串联构成的备用链表(当需要空间的时候,自取)】

//初始化

int head, leisure;//分别代表两个链表的头指针,head是using链表的头指针,用来指向第一个结点,leisure是空余链表的头指针

void InitHeap() {

int i;

head = 0;

//heap[0].next = 1;//用来存储空余链表的第一个结点的下标

heap[N - 1].next = 0;//0代表为空,意思是什么都不指向,指向为NULL,next只要为0,就相当于什么都不指向,指向为空

for (i = 0;i < N - 1;i++) {

heap[i].next = i + 1;

}

}

//模仿malloc

int Malloc() {//空间申请,申请一个结点的空间,一个结点==数组中的一个元素

int temp;

if (heap[0].next) {//heap[0].next==0 整个堆中没有空余空间,反之有空余空间

temp = heap[0].next;//临时变量存储要删除的结点

heap[0].next = heap[heap[0].next].next;//利用第一个结点指向第三个结点,第一个结点存储的第二个结点的下标,第二个结点存储的第三个结点的下标

return temp;//返回刚申请空间的索引

}

else {

return 0;//无法申请空间

}

}

//模仿free

void Free(int index) {//动态链表中释放空间,静态链表中将正在使用链表中的结点放在空余链表中

//因为这个空间本来就有,所以就不用再申请了

heap[index].next = heap[0].next;

heap[0].next = index;

}

//增——头插法

_Bool InsertHead() {

int temp = Malloc();

if (temp) {

heap[temp].next = head;

head = temp;

return 1;

}

else

return 0;

}

//按data值查找

int Search(int check) {

int temp = head;//将第一个结点的索引赋给temp,所以heap[temp]指的是第一个结点

while (temp) {

if (heap[temp].data == check) {

return temp;

}

else {

temp = heap[temp].next;

}

}

}

//按索引查找

int SearchByIndex(int Index) {

int i = head, cont = 0;

while (i < Index && i != 0) {

cont++;

if (cont == Index) {

return i;

}

else {

i = heap[i].next;

}

}

return 0;

}

//改

_Bool Alert(int index, int data) {

int temp = Search(index);

if (temp) {

heap[temp].data = data;

return 1;

}

else

return 0;

}

//删

_Bool Delete(int index) {

int front = SearchByIndex(index - 1), aim = SearchByIndex(index);

if (aim && front) {//从第二个结点开始删除

int temp = aim;//存储要删除的结点

heap[front].next = heap[aim].next;//将目标前一个结点指向目标后一个结点

Free(temp);

}

else if (aim) {//从第一个结点开始删除

int temp = aim;

front = heap[aim].next;//如果使用 heap[front].next = heap[aim].next;将会丢失空余链表剩下的部分,因为你直接将空余链表的头结点指向第二个结点,使得空余链表的后面的空结点丢失

Free(temp);

}

}

int main() {

return 0;

}

Acwing 课程

代码

//使用两个数组模拟链表

#include<iostream>

using namespace std;

const int N = 100010;

//head表示头结点的下标,头结点最开始指向一个空结点(用-1表示),每次插入一个新的元素

//e[i]表示结点i的值,ne[i]表示结点i的next指针是多少

//idx存储当前已经用到哪个点

int head, e[N], ne[N], idx;

//初始化

void init() {

head = -1;//表示空集

idx = 0;

}

//头插法 分两步进行

void add_to_head(int x) {

e[idx] = x;//存储数值

ne[idx] = head;//第一步

head = idx;//第二步

idx++;

}

//指定位置插

//将x插到下标是k这个点后面

//分两步进行

void add(int k, int x) {

e[idx] = x;

ne[idx] = ne[k];

ne[k] = idx;

idx++;

}

//删除特定位置的点

//删去下标为k的后面的一个点

void remove(int k) {

ne[k] = ne[ne[k]];

}

int main() {

return 0;

}

题目

实现一个单链表,链表初始为空,支持三种操作:

(1) 向链表头插入一个数;

(2) 删除第k个插入的数后面的数;

(3) 在第k个插入的数后插入一个数

现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。

输入格式

第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令可能为以下几种:

(1) “H x”,表示向链表头插入一个数x。//头插法

(2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。//第k个输入,下标为k-1,即删除下标为k-1后面的数

(3) “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。//即在下标为k-1后插入一个数

输出格式

共一行,将整个链表从头到尾输出。

数据范围

1 ≤ M ≤ 100000 1≤M≤1000001≤M≤100000

所有操作保证合法。

输入样例

10

H 9

I 1 1

D 1

D 0

H 6

I 3 6

I 4 5

I 4 5

I 3 4

D 6

输出样例

6 4 6 5

注意点

1.插入、删除操作都是对第k个数后面的数进行操作的,因为指针域存储的是下一个节点。

2.删除时,首先要考虑是否删除的是头节点。

3.输出时从头结点开始,末尾是空,指向−1。

4.scanf在读入字符时不会跳过空格,还是用cin。

//使用两个数组模拟链表

#include<iostream>

using namespace std;

const int N = 100010;

//head表示头结点的下标

//e[i]表示结点i的值,ne[i]表示结点i的next指针是多少

//idx存储当前已经用到哪个点

int head, e[N], ne[N], idx;

//初始化

void init() {

head = -1;//表示空集

idx = 0;

}

//头插法 分两步进行

void add_to_head(int x) {

e[idx] = x;//存储数值

ne[idx] = head;//第一步

head = idx;//第二步

idx++;

}

//指定位置插

//将x插到下标是k这个点后面

//分两步进行

void add(int k, int x) {

e[idx] = x;

ne[idx] = ne[k];

ne[k] = idx;

idx++;

}

//删除特定位置的点

//删去下标为k的后面的一个点

void remove(int k) {

ne[k] = ne[ne[k]];

}

int main() {

int M;

cin >> M;

init();

while (M--) {

int k, x;

char op;

cin >> op;

if (op == 'H') {

cin >> x;

add_to_head(x);

}

else if (op == 'D') {

cin >> k;

if (!k)

head = ne[head];//删除头结点,使head指向它现在指向的点的下一个点,head指向的点就是head本身

remove(k - 1);//因为第一个插入的点下标是0,以此类推

}

else {

cin >> k >> x;

add(k - 1, x);

}

}

for (int i = head;i != -1;i = ne[i])

cout << e[i] << ' ';

return 0;

}

邻接表

实际上就是开了 n 个单链表。

双链表

一个结点有两个指针,分别指向它的左边和右边,l[N],r[N],不专门定义头结点head和尾结点tail,下标为0的点是最左边的点,下标为1的点是最右边的点。

代码

#include<iostream>

using namespace std;

const int N = 100010;

int e[N], l[N], r[N], idx;

//初始化

void init() {

//0表示左端点,1表示右端点,最开始的时候,0号点的右边是1号点,1号点的左边是0号点

r[0] = 1, l[1] = 0;

idx = 2;

}

//增——两种选择,插入到某点的右边或插入到某点的左边

//在下标为k的点的右边插入一个数

void add(int k, int x) {

e[idx] = x;

r[idx] = r[k];

l[idx] = k;

l[r[k]] = idx;

r[k] = idx;

idx++;

}

//在下标为k的点的左边插入一个数

//可以重新写,也可以直接调用,即在l[k]的右边插入一个数 add(l[k],x)

//删

//删除下标为k的点

void remove(int k) {

r[l[k]] = r[k];

l[r[k]] = l[k];

}

int main() {

return 0;

}



 

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

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

相关文章

(免费领源码)基于Vue+Node.js的宠物领养网站的设计与开发83352-计算机毕业设计项目选题推荐

摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发达&#xff0c;宠物领养网站的…

2023.11.15 hive sql之函数标准,字符串,日期,数学函数

目录 一.函数分类标准 二.查看官方函数,与简单演示 三.3种类型函数演示 四.字符串函数 1.常见字符串函数 2.索引函数 解析函数 五.日期函数 1.获取当前时间 2.获取日期相关 3.周,季度等计算 4.时间戳 六.数学函数 一.函数分类标准 目前hive三大标准 UDF:&#xff08…

餐厅订座预约小程序的效果如何

市场中无论哪种城市&#xff0c;餐厅非常多&#xff0c;一条不长的商业街&#xff0c;汇聚着数家餐饮品牌&#xff0c;且相互间竞争激烈&#xff0c;并且各个商家都希望用成本低高效率的方法引流及转化。 随着互联网深入各个行业&#xff0c;传统餐饮行业经营痛点不少。 传统餐…

MAC地址注册的网络安全影响和措施分析

MAC地址注册对网络安全具有重要影响&#xff0c;同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析&#xff1a; 影响&#xff1a; 1. 身份验证&#xff1a;MAC地址注册可用于设备的身份验证&#xff0c;但MAC地址本身并不…

VUE基础的一些实战总结

目录 创建一个 Vue 应用 步骤 1&#xff1a;安装 Node.js 和 npm 步骤 2&#xff1a;安装 Vue CLI 步骤 3&#xff1a;创建 Vue 项目 步骤 4&#xff1a;启动开发服务器 步骤 5&#xff1a;访问应用程序 步骤 6&#xff1a;编辑 Vue 应用 步骤 7&#xff1a;构建和部署…

互联网+智慧河道大数据一体化管理平台解决方案:PPT43页,附下载

关键词&#xff1a;售前方案工程师&#xff0c;解决方案工程师&#xff0c;技术转售前&#xff0c;技术转售前的优势&#xff0c;软件工程师转售前 一、智慧水务大数据一体化建设背景 1、当前我国供水管网迅速扩张&#xff0c;管理压力加大&#xff0c;供水管网漏损率比较高&…

[Jenkins] Docker 安装Jenkins及迁移流程

系统要求 最低推荐配置: 256MB可用内存1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB) 为小团队推荐的硬件配置: 1GB可用内存50 GB 可用磁盘空间 软件配置: Java 8—无论是Java运行时环境&#xff08;JRE&#xff09;还是Java开发工具包&#xff08;JDK&#xff…

如何将图片转为excel或word?(客户端)

演示软件&#xff1a;金鸣表格文字识别大师3.6.1&#xff08;新版本界面可能会略有不同&#xff09; 第一部分 将图片转为excel或文表混合的word 一般的软件要将图片转为可编辑的excel&#xff0c;都需要待识别的图片要有明显清晰的表格线&#xff0c;但我们程序现已克服了这…

051-第三代软件开发-日志容量时间限制

第三代软件开发-日志容量时间限制 文章目录 第三代软件开发-日志容量时间限制项目介绍日志容量时间限制 关键字&#xff1a; Qt、 Qml、 Time、 容量、 大小 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language…

【QT HTTP】使用QtNetwork模块制作基于HTTP请求的C/S架构

目录 0 引言1 HTTP基本知识1.1 请求类型1.2 HTTP请求报文格式1.3 HTTP响应报文格式1.4 拓展&#xff1a;GET vs POST 请求方法GET请求请求报文&#xff1a;响应报文 POST请求请求报文响应报文 其他注意事项示例&#xff1a;GET请求示例POST请求示例 2 实战2.1 QtNetwork模块介绍…

【PIE-Engine 数据资源】8天合成LAI产品(MOD15A2H.006)

文章目录 一、 简介二、描述三、波段四、属性五、示例代码参考资料 【PIE-Engine 数据资源】xxx 一、 简介 数据名称8天合成LAI产品(MOD15A2H.006)时间范围2000年-现在空间范围全球数据来源NASA代码片段var images pie.ImageCollection(“USGS/MOD15A2H/006”) 二、描述 全球…

云ES使用集群限流插件(aliyun-qos)

aliyun-qos插件是阿里云Elasticsearch团队自研的插件,能够提高集群的稳定性。该插件能够实现集群级别的读写限流,在关键时刻对指定索引降级,将流量控制在合适范围内。例如当上游业务无法进行流量控制时,尤其对于读请求业务,可根据aliyun-qos插件设置的规则,按照业务的优先…

深度学习入门(第四天)——递归神经网络与词向量原理解读

一、RNN网络架构解读 常规神经网络并不能考虑时间序列的特征&#xff08;比如前天昨天今天或者带有前后关联的特征&#xff09;&#xff0c;现在每个特征都是独立考虑的&#xff0c;那么如果有这样的特征&#xff0c;网络应该怎么学呢 而递归递归网络hidden这里的转回箭头&…

【电路笔记】-快速了解无源器件

快速了解无源器件 文章目录 快速了解无源器件1、概述2、电阻器作为无源器件3、电感器作为无源器件4、电容器作为无源器件5、总结 无源器件是电子电路的主要构建模块&#xff0c;没有它们&#xff0c;这些电路要么根本无法工作&#xff0c;要么变得不稳定。 1、概述 那么什么是…

MAC地址_MAC地址格式_以太网的MAC帧_基础知识

MAC地址 全世界的每块网卡在出厂前都有一个唯一的代码,称为介质访问控制(MAC)地址 一.网络适配器(网卡) 要将计算机连接到以太网&#xff0c;需要使用相应的网络适配器(Adapter)&#xff0c;网络适配器一般简称为“网卡”。在计算机内部&#xff0c;网卡与CPU之间的通信&…

kafka分布式安装部署

1.集群规划 2.集群部署 官方下载地址&#xff1a;http://kafka.apache.org/downloads.html &#xff08;1&#xff09;上传并解压安装包 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf kafka_2.12-3.3.1.tgz -C ../software/&#xff08;2&#xff09;修改解压后的文件…

2023年中国疗养院收入规模、疗养院数量及利润统计[图]

疗养院是运用疗养为主要手段&#xff0c;专门为疾病康复疗养和健康疗养而设立的医疗、预防和保健机构。疗养院通过提供物理治疗(如水疗、光疗)&#xff0c;并配合饮食、体操等疗法&#xff0c;利用自然疗养因子和人工疗养因子作用于人体&#xff0c;达到预防、保健、矫治和康复…

JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍

参考文章&#xff1a; https://www.cnblogs.com/zhukaile/p/14514238.html&#xff0c;https://blog.csdn.net/qq_36448800/article/details/126438339 一、什么是单元测试 在平时的开发当中&#xff0c;一个项目往往包含了大量的方法&#xff0c;可能有成千上万个。如何去保…

RabbitMQ-基础篇-黑马程序员

代码&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1nQBIgB_SbzoKu_XMWZ3JoA?pwdaeoe 提取码&#xff1a;aeoe 微服务一旦拆分&#xff0c;必然涉及到服务之间的相互调用&#xff0c;目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中&#xff0c;调…

【Java 进阶篇】JQuery 遍历:发现元素的魔法之旅

欢迎来到 JQuery 的奇妙世界&#xff0c;一个充满活力和灵感的地方。在这个世界里&#xff0c;我们将一起探讨 JQuery 的遍历功能&#xff0c;这是一个让你轻松发现和操作网页元素的神奇工具。无需太多前端经验&#xff0c;只要有一颗探险的心&#xff0c;你就能在 JQuery 遍历…