Chuyển đến phần nội dung

Xóa phần tử trong mảng c++

Video giải thích chi tiết về Xóa phần tử theo vị trí trong mảng, xóa phần tử theo điều kiện trong mảng một chiều trong lập trình C | Tự học lập trình C

Nội dung chính

  • Video giải thích chi tiết về Xóa phần tử theo vị trí trong mảng, xóa phần tử theo điều kiện trong mảng một chiều trong lập trình C | Tự học lập trình C
  • Hàm Thêm vào mảng một giá trị x tại vị trí vt (kiểm tra tính hợp lệ của vt)
  • Hàm Xóa khỏi mảng một giá trị x
  • 2.1 Xây dựng hàm xóa phần tử
  • 2.2 Chương trình hoàn chỉnh sử dụng hàm xóa phần tử trong danh sách
  • Video liên quan

#include “stdio.h”
#include “limits.h”
int a[100];
int n; void nhapMang(int x[100], int &n){ printf(“Nhap vao so luong phan tu: “); scanf(“%d”, &n); for(int i=0; i<n; i++){ printf(“Nhap x[%d]:”, i); scanf(“%d”, &x[i]); }
} void xuatMang(int x[100], int n){ printf(“Gia tri cua mang la: “); for(int i=0; i<n; i++){ printf(“%d “, x[i]); }
} void xoaMangTaiViTri(int x[100], int &n, int vi_tri){ // 1 2 3 4 5 // 1 2 4 5 for(int i=vi_tri; i<n-1; i++){ x[i] = x[i+1]; } n–; } void xoaMangTheoGiaTri(int x[100], int &n){ int gt; printf(“Nhap vao gia tri can xoa: “); scanf(“%d”, &gt); for(int i=0; i<n; i++){ if(x[i]==gt) xoaMangTaiViTri(x, n, i); }
} int main(){ nhapMang(a, n); xuatMang(a, n); printf(“\n”); xoaMangTheoGiaTri(a, n); printf(“\n”); xuatMang(a, n);
}

Code c:

int XoaX(int a[], int
&n,int x) {

            int i, j;

            int dem=0;

            for(i=0; i<n; i++) {

                        if(a[i] == x) {

                                    for(j=i; j<n-1; j++) {

                                                a[j] = a[j+1];

                                    }

                                    dem++;

                                    n–;

                                    i–;

                        }

            }

            if(dem == 0)

                        return -1;

}

Trong các bài viết trước chúng ta đã làm quen với các kiến thức về mảng một chiều. Các bạn có thể xem lại các bài viết này ở link bên dưới. Hôm nay chúng ta tiếp tục làm quen với thao tác, thêm, xóa phần tử trên mảng.

Hàm Thêm vào mảng một giá trị x tại vị trí vt (kiểm tra tính hợp lệ của vt)

  • Kiểm tra nếu k ∈[0, n] thì:
    • Dời các phần tử từ vị trí n-1 đến k lùi lại 1 vị trí.
    • Thêm x vào vị trí thứ k của mảng, tăng n thêm 1.

void ThemPhanTu(int a[], int &n, int x, int vt)
{
if(vt>=0 && vt<=n)
{
for(int i=n; i>vt; i–)
a[i] = a[i-1]; //Dịch các phần tử sang phải 1 vị trí
a[vt]=x; //Thêm x vào vị trí vt
n++; //Tăng số phần tử lên 1
}
else
printf(“\nVi tri %d khong hop le.”, vt);
}

Hàm Xóa khỏi mảng một giá trị x

Để xóa một phần tử trong mảng ta phải Kiểm tra nếu x có tồn tại trong mảng thì:

  • Dời các phần tử sau x tới 1 vị trí.
  • Giảm n bớt 1.

int TimPhanTu(int a[], int n, int x)
{
for(int i=0; i<n; i++)
if(a[i] == x)
return i; //Tìm thấy x tại vị trí thứ i
return -1; //Không tìm thấy x trong mảng
}
//=======================================================================
void XoaPhanTu(int a[], int &n, int x)
{
int vt=TimPhanTu(a, n, x); //Tìm vị trí x trong mảng
if(vt==-1)
printf(“\nKhong tim thay phan tu %d muon xoa.”, x);
else
{
for(int i=vt; i<=n-2; i++)
a[i] = a[i+1]; //Dịch các phần tử sang trái 1 vị trí
n–; //Giảm số phần tử bớt 1
}
}

Với danh sách ban đầu là một mảng bao gồm các phần tử: 1,2,3,4,5,6,7,8,9,10,11 (hình bên dưới)

Xóa phần tử trong mảng c++

Để thực hiện việc xóa một phần tử bất kỳ có trong danh sách tôi cần thực hiện hai bước sau:

  • Bước đầu tiên: Xác định vị trí P chính là vị trí phần tử cần xóa trong danh sách

Xóa phần tử trong mảng c++

  • Bước thứ hai: Dịch chuyển tất cả các phần tử từ vị trí cần xóa đến cuối sang trái 1 vị trí:

Xóa phần tử trong mảng c++

  • Bước thứ ba: Giảm số lượng phần tử trong danh sách đi 1 đơn vị

2.1 Xây dựng hàm xóa phần tử

Hàm void XoaPhanTu(DSKe &ds, int p) duới đây nhận đầu vào là tham chiếu DSKe &ds chính là danh sách cần xóa đi 1 phần tử và tham số thứ hai là vị trí phần tử cần xóa là int p.

Hàm này sẽ thực hiện dịch chuyển tất cả các phần tử từ vị trí cần xóa đến cuối sang trái 1 vị trí:

void XoaPhanTu(DSKe &ds, int p){
//Kiem tra vi tri phan tu hop le
if (ds.n <= 0 || p < 0 || p >= ds.n){
printf(“Danh sach khong chua phan tu!”);
return;
}
//Dich chuyen cac phan tu o vi tri xoa sang ben trai 1 don vi
for (int i=p; i<ds.n-1; i++){
ds.A[i] = ds.A[i+1];
}
//giam so luong phan tu trong danh sach
ds.n = ds.n – 1;
}

Chú ý:

  • Hàm XoaPhanTu() cũng nhận tham chiếu DSKe &ds bởi vì ta mong muốn rằng sự thay đổi của danh sách khi phần tử được xóa sẽ làm thay đổi lại các phần tử có trong danh sách ban đầu.

2.2 Chương trình hoàn chỉnh sử dụng hàm xóa phần tử trong danh sách

Trước khi thực hiện xóa phần tử trong danh sách, ta cần đảm bảo rằng trong danh sách đã có phần tử. Vì thế tôi sẽ thêm một số phần tử vào danh sách trước bằng cách gọi hàm void ChenDau(ds,x)

Sau đó thực hiện gọi hàm void XoaPhanTu(ds,p) tại vị trí p trong danh sách:

#include <stdio.h>
#define MAX 100 //dinh nghia so luong phan tu cua mang co the luu tru
typedef struct DSKe{
//mang int a voi kich thuoc MAX = 100
int A[MAX];
//quan ly so luong N phan tu
int n;
}DSKe;
//khai bao ham khoi tao
void KhoiTao(DSKe &ds){
//ban dau danh sach la rong (n = 0)
ds.n = 0;
}
int KiemTraRong(DSKe ds){
//neu ds.n == 0 thi rong
if (ds.n==0){
return 1;
}
return 0;
}
int KiemTraDay(DSKe ds){
//neu ds.n == MAX thi da day
if (ds.n == MAX){
return 1;
}
return 0;
}
void ChenCuoi(DSKe &ds, int x){
//neu day thi khong duoc phep chen
if (KiemTraDay(ds)==1){
return;
}
//truy cap vao phan tu cuoi cung cua danh sach va chen X vao
ds.A[ds.n]=x;
//tang phan tu trong danh sach len
ds.n += 1;
}
void DuyetDS(DSKe ds){
//duyet tu phan tu dau tien
int p = 0;
//chua den dia chi cuoi cung trong danh sach thi tiep tuc duyet
while (p<ds.n){
//Xu ly cac phan tu duoc xet
printf(“%d “,ds.A[p]);
//tang den vi tri den phan tu tiep theo trong danh sach
p++;
}
}
void XoaPhanTu(DSKe &ds, int p){
//Kiem tra vi tri phan tu hop le
if (ds.n <= 0 || p < 0 || p >= ds.n){
printf(“Danh sach khong chua phan tu!”);
return;
}
//Dich chuyen cac phan tu o vi tri xoa sang ben trai 1 don vi
for (int i=p; i<ds.n-1; i++){
ds.A[i] = ds.A[i+1];
}
//giam so luong phan tu trong danh sach
ds.n = ds.n – 1;
}
int main(){
//khai bien ds co kieu DSKe
DSKe ds;
//dua ds vao ham khoitao
KhoiTao(ds);
//nhap N so luong phan tu cua danh sach can chen
int n;
printf(“Nhap N: “);
scanf(“%d”, &n);
//nhap gia tri cho tung phan tu X
for(int i = 0; i < n; i++){
int x;
printf(“Nhap phan tu thu [%d] trong danh sach: “,i);
scanf(“%d”,&x);
//chen gia tri cua cac phan tu vao danh sach theo cach chen cuoi
ChenCuoi(ds,x);
}
//goi ham duyet danh sach
printf(“\nDANH SACH BAN DAU\n”);
DuyetDS(ds);
//nhap vi tri can xoa
int p;
printf(“\nNhap vi tri can xoa: “);
scanf(“%d”, &p);
//goi ham xoa
XoaPhanTu(ds,p);
//danh sach sau khi xoa phan tu tai vi tri p
printf(“\nDANH SACH SAU KHI XOA PHAN TU TAI VI TRI %d \n”, p);
//goi ham duyet
DuyetDS(ds);
}

Nhap N: 11

Nhap phan tu thu [0] trong danh sach: 1

Nhap phan tu thu [1] trong danh sach: 2

Nhap phan tu thu [2] trong danh sach: 3

Nhap phan tu thu [3] trong danh sach: 4

Nhap phan tu thu [4] trong danh sach: 5

Nhap phan tu thu [5] trong danh sach: 6

Nhap phan tu thu [6] trong danh sach: 7

Nhap phan tu thu [7] trong danh sach: 8

Nhap phan tu thu [8] trong danh sach: 9

Nhap phan tu thu [9] trong danh sach: 10

Nhap phan tu thu [10] trong danh sach: 11

DANH SACH BAN DAU

1 2 3 4 5 6 7 8 9 10 11

Nhap vi tri can xoa: 5

DANH SACH SAU KHI XOA PHAN TU TAI VI TRI 5

1 2 3 4 5 7 8 9 10 11

Lên trên