Xóa một phần tử ở vị trí thứ k (k nhập từ bàn phím)

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 } }

Drupal Developer having 9+ year experience, implementation and having strong knowledge of technical specifications, workflow development. Ability to perform effectively and efficiently in team and individually. Always enthusiastic and interseted to study new technologies

This entry is part 50 of 69 in the series Học C Không Khó

87 / 100

Hôm nay, Lập trình không khó sẽ cùng các bạn đi giải quyết bài tập “Thêm phần tử trong mảng 1 chiều và xóa phần tử trong mảng 1 chiều” nhé. Đây là 1 bài tập thực hành hơi nâng cao một chút. Nó thường gây ra những khó khăn nhất định cho các bạn lần đầu tiếp xúc. Chúng ta sẽ cùng nhau giải quyết bài toán thêm xóa phần tử trong mảng ngay bây giờ nhé.

Bài này yêu cầu bạn có kiến thức lập trình cơ bản về ngôn ngữ C hoặc C++ nhé. Nếu kiến thức này bạn chưa thực sự vững, hãy tham khảo khóa học lập trình C cơ bản của mình trên Youtube tại đây nhé.

Xây dựng các hàm nhập xuất mảng

Đầu tiên, bạn hãy xử lý xong phần nhập xuất mảng nhé. Chúng ta bắt buộc phải sử dụng nhập/ xuất mảng để sử dụng trong quá trình thêm xóa phần tử mảng.

Code hàm nhập và hàm xuất mảng:

void NhapMang(int a[], int n){

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

        printf("Nhap so thu %d: ", i);

        scanf("%d", &a[i]);

    }

}

void XuatMang(int a[], int n){

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

        printf("%4d", a[i]);

    }

}

Bạn có thể xem hướng dẫn chi tiết phần này tại đây:

  • Hướng dẫn nhập xuất mảng 1 chiều
  • Hướng dẫn nhập xuất mảng 2 chiều

Thêm phần tử vào mảng 1 chiều

Bạn có thể hình dung cách thêm 1 phần tử vào mảng qua hình ảnh dưới đây nhé.

Xóa một phần tử ở vị trí thứ k (k nhập từ bàn phím)
Cách thêm 1 phần tử mới vào mảng

Như vậy, trước khi thực hiện thêm, bạn phải thực hiện lùi tất cả các số phía sau nơi được chèn(bao gồm cả vị trí chèn) về phía sau 1 ô nhớ. Như ảnh trên thì chỉ có số 9 bị ảnh hưởng, bị chuyển từ chỉ số 2 sang 3.

Sau khi dịch chuyển theo mô tả trên, chúng ta chỉ việc gán giá trị cần chèn cho phần tử tại nơi muốn chèn. Và cuối cùng, không quên tăng số lượng phần tử của mảng lên nhé.

Quy trình thêm phần tử vào mảng:

  1. Kiểm tra mảng có thể thêm được phần tử nữa không? Nếu không, thoát hàm
  2. Kiểm tra giá trị pos hợp lệ không. Ở đây nếu không hợp lệ mình cho về chỉ số đầu/cuối.
  3. Thực hiện dịch chuyển mảng(phần phía sau nơi chèn + vị trí chèn)
  4. Chèn vào vị trí cần chèn
  5. Tăng số lượng phần tử

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

void ThemPhanTu(int a[], int &n, int val, int pos){

    // Mang da day, khong the them.

    if(n >= MAX){

        return;

    }

    // Neu pos <= 0 => Them vao dau

    if(pos < 0){

        pos = 0;

    }

    // Neu pos >= n => Them vao cuoi

    else if(pos > n){

        pos = n;

    }

    // Dich chuyen mang de tao o trong truoc khi them.

    for(int i = n; i > pos; i--){

        a[i] = a[i-1];

    }

    // Chen val tai pos

    a[pos] = val;

    // Tang so luong phan tu sau khi chen.

    ++n;

}

Xóa phần tử trong mảng 1 chiều

Bạn có thể hình dung cách xóa 1 phần tử trong mảng qua hình ảnh dưới đây nhé.

Xóa một phần tử ở vị trí thứ k (k nhập từ bàn phím)

Dễ nhận thấy, số lượng phần tử sẽ giảm đi 1. Tuy nhiên, hãy để ý các số từ 67 trở về sau đều bị giảm chỉ số đi 1 đơn vị.

Quy trình xóa phần tử trong mảng:

  1. Kiểm tra có thể xóa hay không? Nếu không => thoát hàm
  2. Kiểm tra giá trị pos hợp lệ không. Ở đây nếu không hợp lệ mình cho về chỉ số đầu/cuối.
  3. Dịch chuyển mảng lùi 1 chỉ số – phần phía sau nơi xóa
  4. Giảm số lượng phần tử

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

void XoaPhanTu(int a[], int &n, int pos){

    // Mang rong, khong the xoa.

    if(n <= 0){

        return;

    }

    // Neu pos <= 0 => Xoa dau

    if(pos < 0){

        pos = 0;

    }

    // Neu pos >= n => Xoa cuoi

    else if(pos >= n){

        pos = n-1;

    }

    // Dich chuyen mang

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

        a[i] = a[i+1];

    }

    // Giam so luong phan tu sau khi xoa.

    --n;

}

Gợi ý cho bạn: Nếu bạn là người đam mê thuật toán và thích giải các bài tập như thế này, hãy tham khảo chuyên mục bài tập c++ nhé.

Full code thêm xóa phần tử trong mảng 1 chiều

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

// Them phan tu vao mang 1 chieu

#include <stdio.h>

#define MAX 1000

void NhapMang(int a[], int n){

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

        printf("Nhap so thu %d: ", i);

        scanf("%d", &a[i]);

    }

}

void XuatMang(int a[], int n){

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

        printf("%4d", a[i]);

    }

}

void ThemPhanTu(int a[], int &n, int val, int pos){

    // Mang da day, khong the them.

    if(n >= MAX){

        return;

    }

    // Neu pos <= 0 => Them vao dau

    if(pos < 0){

        pos = 0;

    }

    // Neu pos >= n => Them vao cuoi

    else if(pos > n){

        pos = n;

    }

    // Dich chuyen mang de tao o trong truoc khi them.

    for(int i = n; i > pos; i--){

        a[i] = a[i-1];

    }

    // Chen val tai pos

    a[pos] = val;

    // Tang so luong phan tu sau khi chen.

    ++n;

}

void XoaPhanTu(int a[], int &n, int pos){

    // Mang rong, khong the xoa.

    if(n <= 0){

        return;

    }

    // Neu pos <= 0 => Xoa dau

    if(pos < 0){

        pos = 0;

    }

    // Neu pos >= n => Xoa cuoi

    else if(pos >= n){

        pos = n-1;

    }

    // Dich chuyen mang

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

        a[i] = a[i+1];

    }

    // Giam so luong phan tu sau khi xoa.

    --n;

}

int main(){

    int a[MAX];

    int n;

    printf("\nNhap so luong phan tu: ");

    scanf("%d", &n);

    NhapMang(a, n);

    XuatMang(a, n);

    printf("\n=======THEM PHAN TU======\n");

    int val, pos;

    printf("\nNhap so can them: ");

    scanf("%d", &val);

    printf("\nNhap vi tri muon chen: ");

    scanf("%d", &pos);

    ThemPhanTu(a, n, val, pos);

    printf("\nMang sau khi them: ");

    XuatMang(a, n);

    printf("\n=======XOA PHAN TU======\n");

    printf("\nNhap vi tri muon xoa: ");

    scanf("%d", &pos);

    XoaPhanTu(a, n, pos);

    printf("\nMang sau khi xoa: ");

    XuatMang(a, n);

    printf("\nDone!");

}

Kết quả chạy thử:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

[email protected]:~/projects$ g++ ThemXoaMang.cpp -o ThemXoaMang

[email protected]:~/projects$ ./ThemXoaMang

Nhap so luong phan tu: 5

Nhap so thu 0: 1

Nhap so thu 1: 2

Nhap so thu 2: 3

Nhap so thu 3: 4

Nhap so thu 4: 5

   1   2   3   4   5

=======THEM PHAN TU======

Nhap so can them: 6

Nhap vi tri muon chen: 1

Mang sau khi them:    1   6   2   3   4   5

=======XOA PHAN TU======

Nhap vi tri muon xoa: 1

Mang sau khi xoa:    1   2   3   4   5