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

    [C] Ordinare una lista concatenata

    Salve, ecco un altro problema creato in un nuovo Thread, per future ricerche riguardanti il mio problema, anche perché nel forum non si trovano discussioni in C riguardanti l'ordinamento di liste.

    L'algoritmo è il seguente:
    codice:
    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(list_pointer);
      return list_head;
    }
    Dopo aver inserito la lista in output mi da soltanto l'ultimo valore inserito..



    P.S. Avrei un altra richiesta, per ordinare le stringhe è la stessa cosa?? Ovviamente una Lista di stringhe.
    Ultima modifica di Ronald940; 21-06-2014 a 14:02

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

    Ciao

    Ciao , tu applichi bubble sort , sui valori di variabili , scambi in pratica i valori delle variabili , quindi non credo si possa parlare di "ordinamento lista " ,
    Un esempio tu ,adesso hai una struttura con una variabile intera , in base al valore di questa fai un ordinamento , e in questo caso il tuo metodo si può dire efficace , immagina invece che la tua struttura oltre a questa variabile , ne avesse altre 50 di vario tipo , scambiare i valori delle variabili sarebbe laborioso , sarebbe invece più comodo , in base al valore di una variabile , scambiare i PUNTATORI dei singoli nodi , in questo modo il codice sarebbe il medesimo anche se le variabili della struttura fossero 200
    Comunque parliamo di questo codice specifico e del perchè non fa quello che chiedi , ti posto il codice modificato e commentato .

    Esempio di bubble sort , http://programmando.forumcommunity.net/?t=54699901

    Prova il codice , potrei aver commesso errori , in questo caso prova anche a correggerli
    codice:
    struct elemento *ordLista(struct elemento *list_head){
    struct elemento *list_pointer;
    int flag, temp;
    
     
    // list_record = NULL;  list record mi sembra inutile tu dovrai scorrere la lista fino a NULL
    
    
      flag =1;
      while(flag ==1){
        list_pointer = list_head;
        flag =0;
        while(list_pointer->next!= NULL){
          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;//fino a quando esegue scambi continua 
          }
          
        }
       
      }
        printElemento(list_head);//invio la lista alla funzione che stampa
      return list_head;
    }
    Ultima modifica di torn24; 22-06-2014 a 09:55 Motivo: Spiegazioni aggiuntive
    Tecnologia

  3. #3
    Niente non funziona..
    Quando inserisco il comando 2 (ordinamento lista), il programma smette di funzionare.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Puoi presentare nuovamente *tutto* il codice per capire se hai sbagliato da qualche altra parte ?

    (con il tuo codice di ordinamento, non con l'ultimo)
    Ultima modifica di oregon; 22-06-2014 a 17:13
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Beh, e non hai cercato di individuare il problema?
    Ci ho provato.. sennò avrei riposto "grazie!" ç_ç

    Ecco 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(struct elemento *);
    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:{
     printElemento(Lista);
     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;
     
    printElemento(list_pointer);
    }  
    //Ordinamento Lista
    struct elemento *ordLista(struct elemento *list_head){
    struct elemento *list_pointer;
    int flag, temp;  
    flag = 1;  
    while(flag == 1){    
    list_pointer = list_head;    
    flag =0;    
    while(list_pointer->next!= NULL){      
     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;   
     } 
    }     
    }    
    printElemento(list_head);
    return list_head;
    }
    void printElemento(struct elemento *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"); 
    }
    Ultima modifica di Ronald940; 22-06-2014 a 17:17

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Quote Originariamente inviata da Ronald940 Visualizza il messaggio
    Ci ho provato.. sennò avrei riposto "grazie!" ç_ç
    Hai provato cosa? Hai fatto debugging? Hai individuato la linea con l'errore?

    Comunque, mostra tutto il codice con il tuo ordinamento perché quando l'ho provato non ho avuto errori.

    In particolare come hai chiamato la funzione di ordinamento dal main?
    Ultima modifica di oregon; 22-06-2014 a 17:17
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Se il debugging mi segnalava l'errore, era uno sciocchezza.. il fatto è che il programma parte benissimo.. ma quando metto il comando per ordinare smette di funzionare...

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Quote Originariamente inviata da Ronald940 Visualizza il messaggio
    Se il debugging mi segnalava l'errore
    Scusa ma tu non hai idea di cosa significa fare debugging. Devi eseguire linea per linea con il debugger per individuare la linea che ti dà il problema.

    Ma lasciamo perdere, riparti dal tuo codice di ordinamento ... è ovvio che questa

    printElemento(list_pointer);

    al suo interno è sbagliata ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Scusa ma tu non hai idea di cosa significa fare debugging. Devi eseguire linea per linea con il debugger per individuare la linea che ti dà il problema.

    Ma lasciamo perdere, riparti dal tuo codice di ordinamento ... è ovvio che questa

    printElemento(list_pointer);

    al suo interno è sbagliata ...
    Non credo centri con i mio problema.. anche perché commentndo la linea di codice il problema persiste..

    Comunque ho provato a fare il debug (grazie, non lo sapevo :O) e mi segnala questo:

    codice:
     
    while(list_pointer->next!= NULL){

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Forse non mi sono spiegato ... Io mi riferisco al codice del tuo ordinamento non dell'ultima versione di torn
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.