Objective-C 线性表


一、线性表的基本概念

线性表的基本概念

线性表是n个元素的有限序列,它们之间的关系可以排成一个线性序列:

     a1,a2,…… ,ai,…… ,an

其中n称作表的长度,n=0时,称作空表。


线性结构特点:在数据元素的非空有限集中

存在唯一的一个被称作“第一个”的数据元素

存在唯一的一个被称作“最后一个”的数据元素

除第一个外,集合中的每个数据元素均只有一个前驱

除最后一个外,集合中的每个数据元素均只有一个后继

 

线性表注意

 

假设n个数够成的线性表,n=0 表示是空表,元素的类型必须一致,并且不能有缺项。

 

关于元素地址计算的方法:

 

LOC(ai)=LOC(a1)+(i-1)*L

LOC(ai+1)=LOC(ai)+L

其中:

L— 一个元素占用的存储单元个数

LOC(ai)—线性表第i个元素的地址

 

 

二、线性表的的建立

 

如何建立一个线性表?

线性表:数据区+线性表长度变量

 

//将int类型重新定义一个新的类型DataType

typedef intDataType;

//定义线性表的长度

#define MAX_SIZE 100

typedef structSeqList{

//定义数据区,用来存放线性表的数据

    int data[MAX_SIZE];

//定义线性表的一个长度的变量

    int SeqLength;

}SList;

 

 

三、线性表的操作

1、线性表的初始化

/**

 * 创建并且初始化线性表

 */

SList* Create_SeqList(){

//printf("%d",sizeof(SList));

//申请一个长度为404的内存单元

// malloc返回值是(void*)我们要让list指向这片空间,所以需要强制转换

SList*list = (SList *)malloc(sizeof(SList));

    // malloc函数如果执行成功,返回新申请的这片内存单元的首地址

// malloc 函数如果执行失败,返回NULL

//判断内存空间是否申请成功

if(list!=NULL){

printf("线性表创建并初始化成功~\n");

//list->SeqLength = 0;设置线性表为空

list->SeqLength= 0;

returnlist;

}else{

printf("线性表创建成功~\n");

returnNULL;

}

}

 

2、线性表的打印输出

/*

 * 打印输出线性表的内容(其实就是将线性表中的数据域遍历)

 * 参数:给出线性表的首地址

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 *2、判断线性表是否是一个空表(list->SeqLength==0)

 * 3、如果线性表不为空,则可以遍历输出线性表的内容

 */

voidPrint_SeqList(SList *list){

//1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

//判断线性表是否为空

if(list->SeqLength>0){

//开始遍历

inti;

for(i=0;i<list->SeqLength;i++){

printf("%d\t",list->data[i]);

}

 

printf("\n");

}else{

printf("线性表为空~\n");

}

}else{

printf("线性表不存在~\n");

}

}

 

3、线性表的数据插入

 

/*

 * 功能:插入新的数据到线性表

 *返回值:void

 *       插入到哪个线性表       位置                                     数据

 *参数:(SList *list,int location,DataType data)

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 *2、判断线性表是否已满,条件(list->SeqLength==MAX_SIZE)

 * 3、判断要插入的位置是否合法

 * 4、如果位置合法,要开始执行插入

 *5、需要移动 n-i+1次  (i是第i个元素)

 */

voidInsert_SeqList(SList *list,int location,DataType data){

 

//1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

//判断线性表是否为空

if(list->SeqLength==MAX_SIZE){

printf("线性表已满~\n");

}else{

 

if(location<0|| location >list->SeqLength){

printf("您要插入的位置不合法~\n");

}else{

//循环移动元素

inti;

//移动n-i+1个元素

for(i=list->SeqLength-1;i>=location;i--){

//向右移动一个元素

list->data[i+1]= list->data[i];

}

//把要插入的值放到location位置

list->data[location]= data;

list->SeqLength++;

}

}

}else{

printf("线性表不存在~\n");

}

}

 

 

4、线性表的数据修改

/*

 * 功能:修改线性表中的指定位置的数据

 *返回值:void

 *       修改哪个线性表       位置                                     数据

 *参数:(SList *list,int location,DataType data)

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 *2、判断要修改的位置是否合法   0<i<list->SeqLength

 * 3、如果位置合法,要开始执行修改操作

 */

voidModify_SeqList(SList *list,int location,DataType data){

 

//1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

 

if(location<0|| location >list->SeqLength){

printf("您要插入的位置不合法~\n");

}else{

//把要插入的值放到location位置

list->data[location]= data;

}

 

}else{

printf("线性表不存在~\n");

}

}

 

 

5、线性表的删除

 

/*

 * 功能:删除指定位置的数据

 *返回值:void

 *       删除哪个线性表    位置

 *参数:(SList *list,int location)

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 * 2、判断当前的线性表,是否为空,如果为空,则不能再删除

 *3、判断要删除的位置是否合法   0<i<list->SeqLength

 * 4、要进行移动

 * 5、进行删除操作

 */

voidDelete_SeqList(SList *list,int location){

 

//1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

 

//判断线性表是否为空

if(list->SeqLength>0){

 

//如果不为空个,需要判断位置是否合法

if(location<0|| location >list->SeqLength){

printf("您要删除的位置不合法~\n");

}else{

 

//移位

inti;

for(i=location;i<list->SeqLength;i++){

list->data[i]= list->data[i+1];

}

//让线性表的长度减1

                    list->SeqLength --;

}

 

}else{

printf("当前线性表为空,不能进行删除~\n");

}

 

}else{

printf("线性表不存在~\n");

}

}

 

 

6、线性表的查找(按位置查找)

 

/*

 *功能:根据位置(location)进行查找

 *返回值:DataType

 *       查找哪个线性表    位置

 *参数:(SList *list,int location)

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 * 2、根据位置,直接获取该位置所对应的值

 */

DataTypeSearchByLocation(SList *list,int location){

//1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

printf("当前线性表中,位置为:%d 的值为:%d\n",location,list->data[location]);

            return list->data[location];

}else{

printf("线性表不存在~\n");

return1;

}

}

 

 

7、线性表的查找(按值查找)

 

/*

 * 功能:根据给定的值,查找该值所对应的位置

 *返回值:int

 *       查找哪个线性表    要查找的数据

 *参数:(SList *list,DataType data)

 * 思路:

 *1、判断list是否为空,如果为空说明线性表不存在

 * 2、遍历,查找值是否存在,如果查找到了,应该立即停止

 */

intSearchByData(SList *list,DataType data){

 

   //1、判断list是否为空,如果为空说明线性表不存在

if(list!=NULL){

inti;

intseachFlag = 0;

for(i=0;i<list->SeqLength;i++){

 

//判断线性表中的每一个值是否等于要查找的值

if(list->data[i]==data){

seachFlag= 1;

break;

}

}

 

if(seachFlag){

printf("您要查找的 %d 在当前线性表中的位置是:%d\n",data,i);

//返回的就是查找到这个值的位置

returni;

}else{

 

return0;

printf("没有查找到符合的数据~\n");

}

 

 

}else{

printf("线性表不存在~\n");

return0;

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值