Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797

    [c++] swap di puntatori

    codice:
    void swap(lemma * v1,lemma * v2){
    lemma * vtemp;
    vtemp=v1;
    v1=v2;
    v2=vtemp;
    } 
    
    chiamata:swap (array[i], array[j]);
    è giusta questa funzione? dovrebbe fare lo swap .. ma secondo me nn va .. alla fine è tutto uguale..

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Io aggiungerei i caratteri &:
    codice:
    void swap(lemma * v1,lemma * v2){
    lemma * vtemp;
    vtemp=v1;
    v1=v2;
    v2=vtemp;
    } 
    
    chiamata:swap (&array[i], &array[j]);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    no nn va .. diemnticavo .. quello che passo io sono delle struct puntate da un vettore di puntatori .. VVoVe:
    cioè
    ho un vettore di struct principale e poi un vettore che punta a questo vettore di struct, e io devo ordinare il vettore di puntatori ..

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Prova a dereferenziare:
    codice:
    void swap(lemma * v1,lemma * v2){
    lemma vtemp;
    vtemp=*v1;
    *v1=*v2;
    *v2=vtemp;
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Anche questo funziona, ma scambia i puntatori e non i valori, che mi sembra sia quello che ti serve:

    codice:
    void swap(lemma**a, lemma**b)
    {
    	lemma *temp;
    	temp = *a;
    	*a = *b;
    	*b = temp;
    }
    
    swap(&a, &b);

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Entrambi i metodi ottengono lo stesso risultato in modo diverso: il primo scambiando i valori, il secondo i puntatori. Credo che per strutture dati complesse, scambiare i puntatori sia più veloce che non scambiare i valori.

  7. #7
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    ok lo swap va ma nn sono capace di ordinare ho lasciato perdere il quick sort e ho provato con il bubble sort
    codice:
    void bubblesort(lemma * x[], int n) {
    lemma * vtemp;
    for (int k=n-1; k>=0; k--)
      for (int i=0; i<k; i++){
                if (x[i]->italiano < x[i+1]->italiano) {
                   // exchange elements
                   swap(&x[i], &x[i+1]);
    
               }
           }
    }
    in entrata ho il vettore (->italiano)inizializzato così
    z io ciao a b
    e dopo il sort è così
    b a ciao io z

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Credo che tu debba usare strcmp(x[i]->italiano, x[i+1]->italiano). Gli operatori di confronto sulle stringhe non funzionano bene.

  9. #9
    Utente di HTML.it L'avatar di bako
    Registrato dal
    Feb 2004
    Messaggi
    1,797
    già .. dopo ore c'ero arrivato .. adesso devo sistemare il quick sort ..
    codice:
    void quicksort (int left, int right, lemma * array[]) {
    int i = 0, j = 0;
    char pivot[128];
    lemma * vtemp;
    
            i = left;
            j = right;
            strcpy(pivot,array[(left + right) / 2]->italiano);
             do { 	
    	        while (strcmp(array[i]->italiano,pivot) < 0 )
    		        i++;		
                    while (strcmp(pivot,array[j]->italiano)<0)
    		        j--;                
                    if (i <= j) {           
    		            swap(array[i],array[j]);
    		         i++; 
    	           j--; 
    	        };
            }
            while  (!(i > j)); 
            if (left < j)  
                    quicksort(left, j, array); 
            if (i < right) 
                    quicksort(i, right, array); 
    }
    in teoria, credo che vada a leggere fuori dalla memoria e quindi winzoz mi da errore

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    423
    Ah no aspetta ho capito: Il secondo ciclo è fatto male:

    codice:
    for (int i=0; i<k; i++)
    Poichè k viene decrementato ad ogni ciclo, i cicli successivi al primo non eseguono una scansione completa dell'array ma solo parziale !!! Inoltre, usa comunque strcmp();

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.