1.Cách thêm một phần tử vào giữa danh sách

Tôi sẽ sử dụng lại danh sách mảng gồm các giá trị: 1,2,3,4,5,6,7,8,9,10,11 (hình minh họa bên dưới)

Vấn đề lần này của tôi là cần chèn một số X vào một vị trí P bất kỳ nào đó trong danh sách (xem hình minh họa bên dưới)

Để thực hiện được việc này tôi cần thực hiện ba bước:

  • Bước đầu tiên: Dồn tất cả các phần tử từ vị trí P đến cuối sang phải một vị trí:

  • Bước thứ hai: Đặt X vào vị trí trống:

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

2.Hàm thêm một phần tử vào giữa danh sách

2.1 Xây dựng hàm chèn giữa

Hàm void ChenGiua(DSKe &ds, int x, int p) duới đây nhận tham chiếu đầu vào là DSKe &ds và số nguyên int x (chính là phần tử cần chèn vào giữa danh sách). Ngoài ra cần chuyền vào một tham số là int p để xác định vị trí sẽ chèn x vào đó:

void ChenGiua(DSKe &ds, int x, int p){
   //neu vi tri p bang 0 thi thuc hien chen dau
   if (p==0){
      //ham chen dau
      ChenDau(ds,x);
   }
   else if (p==ds.n){ // nguoc lai vi tri p bang ds.n thi thuc hien chen cuoi
      //ham chen cuoi
      ChenCuoi(ds,x);
   }else{
      //kiem tra rong thi khong chen
      if (KiemTraDay(ds)==1){
         return;
      }
      //dich chuyen phan tu tu vi tri p sang ben phai
      for (int i=ds.n; i>p; i--){
         ds.A[i] = ds.A[i-1];
      }
   ds.A[p] = x; // Chen X vao vi tri p
   ds.n += 1; // tang phan tu trong danh sach len 
   }
}

Chú ý:

  • Hàm ChenGiua() 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 chèn vào giữa dánh sách sẽ làm thay đổi lại các phần tử có trong danh sách ban đầu.
  • Nếu vị trí p = 0 thì tương đương với việc chèn đầu
  • Nếu vị trí p = ds.n thì tương đương với việc chèn cuối

2.2 Chương trình hoàn chỉnh sử dụng hàm chèn giữa vào danh sách

Chương trình dưới đây nêu ra đầy đủ các hàm (hay các nội dung cần thiết) để thực hiện việc chèn một giá trị vào vị trí P giữa danh sách kề sử dụng mảng. Lưu ý rằng hàm chèn giữa này cần sự có mặt của cả hàm chèn đầu và chèn cuối.

#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 ChenDau(DSKe &ds, int x){
   //neu danh sach da day thi khong thuc hien chen
   if (KiemTraDay(ds)==1){
      return;
   }
   //kiem tra dieu kien trong danh sach co phan tu thi dich chuyen sang phai
   if (ds.n>0){
      //Dich chuyen cac phan tu
      for (int i = ds.n; i>=1; i--){
         ds.A[i] = ds.A[i-1];
      }
   }
   ds.A[0] = x; //Chen phan tu dau tien bang X
   ds.n = ds.n+1; //tang so luong phan tu trong danh sach len 
}

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 ChenGiua(DSKe &ds, int x, int p){
   //neu vi tri p bang 0 thi thuc hien chen dau
   if (p==0){
      //ham chen dau
      ChenDau(ds,x);
   }
   else if (p==ds.n){ //neu vi tri p bang ds.n thi thuc hien chen cuoi
      //ham chen cuoi
      ChenCuoi(ds,x);
   }else{
      //kiem tra day thi khong chen
      if (KiemTraDay(ds)==1){
         return;
      }
      //dich chuyen phan tu tu vi tri p sang ben phai
      for (int i=ds.n; i>p; i--){
         ds.A[i] = ds.A[i-1];
      }
   ds.A[p] = x; // Chen X vao vi tri p
   ds.n += 1; // tang phan tu trong danh sach len 
   }
}

int main(){
   //khai bien ds co kieu DSKe
   DSKe ds;
   //dua ds vao ham khoitao
   KhoiTao(ds);
   //khai bao bien x can chen giua co gia tri la 55
   int x = 55;
   //khai bao vi tri p can chen
   int p = 6;
   //Chen x vao giua danh sach
   ChenGiua(ds,x,p);
}