Thứ Bảy, 4 tháng 5, 2024

34. Chèn và xóa phần tử trong mảng trong C ++

Trong khi khởi tạo một mảng, chúng ta có thể làm sai, có thể cần phải xóa một phần tử nào đó, cũng có thể cần phải chèn thêm một phần tử vào giữa các phần tử khác...

Trong những trường hợp như vậy, chúng ta cần  phải có cơ chế để chèn và xóa các phần tử trong mảng.

Trong thức tế ví dụ khi bạn  thêm một số điện thoại của ai đó vào danh bạ trên điện thoại, bạn sẽ nhập thông tin vào. Nếu vì một lý do nào đó, bạn sẽ cần phải xóa một cái tên trong danh bạ, bạn chỉ việc đánh dấu chon và bấm nút "Xóa"...Và việc xóa thật sự phần tử nào đó trong mảng danh bạ của bạn sẽ do những dòng lệnh phía sau đảm nhiệm.

Xóa Phần Tử Trong Mảng

Đặt vấn đề : Cho mảng A[] gồm N phần tử, hãy xóa phần tử ở chỉ số K trong mảng (Lưu ý là chỉ số, không phải thứ tự. Phần tử thứ nhất có chỉ số là 0, phần tử thứ hai có chỉ số là 1...)

Ví dụ A[] = {45, 23, 32, 72, 67, 56, 12} và K = 3 thì mảng sau khi xóa sẽ là {45, 23, 32, 67, 56, 12}.  

Lưu ý: Việc xóa sẽ không giống việc ta bôi đen một phần tử nào đó và bấm nút xóa, hay ra một lệnh xóa. Việc xóa một phần tử trong mảng sẽ là việc dịch chuyển mảng lùi 1 chỉ số – phần phía sau (bên phải) nơi xóa.
Nói cách khác, ta dịch chuyển toàn bộ các phần tử bên phải từ chỉ số K + 1 tới chỉ số N - 1 sang trái. Sau đó giảm N đi 1 đơn vị vì bạn vừa xóa 1 phần tử trong mảng. 

Trong hình bên dưới các phần tử bên phải từ vị trí có chỉ số K+ 1 =4, tức là các phần tử 67, 56 và 12




Chúng ta sẽ dùng IDE Online để viết code

 

1/Chúng ta sẽ không cần viết hàm trong ví dụ này. Mọi câu lệnh sẽ nằm trong hàm main()
2/Đầu tiên ta viết lệnh

    #include <iostream>
 
    using namespace std;




3/Tiếp theo là hàm main

    int main() {
     
        return 0;
    }
     


4/Bấm Run để chạy thử, thấy mọi thứ đều ổn thì mới tiếp tục. 



5/Mảng của chúng ta có 7 phần tử nên n sẽ bằng 7. Ta muốn xóa phần tử có k=3. Vậy ta sẽ khai báo hai biến kiểu int là n và k, ta sẽ khai báo trên cùng một dòng, cách nhau bằng dấu phẩy. Tất cả đều nằm trong main().

int n = 7, k = 3;

6/Bấm Run để chạy thử

 


 

7/Ta sẽ tiếp tục khai báo và khởi tạo mảng a gồm 7 phần tử, có kiểu dữ liệu là số nguyên int:

int a[7] = {45, 23, 32, 72, 67, 56, 12};

8/Bấm Run để chạy thử

 


 

9/Bây giờ để xóa phần tử tại chỉ số K, ta không thật sự xóa phần tử đó, hình dung là chúng ta sẽ kéo phần tử bên phải phần tử có chỉ số K về bên trái "nằm đè lên" phần tử tại chỉ số K. Các phần tử khác bên trái cũng dịch về phải tương ứng. 

10/Ta sẽ sử dụng vòng lặp For cho việc dịch chuyển. Cứ duyệt tới mỗi phần tử trong mảng, bắt đầu từ chỉ số K, ta Tăng chỉ số của phần tử đó 1 đơn vị, tức là gán giá trị phần tử bên phải cho phần tử bên trái.

Đây là code cho việc dich chuyển:

 

 for(int i = k; i < n - 1; i++){
        a[i] = a[i + 1];
    }


Ví dụ khi duyệt tới phần tứ a[7] thì ta sẽ Gán giá trị của a[8] vào, tương đương với việc phần tử a[8] dịch qua vị trí a[7]

Nhập code trên vào và bấm Run chạy thử 

 


11/Sau khi xóa, hay dịch qua trái như vậy, số phần tử của mảng sẽ bị trừ đi 1. Ta có code sau

--n;


12/Cuối cùng ta cần in toàn bộ mảng. Ta dùng vòng lặp For. Đây là code của chương trình

#include <iostream>
 
using namespace std;

int main(){
    int n = 7, k = 3;
    int a[7] = {45, 23, 32, 72, 67, 56, 12};
    for(int i = k; i < n - 1; i++){
        a[i] = a[i + 1];
    }
    --n;
    cout <<"Mang sau khi xoa : " << endl;
    for(int i = 0; i < n; i++){
        cout << a[i] << endl;
    }
    return 0;
}

Bấm Run để chạy:

Vậy là ta đã có thể xóa phần tử tại vị trí có chỉ số là K.


Chèn Một Phần Tử Vào Trong Mảng

Khi ta đã nắm nguyên tắc để Xóa một phần tử trong mảng thì ta cũng có thể hình dung việc chèn thêm một phần tử.

Đặt vấn đề : Cho mảng A[] gồm N phần tử, hãy chèn thêm một phần tử có giá trị X ở vị trí chỉ số K trong mảng (Lưu ý là chỉ số, không phải thứ tự. Phần tử thứ nhất có chỉ số là 0, phần tử thứ hai có chỉ số là 1...)

Ví dụ A[] = {45, 23, 32, 72, 67, 56, 12} và K = 3, X=100 thì mảng sau khi xóa sẽ là {45, 23, 32, 67, 56, 12}.  


Chúng ta sẽ dùng IDE Online để viết code

 

1/Chúng ta sẽ không cần viết hàm trong ví dụ này. Mọi câu lệnh sẽ nằm trong hàm main()
2/Đầu tiên ta viết lệnh

    
#include <iostream>
 
    using namespace std;




3/Tiếp theo là hàm main

    int main() {
     
        return 0;
    }
     


4/Bấm Run để chạy thử, thấy mọi thứ đều ổn thì mới tiếp tục. 



5/Việc khai báo tiếp theo tương tự như phần trên, chỉ có một khác biệt là ta cần thêm một biến x có giá trị bằng 100. Mảng của chúng ta có 7 phần tử nên n sẽ bằng 7. Ta muốn chèn phần tử vào vị trí có k=3. Vậy ta sẽ khai báo ba biến kiểu int là n, x và k, ta sẽ khai báo trên cùng một dòng, cách nhau bằng dấu phẩy. Tất cả đều nằm trong main().

int n = 7, k = 3, x = 100;

6/Bấm Run để chạy thử

 


 

7/Cần lưu ý là sau khi xóa, hay dịch qua trái như vậy, số phần tử của mảng sẽ bị trừ đi 1. Ta có code sau

--n;

Tuy nhiên ở đây chúng ta cần dịch qua phải, vì vậy số phần tử sẽ cộng thêm 1. Ta có code sau

++n;

8/Ta sẽ sử dụng For để dịch chuyển các phần tử qua phải. Đây là code, lưu ý là ta khai báo mảng a[10] vì ta cần chèn thêm phần tử.

#include <iostream>
 
 using namespace std;


int main(){
    int n = 7, k = 3, x = 100;
    int a[10] = {45, 23, 32, 72, 67, 56, 12};
    for(int i = n - 1; i >= k; i--){
        a[i + 1] = a[i];
    }
    
    ++n;
    
    return 0;
}


9/Bấm Run để chạy thử

 



10/Gán giá trị x=100 vào phần tử a[k] bằng lệnh

a[k] = x;

11/Cuối cùng dùng lệnh cout để kiểm tra

Đây là code

 

#include <iostream>
 
using namespace std;


int main(){
    int n = 7, k = 3, x = 100;
    int a[10] = {45, 23, 32, 72, 67, 56, 12};
    for(int i = n - 1; i >= k; i--){
        a[i + 1] = a[i];
    }
    a[k] = x;
    ++n;
    cout <<"Mảng sau khi đã chèn  : " << endl;
    for(int i = 0; i < n; i++){
        cout << a[i] << endl;
    }
    
    return 0;
}
 

 

Kết quả

 


 

Phần tiếp theo


Phần trước

Không có nhận xét nào:

Đăng nhận xét