01/10/2018, 16:14

Hàm xóa giá trị trùng lặp trong mảng

Mình dùng ngôn ngữ C. Ý tưởng của mình là khi nhập một mảng có nhiều số trùng lặp thì nó sẽ xóa đi những số trùng lặp đó, không những một mà có thể n số trùng lặp.
Ví dụ: dãy mình nhập là: A = {6,5,9,4,9,8,9} sau khi thực hiện sẽ là A = {6,5,4,8}
Nhưng sau khi Run thì nó chỉ xóa đi một phần tử đầu tiến nó gặp (Ví dụ như 9) và giữ nguyên các số trùng lặp còn lại.
Cho mình hỏi tại sao và code sai ở điểm nào? Mình xin cảm ơn!

for(i=1;i<*n;i++) if(value==a[i]) count++;
	for(i=1;i<=count;i++)
	{
		flag = 1;
		for (i=1;i<*n && flag == 1;i++){
            if(value==a[i]){
                vt=i;
                flag = 0;
            }
		}
		for (i=vt;i<=*n;i++){
			a[i]=a[i+1];
		}
		(*n)--;
	}
for (c = 1; c < *(n); c++) printf("%d
", a[c]);
Trần Hoàn viết 18:15 ngày 01/10/2018

Đoạn code này mình chẳng hiểu thuật toán của bạn là sao.
value? count?
Mà bạn nhớ là trong C, chỉ số bắt đầu từ 0, nên phải in từ c = 0 nhé

Đặng Huỳnh Anh viết 18:29 ngày 01/10/2018

Cảm ơn bạn đã Replay. Bài của mình là như sau, nhập một mảng giá trị A cho đến khi nào A = 0 thì dừng lại, bao nhiêu số A thì bấy nhiêu phần tử n. (n mình quy định là n = 1) Rồi sau đó chạy thuật toán trên, đầu tiên mình cho chạy để tìm kiếm những giá trị trùng lặp mà mình muốn xóa, như A = {1,5,3,6,5,5} như vậy sau khi chạy count = 3 do có 3 con 5.
Sau đó nó sẽ chạy đoạn code từ i = 1 đến count, sau đó nó sẽ thực hiện đến 3 lần count để 3 lần xóa 5. Code đầy đủ của mình là:

#include <stdio.h>

void Nhap(int *a, int *n){
    int c;
    do{
        printf("\na[%d] = ",*n);
        scanf("%d", &c);
        if(c!=0){
            a[(*n)++] = c;
        }
    }while(c!=0);

}

void Remove(int *a, int *n){
    int c,vt,i,value,count=0,flag;
    printf("\nNumber = ");
    scanf("%d", &value);
    for(i=1;i<*n;i++) if(value==a[i]) count++;
    for(i=1;i<=count;i++)
    {
    flag = 1;
    for (i=1;i<*n && flag == 1;i++){
            if(value==a[i]){
                vt=i;
                flag = 0;
            }
    }
    for (i=vt;i<=*n;i++){
        a[i]=a[i+1];
    }
    (*n)--;
    }
    for (c = 1; c < *(n); c++)
    printf("%d\n", a[c]);
}
int main(){
    int n = 1, a[100];
    Nhap(a,&n);
    Remove(a,&n);
    return 0;
}
Triệu Kma viết 18:24 ngày 01/10/2018

code khó hiểu quá bác ơi. Nếu bác cần xóa tất cả giá trị trùng lặp thì bác dùng 2 vòng for. Tương tự như này

for(i=0,i<lengthArray;i++){
for(j=i+1;j<lengthArray;j++){
if(array[i]==array[j]){                 /// trùng nhau 
// delete phần tử tại vị trí thứ j
}}}

Còn nếu bác muốn xóa 1 phần tử của mảng có giá trị cho trước thì bác dùng kiểu này

int flag=0;
int gia_tri_can_xoa=....;
for(i=0,i<lengthArray;i++){
if(array[i]==gia_tri_can_xoa && flag==1){                 /// trùng nhau 
// delete phần tử tại vị trí thứ i
}else if(array[i]==gia_tri_can_xoa){
flag=1;
}
Bài liên quan
0