C语言 - 删除数组中的指定元素(Delete)

目录

 

引言:

题目说明:

举例分析:

初始状态:

step 1: 

Step 2: 

Step 3 : 

Step 4 :  将最后一个元素赋值为0

 Step 5 :将i下标向前迁移一位(重复判断):

代码实现: 

总结:


 

引言:

这是数组中一个比较简单的题目,今天把它单独拎出来的原因就是在我即将要写的数据结构的顺序表和链表中的增删改查功能里面的删除功能与这个题目的思路是一致的,个人感觉有必要进行一下说明。

题目说明:

当我们要进行删除元素函数的时候,理论上的删除元素是不能实现的,我们可以通过让后面的元素对前面的元素进行覆盖来达到这一效果,在这里我先举一个以删除数组中指定元素的例子:

例如在这里我们需要删除一个长度为10个单位的数组里面的指定元素4,我们需要做的是使用下标i对原始数组进行遍历,当满足i号下标元素等于我们指定要删除的元素这个条件时,再使用一个j下标定位至i下标的位置,j的循环结束边界为数组末尾的前一个元素,利用循环将后一个元素的值覆盖前一个元素的值,通俗地讲也就是元素的迁移:

举例分析:

例如我在一个长度为10的数组中分别填充了1,2,3,4,5,6,7,8,9,10这十个元素,现在要求删掉元素8,我们在画板上来演示过程:

初始状态:

我们设立两个下标i和j,在开始的时候分别指向数组的首元素:

c74f861ea45c4277bcfe28e7ab6b266c.png

step 1: 

下标i开始对数组进行遍历,到达8的位置停下,8也就是(ar[7])就是我们要删除的数据:

986a150e51884f98a4e80e535378f163.png

 

Step 2: 

此时我们将j下标与i下标进行对齐,并将下标后的9和10元素分别向前迁移一个单位,也就是9覆盖8,10覆盖9,并将最后一个元素赋值为0:

19e64969482b4a83875d03d44a13fbc8.png

Step 3 : 

c3ab859662b5417995d61b89414e4e9d.png

Step 4 :  将最后一个元素赋值为0

0b16dddf66114de39abb351a7999da7f.png

 Step 5 :将i下标向前迁移一位(重复判断):

6de760f2b23644259455a8b27729a3e5.png

如果此时数组里面填充的元素分别是1,2,3,4,5,6,7,8,8,9,那么当i下标向前迁移一位后,重新指向8就再次进入循环,输出结果就为1,2,3,4,5,6,7,9,0,0,i下标向前迁移一位的作用就是对原先位置的元素重新进行是否符合条件的判断。

代码实现: 

#include<stdio.h>
#include<assert.h>
void Show_ar(int *ar,int len)//打印函数
{
    assert(ar != NULL);
    for(int i = 0;i < len;i++){
        printf("%d ",ar[i]);
    }
}
void Fill_number(int *ar,int len)//元素填充数组函数
{
    assert(ar != NULL);
    for(int i = 0;i < len;i++){
        scanf("%d",&ar[i]);
    }
}
void Remove_number(int *ar,int len,int value)//删除元素函数
{
    assert(ar != NULL);
    for(int i = 0;i < len;i++){
        if(value == ar[i]){
            for(int j = i;j < len - 1;j++){
                ar[j] = ar[j + 1];
            }
            ar[len - 1] = 0;
            i--;
        }
    }
}
int main()
{
    //删除一个元素,后面用0来进行填充
    int n = 0;
    printf("Please enter the size of the array:n");
    scanf("%d",&n);
    int ar[n];
    int len = sizeof(ar) / sizeof(ar[0]);
    int value = 0;//value代表你要删除的值
    printf("Please fill the array with numbers:n");
    Fill_number(ar,len);
    printf("Enter the number you want to delete:n");
    scanf("%d",&value);
    Remove_number(ar,len,value);
    Show_ar(ar,len);
    return 0;
}

例如我在这里输入的数组总大小为5,依次填充的数据分别为6,7,8,9,10,我指定要删除元素7:

a753a9d736e84cc7afb16ccbda0ddce3.png

运行结果如图所示,输出的元素分别为6,8,9,10,0。

例如我在这里输入的数组总大小为10,依次填充的数据分别为1,2,3,4,5,6,7,7,7,8,我指定要删除元素7:

b0ce80c662e34797821c9fa2e6f2bfe9.png

 运行结果如图所示,输出的元素分别为1,2,3,4,5,6,8,0,0,0,程序中j的下标成功地进行了指定元素的重定向并将元素中的所有元素7删除。 

总结:

这个程序其实代码不难写,主要在过程的剖析和理解上,其实删除这种操作在程序中理论是不能实现的(暂时),我们就可以通过覆盖的方式来达到删除的目的。程序在输入的元素全都不同的情况下可以删除指定的单个元素,在输入的元素有部分相同的情况下,通过下标对元素的重定向可以实现元素的重复删除,难度相对较低。