深⼊理解指针(5)

news2024/12/23 10:51:50

目录

  • 1. 回调函数是什么?
    • 1.1 使用回调函数修改
  • 2. qsort使⽤举例
    • 2.1 使⽤qsort函数排序整型数
    • 2.2 使⽤qsort排序结构数据按年龄排序
    • 2.3 使⽤qsort排序结构数据按名字排序
    • 2.4整体代码
  • 3. qsort函数的模拟实现
    • 3.1 整型数组的实现
    • 3.2 结构体按名字排序实现
    • 3.3 结构体按年龄排序实现
    • 3.4 整体代码

1. 回调函数是什么?

回调函数就是⼀个通过函数指针调⽤的函数。
如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现方直接调用,⽽是在特定的事件或条件发生时由另外的⼀⽅调用的,用于对该事件或条件进行响应
深入理解指针(4)中我们写的计算器的⼀般实现代码中是重复出现的,其中虽然执⾏计算的逻辑是区别的,但是输⼊输出操作是冗余的,有没有办法,简化⼀些呢?
只有调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。

#include <stdio.h>

//使用回调函数改造前
int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void eum()
{
	printf("*******************************\n");
	printf("***1. add   2. sub   **********\n");
	printf("***3. mul   4. div   **********\n");
	printf("***     0. exit     **********\n");
	printf("*******************************\n");
}

//简易的计算器实现
int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		eum();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("请输入两个操作数:>");
			scanf("%d %d", &x, &y);
			ret = Add(x, y);
			printf("%d\n", ret);
			break;
		case 2:
			printf("请输入两个操作数:>\n");
			scanf("%d %d", &x, &y);
			ret = Sub(x, y);
			printf("%d\n", ret);
			break;
		case 3:
			printf("请输入两个操作数:>\n");
			scanf("%d %d", &x, &y);
			ret = Mul(x, y);
			printf("%d\n", ret);
			break;
		case 4:
			printf("请输入两个操作数:>\n");
			scanf("%d %d", &x, &y);
			ret = Div(x, y);
			printf("%d\n", ret);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

1.1 使用回调函数修改

//使用回调函数改造后
int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void eum()
{
	printf("*******************************\n");
	printf("***1. add   2. sub   **********\n");
	printf("***3. mul   4. div   **********\n");
	printf("***     0. exit     **********\n");
	printf("*******************************\n");
}

void Clcs(int (*pf)(int, int))
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("输入两个操作数:>");
	scanf("%d %d", &x, &y);
	ret = (*pf)(x, y);
	printf("%d\n", ret);
}

int main()
{
	int input = 0;
	int x = 0;
	int y = 0;
	int ret = 0;
	do
	{
		eum();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			Clcs(Add);
			break;
		case 2:
			Clcs(Sub);
			break;
		case 3:
			Clcs(Mul);
			break;
		case 4:
			Clcs(Div);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

2. qsort使⽤举例

C/C++函数介绍: https://legacy.cplusplus.com/
使用说明
在这里插入图片描述
这里的头文件是#include <stdlib.h>

2.1 使⽤qsort函数排序整型数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_int(const void* p1, const void* p2)
{
	return (*(int*)p1) - (*(int*)p2);
}

void print1(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));
	}
}

//测试qsort排序整型结构体
void test1()
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//默认是升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print1(arr, sz);
}

int main()
{
	test1();//打印整型数组
	return 0;
}

运行结果:
在这里插入图片描述

2.2 使⽤qsort排序结构数据按年龄排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
	char name[20];
	int age;
};

int cmp_int(const void* p1, const void* p2)
{
	return (*(int*)p1) - (*(int*)p2);
}

cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

test2()
{
	struct Stu arr[] = { {"zhangsan",20},{"lisi",50},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
	print2(arr, sz);
}

//打印结构体age
print2(struct Stu* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", (p + i)->age);
	}
}

int main()
{
	test2();//打印结构体age
	return 0;
}

运行结果:
在这里插入图片描述

2.3 使⽤qsort排序结构数据按名字排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->name - ((struct Stu*)p2)->name;
}

void print3(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", ((struct Stu*)p + i)->name);
	}
}

test3()
{
	struct Stu arr[3] = { {"zhangsan",18},{"wangwu",30},{"lisi",20} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, 3, sizeof(arr[0]), cmp_stu_by_name);
	print3(arr, sz);
}

//qsort使用
int main()
{	
	test3();//打印结构体name
	return 0;
}

运行结果:
在这里插入图片描述

2.4整体代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_int(const void* a, const void* b)
{
	return *((int*)a) - *((int*)b);
}

void print1(int arr[], int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}

test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//默认是升序的
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print1(arr, sz);
}

struct Stu
{
	char name[20];
	int age;
};

int cmp_stu_by_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

void print2(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", ((struct Stu*)p + i)->age);
	}
}

test2()
{
	struct Stu arr[3] = {{"zhangsan",18},{"wangwu",30},{"lisi",20}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, 3, sizeof(arr[0]), cmp_stu_by_age);
	print2(arr, sz);
}

int cmp_stu_by_name(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->name - ((struct Stu*)p2)->name;
}

void print3(int* p, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", ((struct Stu*)p + i)->name);
	}
}

test3()
{
	struct Stu arr[3] = { {"zhangsan",18},{"wangwu",30},{"lisi",20} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, 3, sizeof(arr[0]), cmp_stu_by_name);
	print3(arr, sz);
}

//qsort使用
int main()
{	
	test1();//打印整型数组
	//test2();//打印结构体age
	//test3();//打印结构体name
	return 0;
}

3. qsort函数的模拟实现

使⽤回调函数,模拟实现qsort(采⽤冒泡的⽅式)。
注意:这⾥使⽤的是 void ∗ \ast 的指针

3.1 整型数组的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}

void Swap(char* buf1, char* buf2, int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void* base, int num, int size, int(*cmp)(const void*, const void*))
{
	//趟数
	for (int i = 0; i < num - 1; i++)
	{
		//一趟内部比较的对数
		for (int j = 0; j < num - 1 - i; j++)
		{
			//假设需要升序cmp返回>0,交换
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//两个元素比较
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

void print1(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
}

void test1()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(int), int_cmp);
	print1(arr, sz);
}

int main()
{
	test1();
	return 0;
}

运行结果:
在这里插入图片描述

3.2 结构体按名字排序实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(char* buf1, char* buf2, int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void bubble_sort(void* base, int num, int size, int(*cmp)(const void*, const void*))
{
	//趟数
	for (int i = 0; i < num - 1; i++)
	{
		//一趟内部比较的对数
		for (int j = 0; j < num - 1 - i; j++)
		{
			//假设需要升序cmp返回>0,交换
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//两个元素比较
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

struct Stu
{
	int age;
	char name[10];
};

void com_name(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->name - ((struct Stu*)p2)->name;
}

void print2(struct Stu* p1, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", (p1 + i)->name);
	}
}

void test2()
{
	struct Stu arr[] = { {18,"zhangsan"},{30,"lisi"},{20,"wangwu"}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), com_name);
	print2(arr, sz);
}

//qsort实现
int main()
{
	test2();//结构体打印
	return 0;
}

运行结果:
在这里插入图片描述

3.3 结构体按年龄排序实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void Swap(char* buf1, char* buf2, int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void bubble_sort(void* base, int num, int size, int(*cmp)(const void*, const void*))
{
	//趟数
	for (int i = 0; i < num - 1; i++)
	{
		//一趟内部比较的对数
		for (int j = 0; j < num - 1 - i; j++)
		{
			//假设需要升序cmp返回>0,交换
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//两个元素比较
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

struct Stu
{
	int age;
	char name[10];
};
//按年龄排序
void com_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}
//按年龄打印
void print3(struct Stu* p1, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", (p1 + i)->age);
	}
}

void test3()
{
	struct Stu arr[] = { {18,"zhangsan"},{30,"lisi"},{20,"wangwu"} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), com_age);
	print3(arr, sz);
}

//qsort实现
int main()
{
	test3();//结构体打印age
	return 0;
}

运行结果:
在这里插入图片描述

3.4 整体代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return *((int*)p1) - *((int*)p2);
}

void Swap(char* buf1, char* buf2, int size)
{
	for (int i = 0; i < size; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

void bubble_sort(void* base, int num, int size, int(*cmp)(const void*, const void*))
{
	//趟数
	for (int i = 0; i < num - 1; i++)
	{
		//一趟内部比较的对数
		for (int j = 0; j < num - 1 - i; j++)
		{
			//假设需要升序cmp返回>0,交换
			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)//两个元素比较
			{
				//交换
				Swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
			}
		}
	}
}

void print1(int* arr, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));
	}
}

void test1()
{
	int arr[] = { 7,9,3,5,4,6,2,1,0,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), int_cmp);
	print1(arr, sz);
}

struct Stu  //学生
{
	int age;//年龄
	char name[10];//名字
};
//假设按照名字来⽐较
void com_name(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->name - ((struct Stu*)p2)->name;
}

void print2(struct Stu* p1, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%s ", (p1 + i)->name);
	}
}
//按照名字来排序
void test2()
{
	struct Stu arr[] = { {18,"zhangsan"},{30,"lisi"},{20,"wangwu"}};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), com_name);
	print2(arr, sz);
}

void com_age(const void* p1, const void* p2)
{
	return ((struct Stu*)p1)->age - ((struct Stu*)p2)->age;
}

void print3(struct Stu* p1, int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", (p1 + i)->age);
	}
}

void test3()
{
	struct Stu arr[] = { {18,"zhangsan"},{30,"lisi"},{20,"wangwu"} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), com_age);
	print3(arr, sz);
}

//qsort实现
int main()
{
	//test1();//整型打印
	//test2();//结构体打印
	test3();
	return 0;
}

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

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

相关文章

企业开发(日期格式处理)——注解 @JsonFormatvs VS 消息转换器?

在企业级应用程序开发中&#xff0c;日期是一个常见但又容易被忽视的问题。正确处理日期格式对于系统的正确性和用户体验至关重要。在本文中&#xff0c;我们将探讨两种常见的方式来处理日期格式&#xff1a;通过注解和通过扩展Spring MVC的消息转换器&#xff0c;以及它们各自…

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…

网络3--网络通信的深度理解(端口号)

网络通信的进一步理解 两个主机间进行通信&#xff0c;其实是两个主机间的软件进行通信&#xff0c;软件也就是可执行程序&#xff0c;运行时就是进程&#xff0c;所以也为进程间通信。 进程间通信需要共享资源&#xff0c;这里两个主机间的共享资源是网络&#xff0c;利用的是…

MVP产品设计与数据指标

MVP&#xff08;minimum viable product&#xff0c;最小化可行产品&#xff09;概念最早由埃里克莱斯提出&#xff0c;刊载于哈弗商业评论&#xff0c;并有出版物《精益创业》 和常规产品不同&#xff0c;MVP更侧重于对未知市场的勘测&#xff0c;用最小的代价接触客户的方法…

修改远程服务器Nginx默认端口

目录 前言 正文 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1f46f; I’m studying in University of Nottingham Ningbo China&#x1f4eb; You can reach me by url below:My Blo…

Scala编程基础1:基本数据类型、变量、if、for、IO

注意&#xff1a;Scala系列的文章需要一定的java基础 Scala底层是用java语言编写的&#xff0c;scala是运行在Java虚拟机&#xff08;JVM&#xff09;上的编程语言&#xff0c;它兼容Java&#xff0c;可以直接调用Java的库和框架&#xff0c;并与Java代码无缝集成和互操作。 …

【C语言习题】6.逆序输出

文章目录 1.描述输入描述&#xff1a;输出描述&#xff1a;示例图&#xff1a; 2.解题思路3.具体代码4.代码讲解 1.描述 输入10个整数&#xff0c;要求按输入时的逆序把这10个数打印出来。逆序输出&#xff0c;就是按照输入相反的顺序打印这10个数。 输入描述&#xff1a; 一…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

【面试必看】MySQL部分

MySQL 1. 基础 1. 什么是关系型数据库&#xff1f; 一种建立在关系模型的基础上的数据库。关系模型表明了数据库中所存储的数据之间的联系&#xff08;一对一、一对多、多对多&#xff09;。各种表中&#xff08;比如用户表&#xff09;&#xff0c;表中的每一行就存放着一条…

基于jsp+servlet的网上商城

网上商城系统&#xff08;jspservlethtmlcssjsbootstrap&#xff09; 一、运行项目 在项目的doc文件夹下&#xff0c;有文档&#xff0c;教您怎么启动项目。 二、运行截图 a.项目前端页面 b.后台登录界面 c.后台展示界面 三、用户名和密码 前台的用户名是&#xff1a;mor…

webpack并行构建示例:

由于js的单线程特性&#xff0c;文件和任务时 要等待一个任务执行完成后执行下一个任务&#xff0c;但在实际开发中&#xff0c;很多任务是可以并行执行的&#xff08;如同时处理多个不同js文件或同事压缩多张图片&#xff09;&#xff0c;一些loader和插件&#xff08;thread-…

apk反编译修改教程系列-----利用反编译辅助软件 轻松去除apk强制更新弹窗_2 [十八】

上期解析了去除软件强制更新的几种方式。在反编译apk操作中不管那种操作都要根据编译的软件性质来决定,没有那种方法通用于所有的软件 。例如去除更新弹窗。有的只需要修改版本号就可以了。有的需要好几种方法结合来操作去除。前面也讲了几款推荐的辅助编译工具,今天以其中的…

Selenium 自动化 —— 四种等待(wait)机制

更多关于Selenium的知识请访问CSND论坛“兰亭序咖啡”的专栏&#xff1a;专栏《Selenium 从入门到精通》 ​ 目录 目录 需要等待的场景 自己实现等待逻辑 Selenium 提供的三种等待机制 隐式等待&#xff08;Implicit Waits&#xff09; 隐式等待的优点 隐式等待的缺点 …

山西省特岗教师报名流程及报名照片处理方法

山西省2024年特岗教师招聘公告已发布&#xff0c;计划招聘特岗教师1800名&#xff0c;这对于有志于教育事业的高校毕业生来说&#xff0c;无疑是一个极好的机会。本文将详细介绍报名流程&#xff0c;并提供报名照片处理的方法&#xff0c;帮助应聘者顺利通过报名环节。 一、报名…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中&#xff0c;“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构&#xff0c;用于组织和管理 USB 数据传输和事件。…

走进Java接口测试之多数据源切换示例

文章目录 一、前言二、demo实现2.1、开发环境2.2、构建项目2.3、配置数据源2.4、编写配置文件2.5、编写Dao层的mapper2.6、编写实体成层2.7、编写测试类2.8、验证结果 三、多数据源 demo 实现3.1、配置数据源3.2、增加pom文件3.3、修改数据源读取方式&#xff1a;3.4、增加动态…

Redis-持久化操作-AOF

持久化操作-AOF AOF是什么&#xff1f; 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来&#xff08;读操作不记录&#xff09;&#xff0c;只允许加文 件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换言之…

UE5C++ FString做为参数取值时报错error:C4840

问题描述 用来取FString类型的变量时报错&#xff1a; 问题解决 点击错误位置&#xff0c;跳转到代码&#xff1a; void AMyDelegateActor::TwoParamDelegateFunc(int32 param1, FString param2) {UE_LOG(LogTemp, Warning, TEXT("Two Param1:%d Param2:%s"), param…

【案例】使用Vue实现标题项元素上下移动

效果图 效果说明 每一组数据只能在对应的二级类目中进行上下移动&#xff0c;当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置&#xff0c;当点击的元素为该组的第一个元素时&#xff0c;将提示已经是第一项了并且不能进行移动&#xff1b;当点击下移图标的时…

03-数据结构(一)

链接&#xff1a;C# 数据结构_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1a541147Nk/?spm_id_from333.337.search-card.all.click&vd_source6eb7d966aa03ff5cb02b63725f651e68 链接&#xff1a;使用 C#.Net 学习掌握数据结构 (更新中)_哔哩哔哩_bilibili 一…