C语言-一维数组、二维数组 (一篇文章带你彻底读懂!!!)

本文介绍了数组的基本概念,包括一维数组和二维数组。数组是相同数据类型元素的集合,内存中连续存放。文章详细阐述了一维数组的插入、删除、查找、遍历、排序等操作,并提供了相应的代码示例。同时,解释了数组查询速度快但增删慢的原因。二维数组的初始化、输入、输出和查找也进行了说明。

数组简介

  1. 数组是相同数据类型的元素的集合

  1. 数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。

  1. 数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。

数组的特性:查询快、增删慢。

为什么查询快?

因为数组存在下标这个概念,可以通过下标对元素进行直接访问,而并不需要像链表一样一步步遍历。

为什么增删慢?

这里举个例子,例如:

arr[10] 这个一维数组中,元素存放已满,现要将arr[5] 这个元素删除掉,那是否就要将 arr[6] - arr[10] 这五个元素全部向前移动来补齐空位呢,所以就总结出来了,数组的元素删除需要移动大量元素;同理插入元素也是一样的道理,所以增删慢。

一维数组的基本操作

数组可以进行插入、删除、查找、遍历、排序等等操作…

一维数组的输入

如下图所示,创建一个 有10个元素的数组arr,又因为它的下标是从0开始,所以最后一位元素位置的下标为9。

void cerate(){

    //定义一个 int类型数组
    int arr[10];
    
    //实现循环录入数组数据
    //这里需要注意 数组的下标以0开始,所以10个元素的数组下标最多到9
    for( int i=0; i<10; i++){
        
        printf("请输入第%d个元素:",i+1);
        scanf("%d",&arr[i]);

    }

}

一维数组的输出

// length 为接收的数组长度
int print(int arr[],int length){

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

}

一维数组的查找

一维数组查找数据是否存在,可以通过遍历数组一步步进行比较,如下文代码所示:

// length 为接收的数组长度
void find(int arr[],int length){

    int value;
    printf("请输入待查找值:");
    scanf("%d",&value);

    //遍历数组
    for(int i=0; i<length; i++){

        //这里进行判断比较
        if(arr[i] == value){

            printf("%d存在数组中,其下标为:%d",value, i);

        }
    
    }

}

一维数组的插入

即元素插入,插入数据需要将插入元素位置及以后的元素向后移动,为待插入数据腾出空间。

// length 为接收的数组长度
void insert(int arr[], int length){

    int index;
    printf("请输入待插入元素的下标:");
    scanf("%d",&index);

    int value;
    printf("请输入待插入元素的值:");
    scanf("%d",&value);

    //将待插入元素位置及以后的元素后移,为其腾空位置
    for(int i=length-1; i>=index ;i++){

        arr[i+1] = arr[i];    //将当前位置元素放到后一位中

    }

    //元素插入 增加数组元素,所以长度相对应也要增加
    length++;

}

一维数组的删除

删除元素与插入相反,需要删除元素以后的元素向前移动,补齐空位。

可以通过删除 指定元素 或 删除指定下标位置 来操作。

// length 为接收的数组长度
void insert(int arr[], int length){

    //通过删除指定下标位置
    int index;
    printf("请输入待删除元素的下标:");
    scanf("%d",&index);

    //通过删除指定元素值
    int value;
    printf("请输入待删除元素的值:");
    scanf("%d",&value);

    //这里就以删除指定下标位置为例,将删除位置以后的元素向前移动,补齐空位。
    //将index+1位的元素 覆盖到 index的位置,index+2 覆盖 index+1 以此类推…
    for(int i=index+1; i<length ;i++){

        arr[i-1] = arr[i];    //将当前位置元素放到前一位中

    }

    //元素删除 减少数组元素,所以长度相对应也要减少
    length--;

}

一维数组的修改

元素修改,与删除一样,我们也是可以通过修改指定下标位置的值,或修改指定值来操作。

上面元素删除拿下标举例子,那元素修改就拿指定值来举例吧。

// length 为接收的数组长度
void amend(int arr[], int length){

    //这里输入待修改的值,即修改前的值
    int value;
    printf("请输入待修改数据的下标:");
    scanf("%d",&value);

    //这里输入修改后的值
    int value_02;
    printf("请输入修改后的值:");
    scanf("%d",&value_02);

    for(int i=0; i<length; i++){
        
        if(arr[i] == value){

            //因为已经满足判断条件 arr[i] == value ,所以以下两行代码等价,选择其一即可
            value = value_02;
            arr[i] = value_02;
            
        }
        
    }
    
}

一维数组的排序

这里因为涉及到了排序算法,大家简单了解即可,以后我会针对排序算法专门出一篇文章进行讲解。

这里采用 冒泡排序 对数组arr进行排序,这里针对下文代码为大家简单讲解冒泡排序的思想。

冒泡排序的思想:相邻两数两两进行比较,将 较大 值移动至后方。

// length 为接收数组的长度
void bubbleSort(int arr[], int length){

    //这里 i<length-1 是为了能够减少循环次数,因为提取1个数据与其余剩下9个数据做对比,如果还比较10次话 会浪费时间,无形中增加了时间复杂度。
    for(int i=0;i< length-1; i++){

        //这里 j<length-i-1 用来控制比较值的个数,即比较次数
        for(int j=0; j<length-i-1 ;j++){

            //判断前值是否大于后值,若大于则进行交换
            if(arr[j] > arr[j+1]){

                //空杯交换,即:创建一个新的变量接收arr[j]的值。否则直接将arr[j+1]的值直接赋给arr[j]后,那么arr[j]的值被覆盖则无法将原值重新赋给arr[j+1]
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = arr[j];

            }

        }

    }

}


二维数组的基本操作

二维数组的初始化

这里 为了能够让大家清晰明了的了解二位数组的存储模式,先以初始化的方式来为其赋值。

void create(){
    
    int arr[3][2] = {    // 意为 3行2列
                        {1,2},
                        {3,4},
                        {5,6}
    };
    
}

二维数组的输入

void create(){
    
    int arr[3][2];

    //定义行下标 循环行
    for(int i=0; i<3; i++){

        //定义列下标 循环列
        for(int j=0; j<2; j++){
            
            printf("请输入第%d行第%d列的元素:",i+1, j+1);
            scanf("%d",&arr[i][j]);
            
        }    //执行完毕内层循环后 表明已经输入完当前列的数据,紧接着外层的第二次循环开始对第二行元素的输入
    
    }
    
}

二维数组的输出

// length 为接收的数组行    length_02 为接收的数组列
int print(int arr[],int length, int length_02){

    for(int i=0; i<length; i++){
        
        for(int j=0; j<length_02; j++){

            printf("%d ",arr[i][j]);

        }
    
        //这里需要注意,如果执行完毕内层循环 则表明已经输出完当前行所有列的值,则需要换行
        printf("\n");
    
    }

}

二维数组的查找

二维数组与一维数组相似,一样可以通过遍历判断来查找。

// length 为接收的数组行    length_02 为接收的数组列
void find(int arr[],int length){

    int value;
    printf("请输入待查找值:");
    scanf("%d",&value);

    //遍历数组
    for(int i=0; i<length; i++){

        for(int j=0; j<length_02 ;j++){

            //这里进行判断比较
            if(arr[i] == value){

                printf("%d存在数组中,它在第%d行第%d列",value, i+1, j+1);

            }

        }
    
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Discord_lim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值