Lista - usuwanie wszystkich elementów

0

Jak zrobić, żeby program usunął wszystkie elementy z listy o wartości np. 1? (Wypełniając listę pięcioma elementami o wartościach np. 1, 1, 3, 5, 10)?
Aktualnie program usuwa pierwszy napotkany element o wartości wskazanej do usunięcia... Zostaje 1, 3, 5, 10 zamiast 3, 5, 10. Wkleję tylko funkcję usun_element, żeby nie zajęło to dużo miejsca.
PS: Dodałem pętlę for(a=5; a!=0; a--){...} w pewnym miejscu, ale nadal nie działa to tak, jak powinno.

	struct Lista *usun_element(struct Lista *q, int x){
		struct Lista *pom, *tmp, *spr;
		int a;
		pom = q;
		for(a=5; a!=0; a--){	
		
		while (pom != NULL && pom -> klucz != x){
			tmp = pom;
			pom = pom->nast;
		}
		
		if(pom!=NULL){
			if(pom == q)
				q = pom -> nast;
			else 
				tmp->nast = pom->nast;
				
			//free(pom);		
		}
		else 
			printf("Elementu %d nie ma w liscie", x);		
	}
	free(pom);
	
	return q;		
	} 
1

Zakłądając, że lista jest ADT, usuwam za pomocą rekurencji:

// helper to remove_all
struct inside_node * rem_nodes(struct inside_node * curr, Linked_list * a_list, int elem) {
	if (!curr) 
		return NULL;
	if (elem == curr->data){
		struct inside_node * tempN;
		tempN = curr->next;
		free(curr);
		a_list->length--;
		if (!tempN)
			return tempN;
		return rem_nodes(tempN, a_list, elem);
		}
	curr->next = rem_nodes(curr->next, a_list, elem);
	return curr;
}

void remove_all(Linked_list * a_list, int elem) {
		a_list->head = rem_nodes(a_list->head, a_list, elem);
}

Cała struktura tutaj: https://github.com/lion137/C_datastructures/tree/master/linked_list

1

Jeśli to lista jednokierunkowa to możesz spróbować coś takiego:

//Funkcja modyfikująca wskaźniki !
//Zwraca ilość usuniętych {0,1}
int usun_node(struct Lista **lista,struct Lista **poprzedni,struct Lista **tmp){
    if(*lista == *tmp){//głowa listy
        *lista = (*tmp)->nast;
        *poprzedni = (*tmp)->nast;
    }else if(*poprzedni == *tmp){//coś jest nie tak
        return 0;
    }else if(*poprzedni != *tmp){//element nie głowa
        (*poprzedni)->nast = (*tmp)->nast;
    }
    free(*tmp);
    *tmp = *poprzedni;
    return 1;
}

//Powodzenie {ilosc_usuniętych}
//Lista pusta {-1}
int usun_elementy(struct Lista **lista,int wartosc){
    struct Lista *tmp = *lista,*poprzedni = *lista;
    int ilosc = 0;

    if(lista == NULL || *lista == NULL)return -1;

    while(tmp != NULL){
        if(tmp->x == wartosc){
            ilosc += usun_node(lista,&poprzedni,&tmp);
            if(tmp == *lista)continue;//głowa, musimy sprwadzać nadal ten sam element
        }else{
            poprzedni = tmp;
        }
        tmp = tmp->nast;
    }
    return ilosc;
}

Może będzie działało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1