Xóa mảng trong C | Laptrinhcanban.com

HOME › >>

Xóa mảng trong C

Cùng tìm hiểu về cách xóa mảng trong C. Bạn sẽ học được cách xóa 1 phần tử trong mảng C, cách xóa nhiều phần tử trong mảng C, cũng như cách xóa toàn bộ mảng trong C sau bài học này.

Xóa 1 phần tử trong mảng C

Khác với các ngôn ngữ lập trình khác thì mảng trong C có kích thước cố định được quyết định khi khai báo mảng, và chúng ta không thể thay đổi kích thước của mảng sau khi khai báo.

Bởi vậy, chúng ta không thể xóa phần tử trong mảng C, sau khi đã tạo nó. Điều duy nhất chúng ta có thể làm, đó là thay thế giá trị các phần tử cần xóa thành giá trị NULL, và ghi nhớ các phần tử này chưa được sử dụng trong chương trình mà thôi.

Lưu ý giá trị NULL trong C nếu ở dạng char thì là ký tự \0, và nếu ở dạng int thì là số 0. Tuy nhiên về bản chất thì NULL có nghĩa là ký tự rỗng có nghĩa là không tồn tại giá trị.

Xóa 1 phần tử trong mảng C

Chúng ta có thể đơn giản xóa 1 phần tử trong mảng bằng cách này như sau:

/*mảng đã sử dụng hết phần tử*/
int int_arr2[4] = {1,2,3,4}; // 1,2,3,4
int_arr2[2] = NULL; // 1,2,0,4

/*mảng có phần tử chưa sử dụng*/
int int_arr[6] = {1,2,3,4}; // 1,2,3,4,0,0
int_arr[2] = NULL; // {1,2,0,4,0,0}

Tuy nhiên sau khi thay thế phần tử cần xóa bằng giá trị NULL bằng cách ở trên, thì phần tử này sẽ vẫn nằm ở giữa các phần tử khác trong mảng, gây nên bất tiện khi sử dụng mảng. Do vậy chúng ta sẽ cần phải chuyển phần tử này về cuối mảng để dễ sử dụng hơn bằng cách thứ 2 sau đây:

Xóa 1 phần tử trong mảng C

Các bước chúng ta thực hiện sẽ là:

  1. Thay đổi giá trị của tất cả các phần tử từ vị trí cần xóa trong mảng, bằng giá trị của phần tử đứng đằng sau nó.

  2. Thay đổi giá trị của phần tử cuối cùng thành NULL.

Sau khi tiến hành xóa 1 phần tử trong mảng như trên, mảng ban đầu sẽ bao gồm các phần tử còn lại ở đầu mảng, và các phần tử NULL ở cuối mảng.

Nếu bạn muốn lấy các phần tử không bị xóa từ mảng ban đầu, chúng ta đơn giản tạo một mảng mới, sau đó sử dụng vòng lặp để lấy các phần tử chưa bị xoá từ đầu mảng ban đầu là xong.

Và chúng ta viết hàm để thực hiện việc xóa 1 phần tử trong mảng C như sau:

#include <stdio.h>

/*Tạo hàm in phần tử trong mảng*/
void show_array(int array[], int length){
for(short i = 0; i < length; i++) printf("%d ", array[i]);
printf("\n");
}
/*Tạo hàm xóa 1 phần tử trong mảng*/
int delete_one_element_from_array(int array[], int length, int position){
int count = 0;
/* Dịch phần tử về đầu mảng từ vị trí xóa */
for(int i = position; i < length-1; i++) {
array[i] = array[i+1];
}
/*Thay đổi giá trị phần tử cuối cùng thành NULL*/
array[length-1] = 0;

count++;
return count;
}

int main(void){
int array[100], position, length;
printf("Nhap so phan tu: ");
scanf("%d", &length);

printf("Nhap phan tu:\n");
for (int i = 0; i < length; i++)
scanf("%d", &array[i]);

printf("Nhap vi tri xoa: ");
scanf("%d", &position);

printf("Mang truoc khi xoa:\n");
show_array(array,length);

int count= delete_one_element_from_array(array,length, position);
printf("Mang sau khi xoa:\n");
show_array(array,length);

printf("So phan tu bi xoa: %d",count);

/*Tạo một mảng mới để lưu kết quả xóa phần tử từ mảng ban đầu*/
int n = length -count;
int result[n];
for(short i = 0; i < n; i++) result[i] = array[i];
printf("\nMang ket qua:\n");

show_array(result,n);

return 0;
}

Kết quả phép xóa 1 phần tử trong mảng C sẽ như sau:

Nhap so phan tu: 5
Nhap phan tu:
0
1
2
3
4
Nhap vi tri xoa: 3
Mang truoc khi xoa:
0 1 2 3 4
Mang sau khi xoa:
0 1 2 4 0
So phan tu bi xoa: 1
Mang ket qua:
0 1 2 4

Xóa nhiều phần tử trong mảng C

Để xóa nhiều phần tử trong C, chúng ta chỉ cần lặp lại xử lý xóa 1 phần tử trong C ở trên nhiều lần là xong.

Chúng ta sẽ tạo ra thêm một hàm xóa nhiều phần tử trong mảng và kết hợp với hàm xóa 1 phần tử trong mảng ở trên như sau:

#include <stdio.h>

/*Tạo hàm in phần tử trong mảng*/
void show_array(int array[], int length){
for(short i = 0; i < length; i++) printf("%d ", array[i]);
printf("\n");
}
/*Tạo hàm xóa 1 phần tử trong mảng*/
int delete_one_element_from_array(int array[], int length, int position){
int count = 0;
/* Dịch phần tử về đầu mảng từ vị trí xóa */
for(int i = position; i < length-1; i++) {
array[i] = array[i+1];
}
/*Thay đổi giá trị phần tử cuối cùng thành NULL*/
array[length-1] = 0;

count++;
return count;
}

/*Tạo hàm xóa nhiều phần tử trong mảng*/
int delete_elements_from_array(int array[], int length, int positions[], int delete_num){
int n = 0;
int count=0;

for (int i=0; i< delete_num; i++){
int position= positions[i] - count;

n += delete_one_element_from_array(array,length, position);
count++;

}
return n;
}
int main(void){
int array[100], positions[100], length, delete_num;
printf("Nhap so phan tu: ");
scanf("%d", &length);

printf("Nhap phan tu:\n");
for (int i = 0; i < length; i++) scanf("%d", &array[i]);

printf("Nhap so phan tu can xoa: ");
scanf("%d", &delete_num);

printf("Nhap vi tri xoa:\n");
for (int i = 0; i < delete_num; i++) scanf("%d", &positions[i]);

printf("Mang truoc khi xoa:\n");
show_array(array,length);

int count= delete_elements_from_array(array,length, positions,delete_num);
printf("Mang sau khi xoa:\n");

show_array(array,length);
printf("So phan tu bi xoa: %d\n",count);
/*Tạo một mảng mới để lưu kết quả xóa phần tử từ mảng ban đầu*/
int n = length -count;
int result[n];
for(short i = 0; i < n; i++) result[i] = array[i];
printf("Mang ket qua:\n");

show_array(result,n);

return 0;
}

Kết quả phép xoá nhiều phần tử trong mảng C như sau:

Nhap so phan tu: 5
Nhap phan tu:
0
1
2
3
4
Nhap so phan tu can xoa: 2
Nhap vi tri xoa:
1
3
Mang truoc khi xoa:
0 1 2 3 4
Mang sau khi xoa:
0 2 4 0 0
So phan tu bi xoa: 2
Mang ket qua:
0 2 4

Xóa toàn bộ mảng trong C

Sau khi tạo một mảng trong C, có những lúc chúng ta không cần tới mảng đó nữa và muốn xóa nó đi trong chương trình. Nếu trong các ngôn ngữ lập trình khác chúng ta có thể làm điều này rất dễ dàng, ví dụ như sử dụng lệnh delete trong C++ chẳng hạn, thì mọi chuyện lại phức tạp hơn trong ngôn ngữ C. Tùy thuộc vào cách bạn đã tạo ra mảng trong C như thế nào mà chúng ta có thể hoặc không thể xóa mảng trong C.

Thông thường khi tạo mảng trong C, chúng ta sẽ dùng tới cách khai báo hoặc khởi tạo như sau:

int num[4];
char chars[] = "love";

Rất tiếc là với cách tạo mảng như trên, do sau khi tạo mảng này thì một vùng có kích thước cố định với kích thước mảng đã được tạo ra trong bộ nhớ máy tính để lưu mảng, và trong trường hợp này thì chúng ta không thể xóa mảng đã tạo được.

Trường hợp duy nhất mà chúng ta có thể xóa mảng trong C đó là khi chúng ta đã cấp phát bộ nhớ động để lưu mảng đã tạo ra, như các cách sau:

int *A=malloc(20 * sizeof(int));
//or
int *A=calloc(20, sizeof(int));

Nếu bạn đã tạo mảng trong C bằng cách cấp phát bộ nhớ động cho nó, chúng ta có thể dùng hàm free() để giải phóng bộ nhớ động này, và qua đó có thể xóa mảng trong C sau khi tạo nó.

Ví dụ:

int *A=malloc(20 * sizeof(int));
free(A);

Bạn có thể tham khảo cách tạo mảng bằng cách cấp phát bộ nhớ động, và cách xóa mảng sau khi dùng xong tại các ví dụ cụ thể trong các bài dưới đây:

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách xoá mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/mang-trong-c/xoa-mang-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.