minomic ha scritto:
Mentre aspettavo la tua risposta avevo preparato il codice completo (a meno di qualche mia svista, sempre possibile!). Provo a postartelo, così lo guardi e ci fai sapere se hai qualche dubbio.
#include <stdio.h>
#include <stdlib.h>
typedef struct nodo_t {
int val;
struct nodo_t* next;
} Nodo;
typedef Nodo* Lista;
Lista aggiungi_testa(Lista L, int n_val) {
Nodo* nuovo_nodo = malloc(sizeof(Nodo));
nuovo_nodo->val = n_val;
nuovo_nodo->next = L;
return nuovo_nodo;
}
void stampa_lista(Lista l) {
for(; l; l = l->next) {
printf("%d ", l->val);
}
printf("\n");
}
Lista elimina_valore(Lista L, int elim) {
if(L == NULL) return L;
Nodo* tmp;
// eliminazione in testa
if(L->val == elim) {
tmp = L->next;
free(L);
return tmp;
}
Lista copia = L;
while(copia->next && copia->next->val != elim) {
/* se il seguente non ha un seguente
* abbiamo finito: l'elemento non e'
* presente nella lista */
if(!copia->next->next)
return L;
copia = copia->next;
}
tmp = copia->next;
copia->next = copia->next->next;
free(tmp);
return L;
}
int main(int argc, char const *argv[])
{
Lista L = NULL;
int i;
for(i=0; i<10; ++i) {
L = aggiungi_testa(L, i);
}
stampa_lista(L);
L = elimina_valore(L, 5);
stampa_lista(L);
L = elimina_valore(L, 11);
stampa_lista(L);
L = elimina_valore(L, 0);
stampa_lista(L);
L = elimina_valore(L, 9);
stampa_lista(L);
return 0;
}
Nota: in questa versione semplice viene cancellato solo il primo nodo che coincide con il valore da eliminare. Se invece vuoi cancellarli tutti, allora dovrai fare qualche piccola modifica.
Grazie ma forse mi sono spiegato male io, il mio è un problema un po' diverso, la lista io la carico da file e tramite input da tastiera devo permettere la rimozione di numeri complessi nel formato "z"(stringa) "x"(double) "y"(double) già presenti nella lista e l'inserimento di nuovi numeri dello stesso formato.Il problema su cui mi sono bloccato è che le mie funzioni, per l'eliminazione sia del primo elemento che per gli altri elementi generici non funzionano, a me la logica sembra corretta ma a quanto pare non riesco a far puntare i puntatori dove voglio e inoltre il codice mi compila senza errori quindi non so neanche dove cercare gli errori.
Ti mando il codice che ho modificato:
void rimuovi_da_lista(p_elemento *p_lista)
{
p_elemento temp = *p_lista;
fp = fopen("lista.txt", "a");
printf("Inserisci il numero da cancellare\n");
scanf("%s %lg %lg", id, &reale, &immaginario);
if((strcmp(temp->next->id, id) == 0) && (temp->next->reale == reale) &&(temp->next->immaginario == immaginario)) {
*p_lista = temp->next;
free(temp);
}
else
{
while((strcmp(temp->next->id, id) != 0) && (temp->next->reale != reale) &&(temp->next->immaginario != immaginario) && temp->next != NULL)
temp->next = temp->next->next;
}
fclose(fp);
}