Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    [C] Stampare una lista concatenata

    Ho creato questo programma, ma purtroppo non mi stampa la lista, sicuramente sbaglio qualcosa nel caricamento della lista (credo si sovrascrivano gli elementi)..
    Questo è l'algoritmo..
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct elemento{
     int valore;
     struct elemento *next;
    };
    void menu();
    void insElemento();
    void delElemento();
    void ordLista();
    int main(){
     int comando;
     menu();
     printf("\nComando:\t");
     scanf("%d", &comando);
     switch(comando){
      case 1:{
       insElemento();
       break;
      }
      case 2:{
       delElemento();
       break;
      }
      case 3:{
       ordLista();
       break;
      }
     }
     return 0; 
    }
    void menu(){
     printf("--------------------------");
     printf("\n1 - Inserisci Elemento\n");
     printf("2 - Cancella Elemento\n");
     printf("3 - Ordinamento Lista\n");
     printf("--------------------------");
    }
    void insElemento(){
        struct elemento *list_pointer, *list_head, *list_record;
        int i, n=0, val, newval;
     printf("Specificare il numero di elementi della lista:  ");
     scanf("%d", &n);
     //Inserimento del primo elemento
        list_record = (struct elemento *)malloc(sizeof(struct elemento));
        printf("\nInserisci il 1 elemento: ");
        scanf("%d", &val);
     list_record->valore = val;
     list_head=list_record;
     list_pointer = list_head;
     //Inserimento degli elementi successivi
     for(i=2; i<=n; i++)
           {
              list_record->next = (struct elemento *)malloc(sizeof(struct elemento));
              list_record = list_record->next;
              printf("\nInserisci il %d elemento: ", i);
              scanf("%d", &newval);
              list_record->valore = newval;
              list_head=list_record;
        list_pointer = list_head;
           } 
           list_record->next = NULL;
      //Stampa della lista
     printf("\nlista -> ");
     while(list_record != NULL){
        printf("%d", list_record->valore); // visualizza l’informazione 
           printf(" -> ");
           list_record = list_record->next; //scorre di un elemento
        }
     printf(" NULL"); 
        } 
     void delElemento(){
      int del;
      printf("Work in Progress");
      
     }
     void ordLista(){
      printf("Work in Progress");
     }

    Quindi ricapitolando, il problema sta nell'impossibilità di stampare la lista COMPLETA (stampa l'ultimo elemento inserito), per eventuali errori nell'inserimento.
    Avete qualche idea di dove possa stare il problema?
    Grazie in anticipo
    Ultima modifica di Ronald940; 18-06-2014 a 20:36

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Vorrei fare la premessa , che forse dovresti ricominciare da capo , visto che creare una lista in una
    funzione void "che non restituisce niente" e non accetta nessun parametro , ha poco senso e utilità


    Comunque , il problema che ti si presenta è dovuto al fatto che list_record lo fai puntare
    di volta in volta al nodo successivo , e quindi alla fine punta all'ultimo nodo , quindi se fai
    stampare stamperà solo l'ultimo nodo visto che il successivo è NULL


    invece di usare list_record , puoi usare list_head
    codice:
    for(i=2; i<=n; i++)
           {
              list_record->next=(struct elemento *)malloc(sizeof(struct elemento));
              list_record = list_record->next;
              printf("\nInserisci il %d elemento: ", i);
              scanf("%d",&newval);
              list_record->valore = newval;
             // list_head=list_record;  xxxxxx questa istruzione è scorretta head deve sempre
             // puntare al primo nodo la testa della lista altrimenti ne perdi il riferimento
        list_pointer = list_head;
           }
    
    while(list_head != NULL){
        printf("%d", list_head->valore); // visualizza l’informazione 
           printf(" -> ");
           list_head = list_head->next; //scorre di un elemento
        }
    Tecnologia

  3. #3
    Grazie mille Torn, avevo capito il problema ma ingenuamente intervenivo sempre su list_record senza fare attenzione alla testa della lista
    Per quanto riguarda il tuo consiglio.. Perché è inutile? Io uso la funzione per lo switch e quindi per far ordine nel codice..

  4. #4
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quote Originariamente inviata da Ronald940 Visualizza il messaggio
    Perché è inutile? Io uso la funzione per lo switch e quindi per far ordine nel codice..
    Ciao,
    è inutile perché la lista la crei solamente all'interno del metodo insElemento (la tua lista è locale al singolo metodo), quindi non è visibile da fuori. Una volta uscito da quel metodo... non puoi più utilizzare la lista, perché le altre funzioni (compreso il main) semplicemente non la vedono.


  5. #5
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Ciao,
    è inutile perché la lista la crei solamente all'interno del metodo insElemento (la tua lista è locale al singolo metodo), quindi non è visibile da fuori. Una volta uscito da quel metodo... non puoi più utilizzare la lista, perché le altre funzioni (compreso il main) semplicemente non la vedono.

    Grazie mino, smanettando ho provato a passare il parametro.. ma non ci riesco.. In questo caso che parametro devo passare e dove?
    io ho provato a mettere "struct elemento" è giusto?

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Ciao , mi permetto di darti qualche consiglio

    tu hai un main e tante funzioni che devono operare su un UNICA lista , di conseguenza è pensabile
    che la lista sia dichiarata nel main e venga passata come argomento a ciascuna delle funzioni .


    Ci sarebbero molti aspetti , da descrivere e che secondo me non ti sono chiari , ma non si possono trattare in un unico thread di un forum .


    Posso dirti , senza specificare il motivo e la teoria , che se devi modificare il puntatore lista del main() , cioè fare puntare quel puntatore a un altro nodo della lista "come nel caso di inserimento di un nodo in testa a una lista " o lo restituisci come puntatore o passi l'indirizzo del puntatore come parametro tramite a un doppio puntatore ....


    Mi sto rendendo conto che è impossibile spiegare tutto in thread ma ASSURDO provare a farlo in un unico post


    provo a farti un esempio di codice commentato , di come secondo me dovresti impostare il problema


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct elemento{
     int valore;
     struct elemento *next;
    };
    void menu();
    struct elemento * insElemento(struct elemento *); //restituisce un puntatore a struct elemento cioè restituisce la lista in questo caso :)
    void delElemento();
    void ordLista();
    int main(){
     struct elemento *Lista=NULL ; //puntatore a struct elemento nullo , non punta ancora a una locazione di memoria 
     int comando;
     menu();
     printf("\nComando:\t");
     scanf("%d", &comando);
     switch(comando){
      case 1:{
       Lista=insElemento(Lista);
       break;
      }
      case 2:{
       delElemento();
       break;
      }
      case 3:{
       ordLista();
       break;
      }
     }
     return 0; 
    }
    void menu(){
     printf("--------------------------");
     printf("\n1 - Inserisci Elemento\n");
     printf("2 - Cancella Elemento\n");
     printf("3 - Ordinamento Lista\n");
     printf("--------------------------");
    }
    struct elemento* insElemento(struct elemento *list_head)
    {
        struct elemento *list_pointer, *list_record;
        int i, n=0, val, newval;
     printf("Specificare il numero di elementi della lista:  ");
     scanf("%d", &n);
     //Inserimento del primo elemento
        list_record = (struct elemento *)malloc(sizeof(struct elemento));
        printf("\nInserisci il 1 elemento: ");
        scanf("%d", &val);
     list_record->valore = val;
     list_head=list_record;
     list_pointer = list_head;
     //Inserimento degli elementi successivi
     for(i=2; i<=n; i++)
           {
              list_record->next = (struct elemento *)malloc(sizeof(struct elemento));
              list_record = list_record->next;
              printf("\nInserisci il %d elemento: ", i);
              scanf("%d", &newval);
              list_record->valore = newval;
              
           } 
           list_record->next = NULL;
    	   list_pointer = list_head;// uso un puntatore temporaneo , in modo da scorrere la lista ma mantenere list_head che punti al primo elemento :)
      //Stampa della lista
     printf("\nlista -> ");
     while(list_pointer != NULL){
        printf("%d", list_pointer->valore); // visualizza l’informazione 
           printf(" -> ");
           list_pointer = list_pointer->next; //scorre di un elemento
        }
     printf(" NULL"); 
     
       return list_head; //ho creato la lista , l'ho stampata , e restituisco il primo elemento la testa della lista , 
                         //che sarà assegnata al puntatore Lista del main()    e quindi potrà essere usata da altre funzioni , in modo analogo ;)
                            
        } 
     void delElemento(){
      int del;
      printf("Work in Progress");
      
     }
     void ordLista(){
      printf("Work in Progress");
     }
    Tecnologia

  7. #7
    Mhh penso di aver capito il procedimento.. ma per le altre funzioni devo usare ad esempio:
    codice:
    struct elemento* delElemento(struct elemento *list_head)
    ?

  8. #8
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quote Originariamente inviata da Ronald940 Visualizza il messaggio
    Mhh penso di aver capito il procedimento.. ma per le altre funzioni devo usare ad esempio:
    codice:
    struct elemento* delElemento(struct elemento *list_head)
    ?
    Sì, è una buona idea quella di restituire sempre il puntatore alla testa della lista aggiornata.

  9. #9
    Allora grazie ai vostri consigli sono riuscito a capire gran parte del programma.. Ma restano due problemi:
    1. Nella funzione ordLista quando stampo (manualmente - visto il problema successivo), mi stampa la lista ordinata tranne il primo elemento. ordinato..
    Es.
    Lista -> 4 -> 8 -> 3 -> 9 -> 2 -> NULL
    Me lo ordina e mi stampa..
    Lista -> 3 -> 4 -> 8 -> 9 -> NULL

    2. Inoltre non riesco a creare la funzione stampa da utilizzare nelle varie funzioni e nel main(). Preticamente non so che parametri passare per rendere performante l'algoritmo

    Questo è il codice:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    struct elemento{ 
    int valore; 
    struct elemento *next;
    };
    void menu();
    struct elemento *insElemento(struct elemento *); 
    struct elemento *ordLista(struct elemento *);
    void printElemento();
    int main(){
     struct elemento *Lista=NULL ; 
     int comando; 
     do{
     menu(); 
     printf("\nComando:\t"); 
     scanf("%d", &comando); 
     
     switch(comando){  
     case 1:{   
     Lista=insElemento(Lista);   
     break;  
     }   
     case 2:{   
     Lista=ordLista(Lista);   
     break;  
     } 
     case 3:{
     //PrintLista();
     break;
     }
     } 
    }while(true);
    return 0; 
    }
    void menu(){ 
     printf("\n--------------------------"); 
     printf("\n1 - Inserisci Elemento\n"); 
     printf("2 - Ordinamento Lista\n"); 
     printf("3 - Visualizza Lista\n"); 
     printf("--------------------------\n");
    }
    //Inserimento elementi lista
    struct elemento *insElemento(struct elemento *list_head){    
    struct elemento *list_pointer, *list_record;    
    int i, n=0, val, newval; 
    printf("Specificare il numero di elementi della lista:  "); 
    scanf("%d", &n);    
    list_record = (struct elemento *)malloc(sizeof(struct elemento));    
    printf("\nInserisci il 1 elemento: ");    
    scanf("%d", &val); 
    list_record->valore = val; 
    list_head=list_record; 
    list_pointer = list_head; 
    for(i=2; i<=n; i++){          
     list_record->next = (struct elemento *)malloc(sizeof(struct elemento));          
     list_record = list_record->next;          
     printf("\nInserisci il %d elemento: ", i);          
     scanf("%d", &newval);          
     list_record->valore = newval;                 
    }        
    list_record->next = NULL;       
    list_pointer = list_head;
     
    //Stampa della lista 
    printf("\nlista -> "); 
    while(list_pointer != NULL){    
    printf("%d", list_pointer->valore);        
    printf(" -> ");       
    list_pointer = list_pointer->next;    
    } 
    printf(" NULL");     
    return list_head; 
    }  
    struct elemento *ordLista(struct elemento *list_head) {
    struct elemento *list_pointer, *list_record;
    int flag, temp;
    list_record = NULL;
      flag = 1;
      while (flag == 1) {
        list_pointer = list_head;
        flag = 0;
        while (list_pointer->next != list_record) {
          if (list_pointer->valore > (list_pointer->next)->valore) {
            temp = list_pointer->valore;
            list_pointer->valore = (list_pointer->next)->valore;
            (list_pointer->next)->valore = temp;
            flag = 1;
          }
          list_pointer = list_pointer->next;
        }
        list_record = list_pointer;
      }
     //printElemento();  
      return list_head;
    }
    struct printElemento(){
    struct elemento *list_pointer
    printf("\nlista -> "); 
    while(list_pointer != NULL){    
    printf("%d", list_pointer->valore);        
    printf(" -> ");       
    list_pointer = list_pointer->next;     
    } 
    printf(" NULL"); 
    }
    Ah dimenticavo, grazie per le risposte precedenti..

  10. #10
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Ciao per ogni problema , si apre una nuova discussione , visto che un forum non è una discussione privata tra due o tre persone , chiunque voglia aiutarti deve sapere con chiarezza quale sia il problema e di cosa si parla e diventa impossibile farlo se in un thread si parla di molte cose diverse ....


    Ora per un problema banale di funzione stampa , ti suggerisco qui qualcosa ...
    ma per la funzione OrdinaLista() apri un thread apposito , spiega come vuoi ordinare la lista in base a cosa , anche perchè da come tu hai risolto scambi i valori di campi , e forse ti si chiedeva di scambiare i puntatori , cosa ben diversa .......


    codice:
    Void printElemento(struct elemento *Lista) //la funzione è void visto che non deve modificare 
                                               // la testa della lista 
    {
        struct elemento *list_pointer =Lista;
        printf("\nlista -> "); 
        
        while(list_pointer != NULL){    
            printf("%d", list_pointer->valore);        
            printf(" -> ");       
            list_pointer = list_pointer->next;     
         } 
        printf(" NULL"); 
    }
    Tecnologia

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.