[RISOLTO]Esercizio liste

di il
7 risposte

[RISOLTO]Esercizio liste

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

  • Re: [RISOLTO]Esercizio liste

    Il primo problema sono riuscito a risolverlo...manca il secondo...HELP!!!!!!!!!!!!!!!!!!
  • Re: [RISOLTO]Esercizio liste

    Hai modificato il codice? Con quali valori in input provi?
  • Re: [RISOLTO]Esercizio liste

    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
  • Re: [RISOLTO]Esercizio liste

    Qualche idea??
  • Re: [RISOLTO]Esercizio liste

    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.
  • Re: [RISOLTO]Esercizio liste

    Grazie mille veramente sei un grande
    Però rimane il problema del primo elemento da cancellare
  • Re: [RISOLTO]Esercizio liste

    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