[RISOLTO]Esercizio liste

di Anonimizzato16393 il
7 risposte
Devo fare questo esercizio:

Si implementi una lista concatenata che contenga, come dati, interi positivi.
Si implementino anche tre funzioni per:
-Aggiungere un elemento in fondo alla lista;
-Aggiungere un elemento in cima alla lista;

Dato un valore positivo "v", eliminare la prima occorrenza di v nella lista(non modicare la lista nel caso che non contenga v).
Quindi, scrivere un programma che legga degli interi.
Per ogni intero letto(e nello stesso ordine dell'input), si applichi una delle seguenti modiche:
-Se il valore lettove strettamente negativo, rimuovere il primo elemento uguale a "v" dalla lista (non modicare la lista nel caso che questa non lo contenga);
-Se il valore lettove positivo e pari, aggiungerlo in cima alla lista;
-Se il valore lettove positivo e dispari, aggiungerlo in fondo alla lista;
-Se il valore letto e 0, terminare l'esecuzione del programma stampando gli elementi della lista.

io ho fatto questo codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct nod {
	int info;
	struct nod *next;
}nodo;

void addc (nodo **lis,int v){
	nodo *neo=malloc(sizeof(nodo));
	neo->next=*lis;
	neo->info=v;
	*lis=neo;
}

void addf (nodo *lis, int v){
	while ((lis->next)!=NULL){
            lis=lis->next;
	}
	lis->next=malloc(sizeof(nodo));
	lis->next->info=v;
	lis->next->next=NULL;
}

void del (nodo *lis, int v){
	nodo *temp=malloc(sizeof(nodo));
	int t=0;
	if (lis->info==v){
        temp=lis->next;
        free(lis);
        lis=temp;
	}else{
        while (lis->next->info!=v){
            lis=lis->next;
            if (lis->next==NULL){
                break;
            }
            if (lis->next->info==v){
                t=1;
            }
        }
        if (t==1){
            if (lis->next->next!=NULL){
                temp=lis->next->next;
                free(lis->next);
                lis->next=temp;
            }else{
                lis->next=NULL;
            }
        }
	}
}

int main (){
	nodo *lis=malloc(sizeof(nodo));
	int v;
	scanf("%d",&v);
	if (v>0){
        lis->info=v;
        lis->next=NULL;
	}
	while(v!=0){
        scanf("%d",&v);
		if (((v%2)==0)&&(v>0)){
			addc(&lis,v);
		}else if(((v%2)!=0)&&(v>0)){
			addf(lis,v);
		}else if (v<0){
			v=-v;
			del(lis,v);
		}
	}
	while(lis!=NULL){
		printf("%d\n",lis->info);
		lis=lis->next;
	}
	return 0;
}
Ho due problemi:
-non mi cancella i numeri positivi (es. se c'è 2 e poi in input do -2 non me lo cancella)
-non riesco a cancellare il primo elemento della lista sia positivo sia negativo e in output mi da una lista infinita di numeri strani

AIUTATEMI VI PREGO tra un po' ho l'esame e vorrei essere pronto su tutto al 100%

grazie in anticipo.

7 Risposte

  • Il primo problema sono riuscito a risolverlo...manca il secondo...HELP!!!!!!!!!!!!!!!!!!
  • Hai modificato il codice? Con quali valori in input provi?
  • Nuovo codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct nod {
    	int info;
    	struct nod *next;
    }nodo;
    
    void addc (nodo **lis,int v){
    	nodo *neo=malloc(sizeof(nodo));
    	neo->next=*lis;
    	neo->info=v;
    	*lis=neo;
    }
    
    void addf (nodo *lis, int v){
    	while ((lis->next)!=NULL){
            lis=lis->next;
    	}
    	lis->next=malloc(sizeof(nodo));
    	lis->next->info=v;
    	lis->next->next=NULL;
    }
    
    void del (nodo *lis, int v){
    	nodo *temp=malloc(sizeof(nodo));
    	int t=0;
    	if (lis->info==v){
            temp=lis->next;
                                                                      //ho tolto free(lis) per non avere la lista di numeri
            lis=temp;
    	}else if (lis->next==NULL){
            t=2;
    	}else{
            while (lis->next->info!=v){
                lis=lis->next;
                if (lis->next==NULL){
                    t=2;
                    break;
                }
                if (lis->next->info==v){
                    t=1;
                }
            }
            if ((t==0)||(t==1)){
                    temp=lis->next->next;
                    free(lis->next);
                    lis->next=temp;
            }
    	}
    }
    
    int main (){
    	nodo *lis=malloc(sizeof(nodo));
    	int v;
    	scanf("%d",&v);
    	if (v>0){
            lis->info=v;
            lis->next=NULL;
    	}
    	while(v!=0){
            scanf("%d",&v);
    		if (((v%2)==0)&&(v>0)){
    			addc(&lis,v);
    		}else if(((v%2)!=0)&&(v>0)){
    			addf(lis,v);
    		}else if (v<0){
    			v=-v;
    			del(lis,v);
    		}
    	}
    	while(lis!=NULL){
    		printf("%d\n",lis->info);
    		lis=lis->next;
    	}
    	return 0;
    }
    
    in questa maniera non mi da la listona dei numeri...solo che non mi cancella il dato
    E poi un altro errore che mi sono accorto: se do in input un valore negativo e subito dopo un altro input (qualsiasi) si blocca senza farmi inserire nulla.

    in input do:
    -per il primo problema --> 2/5/6/7/-6/0 e mi restituisce la lista con il 6 (che dovrebbe eliminare)
    -per il secondo problema --> -3/3 e si ferma senza dare nessun output e senza farmi inserire valori da tastiere
  • Qualche idea??
  • nodo *lis=malloc(sizeof(nodo));
       int v;
       scanf("%d",&v);
       if (v>0){
            lis->info=v;
            lis->next=NULL;
       }
       while(v!=0){....................
    Se inserisci per primo un numero negativo la lista rimane non inizializzata. list->next non punta a NULL. Attenzione. Anche se tu non metterai mai un numero negativo e bene pensare a tutti i casi. Sposterei lis->next = NULL prima del if per togliee ogni dubbio.
  • Grazie mille veramente sei un grande
    Però rimane il problema del primo elemento da cancellare
  • Risolto...per chi avesse il mio stesso problema --->> se devo cancellare il primo nodo non entro nella funzione ma lo faccio direttamente nel main (anche se non penso sia la maniera più corretta dato l'esercizio)
Devi accedere o registrarti per scrivere nel forum
7 risposte