Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79

    [C] Creazione e ricerca elemento in array di liste

    Ciao a tutti
    Ho un problema (non piccolo ç_ç) con un argomento del C..
    Gli array di liste..
    Gli array e le liste singolarmente non mi sono troppo ostiche, ma insieme un bel pò!

    Sto cercando di creare un programmino che crei un array di liste e poi vi cerchi all'interno un elemento se è presente oppure no!
    Ho iniziato ad abbozzare il codice per quanto ho potuto la mia logica pare non funzionare...


    codice:
    #include <stdio.h> 
    #include <stdlib.h>  
    
    struct cella 
    { 
    int valore; 
    struct cella *next;  
    }; 
    
     int main() 
    {     
    struct cella *temp;     
    struct cella *nuovo;     
    struct cella *testa;     
    int i;     
    struct cella *array[3];     
    
    for(i=0;i<3;i++)   //inizializzo a NULL le teste  
        {        
           array[i]=NULL;          
          }                        
    
    printf("Inserisco gli elementi nella lista 1");     
    printf("\n");     
    scanf("%d", &nuovo);     
    nuovo = (struct cella*)malloc(sizeof(struct cella));     
    nuovo->next = testa;     
    testa = nuovo;     
    scanf("%d", &array[0]->valore);                                        
    
    system("pause");     
    return 0;      
    
    }
    Teoricamente fino a qui dovrei poter inserire almeno un elemento alla lista 1 che risiede nella prima cella dell'array!
    Tuttavia quando compilo, il programma da errore e si chiude dopo l'inserimento dell'elemento...
    potete aiutarmi?
    Non so dove sbattere la testa ç_ç

    Grazie davvero!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Le scanf scrivono dove non dovrebbero, dato che usi puntatori non inizializzati.
    Ti riporto il codice teoricamente corretto per inserire un elemento. (non testato)
    codice:
    int main() {     
        int i;     
        struct cella *array[3];     
        for(i=0;i<3;i++) {  //inizializzo a NULL le teste  
           array[i]=NULL;          
        }                        
    
        printf("Inserisco gli elementi nella lista 1\n");     
        array[0] = (struct cella*)malloc(sizeof(struct cella));     
        array[0]->next = NULL;     
        scanf("%d", &array[0]->valore);                                        
        printf("%d\n", array[0]->valore);
        free(array[0]);
        system("pause");     
        return 0;      
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    Originariamente inviato da shodan
    Le scanf scrivono dove non dovrebbero, dato che usi puntatori non inizializzati.
    Ti riporto il codice teoricamente corretto per inserire un elemento. (non testato)
    codice:
    int main() {     
        int i;     
        struct cella *array[3];     
        for(i=0;i<3;i++) {  //inizializzo a NULL le teste  
           array[i]=NULL;          
        }                        
    
        printf("Inserisco gli elementi nella lista 1\n");     
        array[0] = (struct cella*)malloc(sizeof(struct cella));     
        array[0]->next = NULL;     
        scanf("%d", &array[0]->valore);                                        
        printf("%d\n", array[0]->valore);
        free(array[0]);
        system("pause");     
        return 0;      
    }
    grazie funziona!
    array[0]->next = NULL; però con questo codice non si limita a creare una lista di un elemento? cioè se io replicassi l'inserimento per dire 3 volte...


    codice:
    printf("Inserisco gli elementi nella lista 1\n");         
    array[0] = (struct cella*)malloc(sizeof(struct cella));      
    array[0]->next = NULL;          
    scanf("%d", &array[0]->valore);  
    printf("Inserisco gli elementi nella lista 1\n");          
    array[0] = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next = NULL;          
    scanf("%d", &array[0]->valore);  
    printf("Inserisco gli elementi nella lista 1\n");          
    array[0] = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next = NULL;          
    scanf("%d", &array[0]->valore);
    i valori del secondo e terzo inserimento si aggiungerebbero alla lista?

    grazie ancora :P

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    No, li sostituiscono.
    Così si aggiungono.
    codice:
    printf("Inserisco gli elementi nella lista 1 - 1\n");         
    array[0] = (struct cella*)malloc(sizeof(struct cella));      
    array[0]->next = NULL;          
    scanf("%d", &array[0]->valore); 
     
    printf("Inserisco gli elementi nella lista 1 - 2\n");         
    array[0]->next = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next->next = NULL;          
    scanf("%d", &array[0]->next->valore);  
    
    printf("Inserisco gli elementi nella lista 1 - 3\n");         
    array[0]->next->next = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next->next->next = NULL;          
    scanf("%d", &array[0]->next->next->valore);
    Va da se che è improponibile una cosa del genere.
    Tieni presente che ogni singola cella l'array contiene solo il primo elemento di una lista diversa, per cui una volta individuata la lista che ti interessa, trattarla non è diverso da una lista qualsiasi.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    Originariamente inviato da shodan
    No, li sostituiscono.
    Così si aggiungono.
    codice:
    printf("Inserisco gli elementi nella lista 1 - 1\n");         
    array[0] = (struct cella*)malloc(sizeof(struct cella));      
    array[0]->next = NULL;          
    scanf("%d", &array[0]->valore); 
     
    printf("Inserisco gli elementi nella lista 1 - 2\n");         
    array[0]->next = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next->next = NULL;          
    scanf("%d", &array[0]->next->valore);  
    
    printf("Inserisco gli elementi nella lista 1 - 3\n");         
    array[0]->next->next = (struct cella*)malloc(sizeof(struct cella));          
    array[0]->next->next->next = NULL;          
    scanf("%d", &array[0]->next->next->valore);
    Va da se che è improponibile una cosa del genere.
    Tieni presente che ogni singola cella l'array contiene solo il primo elemento di una lista diversa, per cui una volta individuata la lista che ti interessa, trattarla non è diverso da una lista qualsiasi.
    giusto!!
    son ormai le 6.30 o.o sarò fusa...son qui da tutt'oggi!

    ora mi metto a fare una stampa complessiva e poi vado mangiare. provo ad andare avanti e domani ti faccio sapere grazie davvero

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    mi sono messa da una mezzoretta a fare la ricerca..se il valore non è presente nelle liste me lo segnala correttamente, se invece c'è mi segnala in modo sbagliato dove si trova..
    se tipo ho il valore 1 sia in lista 1 - 2 -3 mi conta il tutto come una lista unica...e tipo mi dice
    il valore 1 è in cella 3, 6, 9 perchè secondo lui ho una cosa del genere
    123123123

    codice:
    printf("\n\n Inserisci il valore da cercare nella lista: ");                
                    
                    scanf("%d",&numerodacercare);
                    trovato = 0;   
                    count = 0;
                    for(i=0;i<3;i++)
                    {             
                    temp = array[i]; //puntatore temporaneo per scorrere la lista e non perdere il riferimento alla testa 
                    while (temp != NULL)
                    {
                        count++;
                        if (temp->valore == numerodacercare)
                        {
                            trovato = 1;
                            
                        }
                        temp = temp->next;
                    }
                    if (trovato)
                        printf("\n\n Il valore %d e\' presente in lista nella cella %d\n ",numerodacercare,count);
                    else
                        printf("\n\n Il valore selezionato NON e\' presente in lista\n ");
                    system("pause");
                }

    edit: ho notato che non lo trova neanche u.u la mia era solo una coincidenza...non riesce a entrare nelle diverse liste..

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il count = 0 va messo tra il temp e il while, altrimenti si incrementa e basta.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    ho inserito il count = 0;
    qui
    codice:
    temp = array[i];   
    count = 0; 
    while (temp != NULL)
    ma se lo compilo ho una situazione così



  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Anche trovato va azzerato qui:
    codice:
    temp = array[i];   
    count = 0; 
    trovato = 0;
    while (temp != NULL)
    Comunque hai mostrato solo una iterazione del ciclo for. E in quella iterazione non c'è il 6. Le prossime che mostrano?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    in che senso le prossime iterazioni? quello dovrebbe essere il risultato avuto dopo lo svolgimento dell'intero for...

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.