Xóa phần tử có trong mảng danh sách kề trong C/C++ – Lập Trình Từ Đầu

1. Cách xóa phần tử trong list

Với list khởi đầu là một mảng gồm có những phần tử : 1,2,3,4,5,6,7,8,9,10,11 ( hình bên dưới )

Để triển khai việc xóa một phần tử bất kể có trong list tôi cần triển khai 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

  • 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í:

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

2. Hàm xóa một phần tử trong list

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ẽ triển khai di dời toàn bộ những 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
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 hảo sử dụng hàm xóa phần tử trong list

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 
#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){
      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
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