Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    51

    [c] ordinamento lista di struct

    salve, ho un problema con quanto descritto nel titolo del post, sto realizzando un programma in c che mi legga da file la classifica di una gara di f1, mi crea una lista di struct relative ad ogni pilota contenente il tempo totale di percorrenza della gara (somma dei tempi di tutti i giri), il nome del pilota, il nome della scuderia i giri effettuati ect.. se volessi prima di stampare la classifica finale ordinare la mia lista secondo il campo tempo (tempo totale di percorrenza della gara) di ogni pilota, come potrei fare?? grazie...

    allego parte del codice per far capire di cosa si sta parlando..

    questa è la struct che è alla base della mia lista:
    codice:
    struct scheda_pilota {
                            int giri_effettuati;
                            int numero_pilota;
                            char *nome_pilota;
                            char *scuderia;
                            float tempo;
                            struct scheda_pilota *prossimo;       
                                
                                };

    ho letto che è possibile ordinare spostando i puntatori o spostando i valori che essi puntano, dato che reputo una soluzione molto più efficiente la prima, anche perchè nel secondo caso suppongo che dovrei allocare un'altra struct per fare da appoggio ai trasferimenti di tutte le variabili..., vorrei capire come fare a spostare ed ordinare solo i puntatori..... grazie..

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    prova a buttare giù un pò di codice, magari qualcuno inizia a dargli un'occhiata!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    51
    codice:
    //   Ordina classifica
    void ordina_lista (struct scheda_pilota *punt_scheda_pilota)
    {
    struct scheda_pilota *head, *p_1, *p_2;
    
    p_1=punt_scheda_pilota;
    p_2=punt_scheda_pilota->prossimo;
    while (p_1!=NULL)
    {
          while (p_2!=NULL)
          {
                if ((p_2->tempo)<(p_1->tempo))
                {
                   
                   
             
                   }
                
                }
          }
    }
    e adesso.... tutto quello che ho provato io a mettere dentro l'if per simulare un bubblesort non ha funzionato, quindi piuttosto che metterci delle castronerie spero qualcun altro mi risponda dicendomi come fare, o dove andare a leggere come fare una guida o un manuale di c online dove è spiegato, non ho trovato nulla io, o forse non ho saputo cercare.....

  4. #4
    Utente di HTML.it L'avatar di Mad_al
    Registrato dal
    Jun 2009
    Messaggi
    125
    in poche parole che vado di fretta. Il trucco sta nel fare una funzione che utilizzi un ordinamento per selezione. E' molto semplice.. puoi fare un vettore che contenga tutte le schede_pilota, poi fare la ricerca sul vettore chiamando i campi tempo e confrontarli in un if. si può fare mettendo 2 cicli for annidati e la condizione dentro l'ultimo. il primo for che parte da j=0; e l'altro che parte da i=j+1; ed entrambi si fermano alla fine del vettore...
    cmq, appena ho un attimo ti butto giù 2 righe di codice..ma puoi arriverci benissimo senza problemi.

  5. #5
    devi per forza usare una lista lineare per fare questo?

    se potessi conservare le varie struct in un semplice array l'algoritmo sarebbe semplicissimo da fare usando il SelectionSort

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    51
    grazie mille a Mad_al !!!!!!!!!! ho risolto così!!!!!!

    codice:
    //   Ordina classifica
    struct scheda_pilota *vett_indici[numero_piloti], *p_1, *p_temp;
    int i, j;
    
    p_1=punt_scheda_pilota;
    i=j=0;
    while (p_1!=NULL)
    {
          vett_indici[i]=p_1;
          p_1=p_1->prossimo;
          i++;
          
          }
    
    for (i=0;i<numero_piloti;i++)
    {
        for (j=i+1;j<numero_piloti;j++)
        {
            if (((vett_indici[j])->tempo)<((vett_indici[i])->tempo))
            {
                p_temp=vett_indici[i];
                vett_indici[i]=vett_indici[j];
                vett_indici[j]=p_temp;
                                
                  }
            
            }
        
        }

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.