数据结构篇其一---顺序表

前言

数据结构篇---C语言实现数据结构

C语言的基础知识:数组 函数 结构体 指针 动态内存分配

顺序表

从数据结构的角度看待数组

int arr[10];

数组是一个基本的数据结构吗?

这里以一维数组为例。

从数据来看:这个数组存储10个整型数据。

从结构上:数据在内存中连续存储,地址随下标增加而增大。

所以数组也是一个数据结构。

顺序表的概念

顺序:按照一定的顺序,连续。

表:集合,相同事物的集合体。

连续,相同事物?这也符合数组的概念。那么顺序表和数组有什么关系呢?

顺序表底层就是数组,你认为顺序表就是数组也没问题。

已经有数组了为什么单独引入顺序表这个数据结构?

学了数组你能实现以下简单的操作

1.修改数组元素的数据。

2.排序。调用qsort函数,或者独立实现一种排序算法

3.数组传参。

4.用数组下标或者指针访问某个元素。

那么以下的操作你可曾实现过?

1.在数组的某个位置插入某个数据。

2.删除数组某个位置的数据。

3.查找数组中的某个数据。

很遗憾,数组并没有很简单的功能实现这些操作,初学时我们要自己用循环实现。

但我们如今开始学习数据结构了,顺序表就实现了这些算法。

顺序表提供了很多现成的的方法,数组要操作可能需要操作者自己实现的代码,顺序表已经实现了代码,可以立即使用。

结论:顺序表是数组的plus版。

线性表

下面挖掘一下广度。顺序表也只是一棵树的枝叶,我们要对他进行溯源,就是下面的线性表。

我们拆分一下这个词,线性表。

线性:即直线。具有直线的性质,直线是逻辑上的直线,不是物理上的直线。线性表的数据,一定对外表现出一条直线,(我们观察到的)。物理上指内存上的存储,即数据在内存存储是否为一条直线(连续存储)不关心。

表:集合。

线性表是一个(逻辑)线性结构的集合。

顺序表在逻辑上是线性的,所以顺序表是一种线性表。

顺序表在内存空间也是连续的,但线性表不要求空间连续。

那么是线性表但空间上不连续,又是什么数据结构呢?这里留个悬念。

总结:

线性表 逻辑上:线性(连续);物理结构(可连续可不连续)。

顺序表 逻辑上:线性;物理结构 连续。

顺序表的分类

顺序表分为静态顺序表和动态顺序表。

1.静态顺序表

前面说过顺序表的概念了。

限定条件:静态,意味着固定了,不变。

数组在创建时元素个数确定了,这个数组就固定了,称为定长数组。

虽然数组总的元素大小固定,但这数组每个元素不一定全部存入有效的数据,引入size记录有效数据的个数。

因此这里给出静态顺序表的定义:

#define MAX 100  //宏定义明示常量
typedef int SLDataType;//方便替换类型,比如你要存放double类型,只需把int更改为double
typedef struct seqlist {SLDataType arr[MAX];//定长数组int size;//记录当前的有效数据
}SL;

2.动态顺序表

限定条件:,灵活,"数组"大小可以变动。

C语言提供了动态内存分配相关的函数,方便程序员灵活操作空间,实现动态增容的目的。由于开辟的空间是连续,我们可以用指针把它当数组处理。

typedef int SLDataType;
typedef struct seqlist {SLDataType* arr;//需要一个SLDataType类型指向动态开辟内存的指针int size;//记录有效数据的个数int capacity;//记录当前开辟的内存大小能存入多少个SLDataType类型的元素个数。
}SL;

size要小于capacity即当前的有效数据小于总的容量大小,如果size==capacity,说明当前动态空间已经用完了,下次要增加值需要动态扩容,即realloc函数。

3.对比两种顺序表,分析优缺点。

动态顺序表和静态顺序表各有其优缺点,下面是对两者的详细对比:

静态顺序表:

优点:
空间确定性:静态顺序表在声明时即分配了固定大小的内存空间,这确保了其存储空间的确定性,便于管理和使用。
内容有效性,虽然是定长数组,但使用者知道静态顺序表大致会用多少空间,利用率高效。
缺点:
空间灵活性差:静态顺序表的大小在初始化时已经确定,无法在运行过程中动态地增加或减少。


动态顺序表:
优点:
空间灵活性高:动态顺序表的大小可以在运行时根据需要动态地增加或减少,这使得它更加灵活,能够适应不同规模的数据存储需求。


缺点:
内存管理复杂:动态顺序表要手动管理内存,包括分配和释放内存空间。如果管理不当,可能会引发内存泄漏问题。
性能上损耗:动态地分配和释放内存,动态顺序表在运行时可能会带来一些额外的开销,如内存分配,内存回收。

总结:看应用场景。
没有孰优孰劣,在数据量固定且空间需求明确的情况下,静态顺序表可能更加合适;而在数据量不确定或需要动态调整存储空间的情况下,动态顺序表可能更为适用。

顺序表的实现

这里以动态顺序表的实现为例,因为其实现相对有难度。

思考一下,我们要实现顺序表的那些功能?

动态顺序表放这儿方便看

typedef int SLDataType;
typedef struct seqlist {SLDataType* arr;//需要一个SLDataType类型指向动态开辟内存的指针int size;//记录有效数据的个数int capacity;//记录当前开辟的内存大小能存入多少个SLDataType类型的元素个数。
}SL;
SL s;//先创建一个顺序表出来

有了一个顺序表,第一步肯定是初始化吧。

接下来要用其实现某些功能了,即增删查改。

增:将数据存入顺序表,可以分头插,尾插,任意位置插入数据。

删:将数据从顺序表删除,有头删,尾删,指定位置删除。

查:即查找顺序表中某个元素是否存在。

改:修改顺序表指定位置的元素。

最后一步,如果顺序表不再使用了,记得销毁,将内存返还给操作系统。

采用的多文件实现,后面会附上源代码

 顺序表的初始化

void SLInit(SL* ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}

顺序表的销毁

void SLDestroy(SL* ps)
{if (ps != NULL)//传入结构体指针不为空{free(ps->arr);//释放动态开辟的内存}//跟初始化操作一样。ps->arr = NULL;//ps->arr记得原来开辟的起始地址,但现在已经回收内存,需要置空ps->size = ps->capacity = 0;//当前的有效数据个数和总的数据大小归为0;
}

顺序表的打印

 

为了便于测试过程检验每个函数的各个逻辑是否准确,每次打印出调用函数后的顺序表数据。

//遍历打印一遍顺序表,循环终止条件比较好理解就不赘述了。
void SLPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}

顺序表的尾插

void SLPushback(SL* ps, SLDataType x)
{//1.排除参数为空指针的情况assert(ps);//2.检查空间是否足够//没开辟空间(因为初始化时没给顺序表开辟空间)//当前开辟的空间满了,需要扩容。//写一个检查空间并进行扩容的函数SLCheckCapacity(ps);//后面会说ps->arr[ps->size] = x;++ps->size;
}

动态增容函数设计

void SLCheckCapacity(SL* ps)
{//检查该结构体指针是否为空assert(ps);//没开辟空间和空间不够的条件是ps->size==ps->capacity;if (ps->size == ps->capacity){//创建一个变量没开辟空间给一个初始的空间大小,否则增容到原来的两倍int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//1.既要能开辟空间又能增容的:realloc函数//2.由于realloc函数可能会失败,返回NULL,创建临时变量存储并检测这个值是否为空指针。SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity*sizeof(SLDataType));//检测if (tmp == NULL){perror("realloc fail");exit(-1);//异常退出。}//开辟或者增容成功了.ps->arr = tmp;ps->capacity = newCapacity;//开辟或增容后空间大小要修改。}
}

顺序表的头插

这里是容量为6的顺序表,要实现头插只需将size前的每个元素逐一往后移。

void SLPushfront(SL* ps, SLDataType x)
{assert(ps);//判断空指针SLCheckCapacity(ps);//检查空间大小是否足够for (int i = ps->size; i>0; i--){ps->arr[i] = ps->arr[i - 1];//终止条件:ps->arr[1]=ps->arr[0];}//后移结束,可以进行头插了。ps->arr[0] = x;//每次插入一个元素要有效数据加1;ps->size++;}

顺序表的尾删

//由于是删除数据,只需一个参数。
//执行删除操作时,顺序表要不为空表。
void SLPopBack(SL* ps)
{assert(ps);//判断空指针assert(ps->arr);//判断顺序表不为空表,即当前存在有效数据--ps->size;//当前有效数据减一即可。}

顺序表的头删

//由于是删除操作,只需传一个参数。
//只需第二个元素覆盖第一个元素,第三个覆盖第二个,从前往后依次。
void SLPopFront(SL* ps)
{assert(ps);int i = 0;for (i = 1; i<ps->size; i++){ps->arr[i - 1] = ps->arr[i];//循环终止条件//ps->arr[0]=ps->arr[1]//ps->arr[ps->size-2]=ps->arr[size-1];}--ps->size;//由于每次删除一个数据,所以记得有效数据减少一。
}

顺序表在指定位置之前的插入

//在pos位置之前插入数据
//由于插入数据,要知道插入到数据是多少,所以需要传参。
//由于插入数据,要检查当前空间是否足够,需要调用SLCheckCapacity函数
//由于指定位置,要知道位置是多少,也需要传参,还需注意其合法性。
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;//在指定位置之前插入,即该位置放新数据,原来的位置及之后的数据整体往后挪。ps->size++;//插入了一个元素,有效数据加一。}

顺序表在指定位置删除元素

//由于删除数据,对比插入数据,就只要两个参数
void SLErase(SL* ps, int pos)
{assert(ps);//空指针assert(pos >= 0 && pos < ps->size);//判断位置区间的有效性//不用检查空间int i = 0;//跟处理头删一样,但这次位置不是0了。for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//最后一次循环,ps->arr[ps->size-2]=ps->size[ps->size-1]}--ps->size;
}

修改函数

没什么难度。

void SLmodify(SL* ps, int pos, SLDataType x)
{assert(ps);ps->arr[pos] = x;
}

查找函数

//遍历一边当前的有效数据。
//找到了返回下标,没找到(遍历完)返回一个负数,这里是为-1;
int SLFind(SL* ps, SLDataType x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (x == ps->arr[i]){return i;}}return -1;
}

源代码

seqlist.h

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int SLDataType;
//动态顺序表
typedef struct SeqList
{SLDataType* arr;int size; //有效数据个数int capacity; //空间大小
}SL;//typedef struct SeqList SL;//顺序表初始化
void SLInit(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
void SLPrint(SL* ps);//检查空间是否足够
void SLCheckCapacity(SL* ps);
//头部插入删除 / 尾部插入删除
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);void SLPopBack(SL* ps);
void SLPopFront(SL* ps);//指定位置之前插入/删除数据
void SLInsert(SL* ps, int pos, SLDataType x);
void SLErase(SL* ps, int pos);//修改函数,查找函数。
void SLModify(SL* ps, int pos,SLDataType X);
int SLFind(SL* ps, SLDataType x);

seqlist.c


#define _CRT_SECURE_NO_WARNINGS 1#include"seqlist.h"//顺序表的初始化
void SLInit(SL * ps)
{ps->arr = NULL;ps->size = ps->capacity = 0;
}
//顺序表的销毁
void SLDestroy(SL* ps)
{if (ps != NULL)//传入结构体指针不为空{free(ps->arr);//释放动态开辟的内存}//跟初始化操作一样。ps->arr = NULL;//ps->arr记得原来开辟的起始地址,但现在已经回收内存,需要置空ps->size = ps->capacity = 0;//当前的有效数据个数和总的数据大小归为0;
}
//遍历打印一遍顺序表,循环终止条件比较好理解就不赘述了。
void SLPrint(SL* ps)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->arr[i]);}printf("\n");
}//尾插
void SLPushBack(SL* ps, SLDataType x)
{//1.排除参数为空指针的情况assert(ps);//2.检查空间是否足够//没开辟空间(因为初始化时没给顺序表开辟空间)//当前开辟的空间满了,需要扩容。//写一个检查空间并进行扩容的函数SLCheckCapacity(ps);//后面会说ps->arr[ps->size] = x;++ps->size;
}
void SLCheckCapacity(SL* ps)
{//检查该结构体指针是否为空assert(ps);//没开辟空间和空间不够的条件是ps->size==ps->capacity;if (ps->size == ps->capacity){//创建一个变量没开辟空间给一个初始的空间大小,否则增容到原来的两倍int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//1.既要能开辟空间又能增容的:realloc函数//2.由于realloc函数可能会失败,返回NULL,创建临时变量存储并检测这个值是否为空指针。SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));//检测if (tmp == NULL){perror("realloc fail");exit(-1);//异常退出。}//开辟或者增容成功了.ps->arr = tmp;ps->capacity = newCapacity;//开辟或增容后空间大小要修改。}
}//头插
void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);//先让顺序表中已有的数据整体往后挪动一位for (int i = ps->size; i > 0; i--){ps->arr[i] = ps->arr[i - 1];//arr[1] = arr[0]}ps->arr[0] = x;ps->size++;
}//尾删
//由于是删除数据,只需一个参数。
//执行删除操作时,顺序表要不为空表。
void SLPopBack(SL* ps)
{assert(ps);//判断空指针assert(ps->arr);//判断顺序表不为空表,即当前存在有效数据--ps->size;//当前有效数据减一即可。}//头删// 由于是删除操作,只需传一个参数。
//只需第二个元素覆盖第一个元素,第三个覆盖第二个,从前往后依次。
void SLPopFront(SL * ps)
{assert(ps);int i = 0;for (i = 1; i < ps->size; i++){ps->arr[i - 1] = ps->arr[i];//循环终止条件//ps->arr[0]=ps->arr[1]//ps->arr[ps->size-2]=ps->arr[size-1];}--ps->size;//由于每次删除一个数据,所以记得有效数据减少一。
}//在pos位置之前插入数据
//由于插入数据,要知道插入到数据是多少,所以需要传参。
//由于插入数据,要检查当前空间是否足够,需要调用SLCheckCapacity函数
//由于指定位置,要知道位置是多少,也需要传参,还需注意其合法性。
void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);assert(pos >= 0 && pos < ps->size);SLCheckCapacity(ps);int i = 0;for (i = ps->size; i > pos; i--){ps->arr[i] = ps->arr[i - 1];}ps->arr[pos] = x;//在指定位置之前插入,即该位置放新数据,原来的位置及之后的数据整体往后挪。ps->size++;//插入了一个元素,有效数据加一。}//由于删除数据,对比插入数据,就只要两个参数
void SLErase(SL* ps, int pos)
{assert(ps);//空指针assert(pos >= 0 && pos < ps->size);//不用检查空间int i = 0;//跟处理头删一样,但这次位置不是0了。for (i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//最后一次循环,ps->arr[ps->size-2]=ps->size[ps->size-1]}--ps->size;
}void SLModify(SL* ps, int pos, SLDataType x)
{assert(ps);ps->arr[pos] = x;
}//遍历一边当前的有效数据。
//找到了返回下标,没找到(遍历完)返回一个负数,这里是为-1;
int SLFind(SL* ps, SLDataType x)
{assert(ps);int i = 0;for (i = 0; i < ps->size; i++){if (x == ps->arr[i]){return i;}}return -1;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"seqlist.h"
void SLTest(void)
{SL s;//初始化SLInit(&s);//自己测试各个函数逻辑是否正确。//顺序表的销毁SLDestroy(&s);
}int main()
{SLTest();return 0;
}

尾声

 数据结构篇其一---顺序表,结束!

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

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

相关文章

OpenCV 实现霍夫圆变换

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现霍夫变换 下一篇:OpenCV 实现重新映射 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 HoughCircles()检测图像中的圆圈。 理论 Hough 圆变换 H…

L2-052 吉利矩阵

题目描述 题解思路 这个道题就是很简单&#xff0c;就跟n皇后问题一样&#xff0c;给矩阵填数&#xff0c;使得矩阵满足一个什么条件&#xff0c;最后求方案数或者方案。很容易想到回溯法&#xff0c;根据数据范围&#xff0c;应该能够确定回溯法是没有问题的。 我们只需要枚举…

Python实现线性拟合及绘图

Python实现线性拟合及绘图 当时的数字地形实验&#xff0c;使用matplotlib库绘制了一张图表表示不同地形类别在不同分辨率下的RMSE值&#xff0c;并分别拟合了一条趋势线。现在来看不足就是地形较多时&#xff0c;需要使用循环更好一点&#xff0c;不然太冗余了。 代码逻辑 …

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码&#xff0c;解压即可食用&#xff0c;支持在本地浏览器打开。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

vscode 打代码光标特效

vscode 打代码光标特效 在设置里面找到settings 进入之后在代码最下方加入此代码 "explorer.confirmDelete": false,"powermode.enabled": true, //启动"powermode.presets": "fireworks", // 火花效果// particles、 simple-rift、e…

STM32_舵机的实战

一、配置相应的管脚 二、写代码

ASP.NET集成客户关系管理的企业网站的设计与开发

摘 要 企业要在激烈的市场竞争中立于不败之地&#xff0c;就必须找一种全新的管理理念和管理手段&#xff0c;对其内部和外部资源进行有效的整合。新一代ERP产品正在向客户端和供应端延伸&#xff0c;客户端的延伸即是客户关系管理。对于每个企业来说客户管理的完善程度将直接…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

IOS恢复

1、实验目的 通过本实验可以掌握&#xff1a; copy方式恢复IOS的步骤。TFTPDNLD方式恢复IOS的步骤。Xmodem方式恢复IOS的步骤。 2、实验拓扑 路由器IOS恢复的实验拓扑如下图所示。 3、实验步骤 如果工作中不慎误删除路由器IOS&#xff0c;或者升级了错误版本的IOS&#xff…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

【华为 ICT HCIA eNSP 习题汇总】——题目集17

1、以下哪项不属于网络层安全威胁&#xff1f; A、DDos攻击 B、钓鱼攻击 C、IP Spoofing D、IP地址扫描 考点&#xff1a;网络安全 解析&#xff1a;&#xff08;B&#xff09; 钓鱼攻击通常被认为是应用层的安全威胁&#xff0c;也有在网络层进行伪装实施钓鱼攻击&#xff0c;…

Android驱动开发之如何编译和更换内核

编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择 由…

揭秘区块链的魅力:了解其功能与区块链项目的媒体宣发策略

在数字化的今天&#xff0c;区块链这一先进的技术逐渐成为公众的焦点。然而&#xff0c;许多人对于区块链能干什么&#xff0c;以及如何为区块链项目进行媒体宣发这两大问题抱着疑惑。接下来&#xff0c;让我们一起揭开这个迷雾。 我们先来了解下区块链究竟能做什么。简单地说&…

Tensorflow AutoGraph 的作用和功能

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ TensorFlow AutoGraph 是 TensorFlow 中的一个重要特性&#xff0c;它允许开发者使用普通的 Python 语法编写高效的 TensorFlow 图&#xff08;graph&#xff09;。这意味着开发者可以利用 Python 的易…

Nginx基本使用 反向代理与负载均衡

什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。 其特点是占有内存少&#xff0c;并发能力强&#xff0c;nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;而且几乎可以做到7*24不间断运行&#xff0c;即使运行数个月也不需要重新启动。 …

多客圈子交友系统 uniapp+thinkphp6适配小程序/H5/app/api全开源,多款插件自选,支持个性定制!

网上交友的优点包括&#xff1a; 1. 方便&#xff1a;网上交友可以随时随地进行&#xff0c;不受时间和空间的限制&#xff0c;方便且高效。 2. 匿名性&#xff1a;网上交友可以实现匿名性&#xff0c;用户可以匿名地搜索、聊天或交换信息&#xff0c;保护个人隐私和安全。 3.…

WEB服务的配置与使用 Apache HTTPD

目录 Web 访问过程&#xff1a; HTTP请求报文&#xff08;请求行、请求头、请求体&#xff09;以及响应报文&#xff1a; 补充&#xff1a; Apache HTTPD服务器的安装与配置 安装&#xff1a; 配置&#xff1a; 修改首页&#xff1a; 打开目录权限 &#xff1a; 重启&#xff1…

(九)Pandas表格样式 学习简要笔记 #Python #CDA学习打卡

目录 一. Pandas表格样式 1&#xff09;举例数据 2&#xff09;字体颜色 3&#xff09;背景高亮 4&#xff09;极值背景高亮 &#xff08;a&#xff09;高亮最大值 highlight_max() &#xff08;b&#xff09;高亮最小值 highlight_min() &#xff08;c&#xff09;同时…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候&#xff0c;数据库突然发生了故障&#xff0c;导致大量请求失败&#xff0c;在数据库宕机不久&#xff0c;通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候&#xff0c;我还是有点懵逼的&#xff0c;数据库…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器&#xff0c;在item中添加了很多的控件&#xff0c;这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候&#xff0c;及容易不小心就把数据给修改了而不自知。所有&#xff0c;我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…