Salve ragazzi,
ho un altro problema con le liste.
Questa volta, si tratta dell'eliminazione di un nodo che si trova in mezzo ad una lista dinamica.
Il problema si pone solo quando voglio eliminare un elemento della lista che non sia il secondo (o il primo, ma quello ha un elimina "a parte" visto che devo eliminare in testa).
Per esempio, se io voglio eliminare il terzo elemento della lista, il programma mi elimina sì il terzo, ma mi elimina anche l'elemento in testa.
Se io ho una lista formata da:
2
3
4
5
e voglio eliminare 2 o 3, il programma funziona correttamente. Ma se io voglio eliminare 4, la lista che mi ritorna è:
3
5
eliminando così anche l'elemento in testa alla lista.
Il codice sorgente del programma è:
codice:
//elimina un elemento inserito dall'utente
#include <stdio.h>
#include <iostream>
typedef int E;
struct blocchetto;
typedef blocchetto*L;
typedef struct blocchetto{
E elem;
L next;};
L insert(E e,L l){
L q;
q=(L)malloc(sizeof(blocchetto));
q->elem=e;
q->next=l;
return(q);}
void stampa(L l){
L temp=l;
while(temp!=NULL){
printf("Elemento: %d \n",temp->elem);
temp=temp->next;}}
L eliminaelemento(L l){
int elemento;
L cnc;
printf("Quale elemento vuoi eliminare?\n");
scanf("%d",&elemento);
if(l->elem==elemento){
L tmp=l;
l=l->next;
free(tmp);
return(l);}
while(l->next!=NULL){
if(l->next->elem==elemento){
cnc=l->next;
l->next=l->next->next;
free(cnc);
return(l);}
l=l->next;}}
int main(){
E e; L l;
l=NULL;
char risp[3];
while(strcmp(risp,"no")!=0){
printf("Vuoi inserire un elemento?(si o no) \n");
scanf("%s",&risp);
if(strcmp(risp,"si")==0){
printf("Inserisci elemento: \n");
scanf("%d",&e);
l=insert(e,l);}}
stampa(l);
l=eliminaelemento(l);
printf("NUOVA LISTA:\n");
stampa(l);
free(l);
system("PAUSE");
return(0);}
Il sorgente l'ho postato tutto per completezza, ma bisogna ovviamente focalizzarsi sulla funzione eliminaelemento.
Potreste aiutarmi a trovare l'errore?
Grazie mille in anticipo.