Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    27

    [C]Esercizio con Liste

    Salve a tutti...
    Devo fare un esercizio con le liste che consiste nel cancellare tutti i numeri pari della lista.
    In pratica se ho una lista di questo genere:
    6 3 2 1
    Deve risultare:
    3 1
    Il secondo consiste nel, date due liste, vedere se un elemento della lista 1 appartiene alla lista 2.
    Chi mi puo' aiutare?
    Primo: (nn ho proprio idea di dove partire per cancellare un elemento)
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    using namespace std;
    
    struct nodo 
    {
    	int info;
    	nodo* next;
    };
    
    nodo* Crea_lista();
    void Visualizza_lista(nodo*);
    void Elimina(nodo*);
    
    int main()
    {
    	nodo* lista=NULL; //creo la lista
        lista=Crea_lista();
        Visualizza_lista(lista);
    	Elimina(lista);
    	Visualizza_lista(lista);
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    nodo* Crea_lista()
    {
    	nodo *p,*punt;
    	int i,n;
    	printf("\nNumero elementi lista: ");
    	scanf("%d",&n);
    	if(n==0)
    	{
    		p=NULL;
            
    	}
        else
        {
            //inserimento del primo valore
            p=(nodo*)malloc(sizeof(nodo));
            printf("\nInserisci il primo valore");
            scanf("%d",&p->info);
            punt=p;
        }
        for(i=2;i<=n;i++)
        {
            punt->next=(nodo*)malloc(sizeof(nodo));
            punt=punt->next; //scorri
            printf("\nInserisci il %d elemento: ",i);
            scanf("%d",&punt->info);
        }
        punt->next=NULL; 
    	return p;
    }
    
    void Visualizza_lista(nodo* lista)
    {
        printf(" Lista---> ");
    	while(lista!=NULL)
    	{
            printf("%d",lista->info);
    		printf(" ---> ");
    		lista=lista->next;
    	}
        printf("NULL\n\n");
        getchar();
    }
    
    void Elimina(nodo* lista)
    {
    	nodo* scorri=lista;
        printf("LOL");
        while(scorri!=NULL)
    	{
    		if(scorri->info%2==0)
    		{
    			printf("Trovato elemento pari, eliminazione in corso");
    			scorri=scorri->next;
    			free(scorri);
    			lista->next=scorri->next; 
    		}
    		scorri=scorri->next;
    	}
    }
    L'altro l'ho risolto cosi' (metto solo la funzione che confronta)

    codice:
    int Confronta(nodo* lista,nodo* lista2)
    {
    	nodo* scorri1;
    	nodo* scorri2;
    	scorri1=lista;
    	scorri2=lista2;
    	while(scorri1!=NULL)
    	{
            while(scorri2!=NULL)
            {
            	if(scorri2->info==scorri1->info)
                    return scorri1->info;
                scorri2=scorri2->next;
            }
            scorri1=scorri1->next;
    	}
    return -1;
    }
    Grazie a chi mi vorrà aiutare

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    27
    up, plz mi serve per domani

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Per eliminare un numero prova cosi...

    codice:
    #include <stdio.h>
    //Decidi quanti numeri devono essere inseriti
    register int Numeri[10];
    
    void main (void)
    {
        for (int i = 0; i < (sizeof(Numeri) / sizeof(int)) ;i++)
     {
           if (Numeri[i] % 2 != 0)
             i = i + 1;
             printf("%i",Numeri[i]);
     }
     return;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    27
    Originariamente inviato da XWolverineX
    Per eliminare un numero prova cosi...

    codice:
    #include <stdio.h>
    //Decidi quanti numeri devono essere inseriti
    register int Numeri[10];
    
    void main (void)
    {
        for (int i = 0; i < (sizeof(Numeri) / sizeof(int)) ;i++)
     {
           if (Numeri[i] % 2 != 0)
             i = i + 1;
             printf("%i",Numeri[i]);
     }
     return;
    }
    0_o scusa ma questo è con gli array..a me serve con le liste

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    27
    up

  6. #6
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061

    Re: [C]Esercizio con Liste

    Originariamente inviato da -Yara-
    ....
    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    using namespace std;
    
    struct nodo 
    {
    	int info;
    	nodo* next;
    };
    
    nodo* Crea_lista();    <----
    void Visualizza_lista(nodo*);
    void Elimina(nodo*);
    
    int main()
    {
    	nodo* lista=NULL; //creo la lista
        lista=Crea_lista();
        Visualizza_lista(lista);
    	Elimina(lista);
    	Visualizza_lista(lista);
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    nodo* Crea_lista()
    {
    	nodo *p,*punt;
    	int i,n;
    	printf("\nNumero elementi lista: ");
    	scanf("%d",&n);
    	if(n==0)
    	{
    		p=NULL;
            
    	}
        else
        {
            //inserimento del primo valore
            p=(nodo*)malloc(sizeof(nodo));
            printf("\nInserisci il primo valore");
            scanf("%d",&p->info);
            punt=p;
        }
        for(i=2;i<=n;i++)
        {
            punt->next=(nodo*)malloc(sizeof(nodo));
            punt=punt->next; //scorri
            printf("\nInserisci il %d elemento: ",i);
            scanf("%d",&punt->info);
        }
        punt->next=NULL; 
    	return p;
    }
    
    void Visualizza_lista(nodo* lista)
    {
        printf(" Lista---> ");
    	while(lista!=NULL)
    	{
            printf("%d",lista->info);
    		printf(" ---> ");
    		lista=lista->next;
    	}
        printf("NULL\n\n");
        getchar();
    }
    
    void Elimina(nodo* lista)
    {
    	nodo* scorri=lista;
        printf("LOL");
        while(scorri!=NULL)
    	{
    		if(scorri->info%2==0)
    		{
    			printf("Trovato elemento pari, eliminazione in corso");
    			scorri=scorri->next;
    			free(scorri);
    			lista->next=scorri->next; 
    		}
    		scorri=scorri->next;
    	}
    }
    L'altro l'ho risolto cosi' (metto solo la funzione che confronta)

    codice:
    int Confronta(nodo* lista,nodo* lista2)
    {
    	nodo* scorri1;
    	nodo* scorri2;
    	scorri1=lista;
    	scorri2=lista2;
    	while(scorri1!=NULL)
    	{
            while(scorri2!=NULL)
            {
            	if(scorri2->info==scorri1->info)
                    return scorri1->info;
                scorri2=scorri2->next;
            }
            scorri1=scorri1->next;
    	}
    return -1;
    }
    Grazie a chi mi vorrà aiutare
    mi sembra a prima vista sia sbagliato anche la dichiarazione del "nodo"...
    cioè tu hai dichiarato un struct nodo{...}
    poi ai dichiarato lista come nodo *lista...

    così è sbagliato...
    quindi puoi fare
    codice:
    struct nodo{...}
    ....
    
    struct nodo *lista;
    oppure usi la typedef per ridefinirti "il nome" di nodo
    codice:
    struct nodo{...}
    typedef struct nodo elemNodo;
    ....
    elemNodo *lista;
    quando ho tempo mi vedo le funzioni che ai scritto...


    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    27
    Grazie...cmq il compilatore compila lo stesso anche senza typedef..
    Ho un nuovo esercizio:
    Invertire il contenuto di una lista, per esempio
    123456789 --> 987654321

    Qualche idea? Io non so da dove cominciare-....

  8. #8
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    be...
    io scorrerei la lista di partenza fino alla fine e ogni nodo lo passerei a una funzione che mi ricrea un'altra lista inserendo il nodo in testa... naturalmente devi gestire il fatto che il primo nodo che gli passi deve avere il campo next a null....


    1 2 3 ....->>>>> ... 3 2 1


    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  9. #9
    dato che sono in partenza per andare a nanna (sarebbe anche ora xD) non mi soffermo a leggere il codice se no non vado piu' a nanna..
    cmq per cancellare un elemento dalla lista dichiari un po' di puntatori alla stuttura della lista e inizi a scorrerla, quando determini che un elemento va eliminato ovviamente significa che hai un puntatore alla stuttura che stai valutando, quindi a noi cosa interessa avere ? un puntatore aggiornato a ogni scorrimento che punti alla struttura precedente di quella che stiamo valutando, un puntatore per salvare l'indirizzo dell'elemento successivo della lista a quello che stiamo valutando, nel momento in cui devi cancellare un elemento non fai altro che:
    1) determinarlo
    2) "torni indietro" con il puntatore che punta alla struttura precedente
    3) salvi in precedente.next il valore di attuale.next
    4) esegui una free con attuale ed ecco eliminato un elemento dalla lista...

    invertire il contenuto di una lista e' piu' complesso ok ma il trucco e' sempre quello :P
    la seconda lista devi ovviamente concatenarla "al contrario" ovvero tu parti a scorrere la lista input e salvi il puntatore alla lista nella seconda lista, poi scorri avanti di 1 e salvi la struct letta che invece di essere la prima diventa l'ultima, quindi il campo next della struct lo inizializzi con il puntatore che utilizzi per gestire la prima lista :P
    non so se sono stato chiaro ma come ha detto byaur basta scorrere la lista in input e creare una seconda lista dove invece che concatenare alla fine concateni all'inizio e' abbastanza facile :P

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.