Xóa phần tử mảng trong C/C++ | Lập Trình Từ Đầu

Trong những bài trước, ta đã thực hiện thao tác thêm phần tử, sắp sếp phần tử và đảo ngược mảng 1 chiều. Tuy nhiên, một số trường hợp nhất định ta cần xóa đi một (hay nhiều) phần tử nào đó thuộc mảng.

1.Cách xóa phần tử trong mảng

Trong bài này, tôi sẽ hướng đẫn cho bạn đọc thực hiện một cách xóa đơn giản nhất trong mảng 1 chiều. Cách xóa này sẽ thực hiện dịch chuyển lùi các phần tử từ sau vị trị cần xóa sang phía bên trái để chèn qua phần tử cần xóa. Sau đó thực hiện giảm số lượng phần tử mảng đi 1 đơn vị.

Bạn đọc có thể tham khảo hình dưới đây để dễ hình dung hơn việc xóa phần tử trong mảng. Giả sử mảng ban đầu của tôi là int arr[6] = {1,2,3,4,5,6};

Vấn đề đặt ra rằng, tôi cần xóa đi số 4 trong mảng trên (nghĩa phần tử này tại vị trí arr[3]). Như vậy tôi cần dịch chuyền tử phần tử số 5 (arr[4]) về phần tử số 4 (arr[3]) và phần tử số 6 (arr[5]) về phần tử số 5 (arr[4]) trong mảng. Sau đó tôi sẽ giảm kích thước mảng đi 1 đơn vị.

Bạn đọc có thể xem hình dưới đây để hiểu rõ hơn các bước xóa phần tử số 4 trên:

2.Chương trình xóa phần tử trong mảng

Bạn đọc cùng tham khảo đoạn code dưới đây để hiểu hơn về việc xóa phần tử trong mảng. Với mảng ban đầu là int arr[6] = {1,2,3,4,5,6}; và phần tử cần xóa là 4 tại vị trí index = 3

#include <stdio.h>
int main(){
    //so luong phan tu mang
    int n = 6;
    //khai bao mang
    int arr[n] = {1,2,3,4,5,6};
    //vi tri can xoa trong mang
    int index = 3;
    //hien thi mang ban dau
    printf("MANG BAN DAU\n");
    for(int i = 0; i < n ; i++){
        printf("%d \t",arr[i]);
    }
    
    // Dich chuyen mang ve ben trai tu vi tri xoa
    for(int i = index; i < n - 1; i++){
        arr[i] = arr[i+1];
    }
    //sau khi xoa giam so luong phan tu mang
    n--;
    
    //hien thi mang sau khi xoa tai vi tri index = 3
    printf("\nMANG SAU KHI XOA TAI ARR[%d]\n", index);
    for(int i = 0; i < n; i++){
        printf("%d \t",arr[i]);
    }
}

Từ chương trình trên, ta hoàn toàn có thể xây dựng hàm xóa phần tử tại vị trí bất kỳ trong mảng. Hàm void XoaPhanTu(int arr[], int &n, int index) dưới đây nhận int arr[] là mảng cần xóa phần tử, int n là số lượng phần tử của mảng, int index là vị trí cần được xóa.

#include <stdio.h>
void XoaPhanTu(int arr[], int &n, int index){
    //neu dia chi xoa nho hon 0 thi xoa phan tu dau tien
    if(index < 0){
        index = 0;
    }
    //neu dia chi xoa lon hon hoac bang n thi xoa phan tu cuoi cung
    if(index >= n){
        index = n - 1;
    }
    // Dich chuyen mang ve ben trai tu vi tri xoa
    for(int i = index; i < n - 1; i++){
        arr[i] = arr[i+1];
    }
    //sau khi xoa giam so luong phan tu mang
    n--;
}
int main(){
    //so luong phan tu mang
    int n = 6;
    //khai bao mang
    int arr[n] = {1,2,3,4,5,6};
    //vi tri can xoa trong mang
    int index = 3;
    //hien thi mang ban dau
    printf("MANG BAN DAU\n");
    for(int i = 0; i < n ; i++){
        printf("%d \t",arr[i]);
    }
    
    //goi ham xoa phan tu truyen vao mang can xoa, so luong phan tu va dia chi can xoa
    XoaPhanTu(arr,n,index);
    //hien thi mang sau khi xoa tai vi tri index = 3
    printf("\nMANG SAU KHI XOA TAI ARR[%d]\n", index);
    for(int i = 0; i < n; i++){
        printf("%d \t",arr[i]);
    }
}

3.Nhập xuất và xóa phần tử trong mảng

Các chương trình trên đều thực hiện ở mảng cố định là int arr[6] = {1,2,3,4,5,6} tuy nhiên ta hoàn toàn có thể nhập xuất các giá trị vào mảng bất kỳ trước rồi mới thực hiện thao tác xóa.

#include <stdio.h>
void Nhap(int arr[], int n){
    //dung vong lap for duyet tu vi tri index thu 0 cho den vi tri n - 1 
    for(int i = 0; i <= n - 1; i++){
        //nhap gia tri va gan vao tung phan tu a[i] cua mang
        printf("NHAP A[%d]: ",i);
        scanf("%d",&arr[i]);
    }
}

void Xuat(int arr[], int n){
    for(int i = 0; i <= n - 1; i++){
        // xuat cac phan tu a[i] co trong mang ra man hinh
        printf("%d \t",arr[i]);
    }
}
void XoaPhanTu(int arr[], int &n, int index){
    //neu dia chi xoa nho hon 0 thi xoa phan tu dau tien
    if(index < 0){
        index = 0;
    }
    //neu dia chi xoa lon hon hoac bang n thi xoa phan tu cuoi cung
    if(index >= n){
        index = n - 1;
    }
    // Dich chuyen mang ve ben trai tu vi tri xoa
    for(int i = index; i < n - 1; i++){
        arr[i] = arr[i+1];
    }
    //sau khi xoa giam so luong phan tu mang
    n--;
}
int main(){
    //hai bao so luong phan tu
    int n;
    printf("NHAP N: ");
    scanf("%d",&n);
    //khai bao mang gom n phan tu
    int arr[n];
    //goi ham nhap
    Nhap(arr,n);
    //xuat mang vua nhap
    printf("\nMANG BAN DAU\n");
    Xuat(arr,n);
    //sau khi mang da duoc nhap khai bao vi tri can xoa
    int index;
    printf("\nNHAP VI TRI CAN XOA: ");
    scanf("%d",&index);
    //goi ham xoa phan tu truyen vao mang can xoa, so luong phan tu va dia chi can xoa
    XoaPhanTu(arr,n,index);
    //hien thi mang sau khi xoa tai vi tri index
    printf("\nMANG SAU KHI XOA TAI ARR[%d]\n", index);
    Xuat(arr,n);
}