Stampa due volte int>10 (C)

di
Anonimizzato1680
il
1 risposte

Stampa due volte int>10 (C)

Ciao a tutti,
ho scritto un piccolo programma in C che legge dei dati da un file (stringa, char, int - 1000 righe), inserisce ogni riga in una struttura che è poi connessa in una lista ordinata.
il programma funziona regolarmente fino a quando l'intero passato è <10. se infatti ci sono righe il cui valore int è >10 queste vengono comunque ordinate in modo corretto, ma stampate due volte!
perchè?
riporto sotto il codice principale:
[....]
while (fgets (line, LEN, res)!=NULL) {

sscanf(line, "%s %c %d\n", name, &chain, &vote);

//printf("letto: %s %c %d\n", name, chain, vote);

if (maxx==NULL){

maxx=crea_prot(name, chain, vote);
min=maxx;
continue;};

if ((*maxx).pvote<=vote){

new=crea_prot(name, chain, vote);
(*new).np=maxx;
maxx=new; new=NULL;

continue;};

if ((*min).pvote>=vote){
new=crea_prot(name,chain,vote);
(*min).np=new;
min=new; new=NULL;

continue;};

if ((*maxx).pvote>vote){

curr=maxx; prev=curr;

while(curr->pvote > vote){
prev=curr; curr=curr->np;}

//printf("%s %c %d\n", curr->pname, curr->pchain, curr->pvote);

new=crea_prot(name,chain,vote);
new->np=curr;
prev->np=new;
new=NULL;


continue;};


}

printf("sorted(by vote) list:\n");
while (maxx!=NULL){
printf("%s %c %d\n", maxx->pname, maxx->pchain, maxx->pvote);

maxx=maxx->np;

}

fclose(res);
return;
}

/*la struttura utilizzata è:*/

struct prot {
char pname[5];
char pchain;
int pvote;
struct prot *np;};
typedef struct prot prot;

Grazie a tutti!

1 Risposte

  • Re: Stampa due volte int>10 (C)

    Senza aver preso in considerazione la lettura del file, che mi sembra apposta, mi sono fermato sull'algoritmo di ordinamento.

    Il problema normalmente si risolve con una funzione del C, qsort(), su un valore, in questo caso pvote, ma è solo applicabile se i valori sono univoci.

    Altimenti si potrebbe applicare il seguente algoritmo (swapsort), che va bene per piccoli array:

    <pre id=code><font face=courier size= id=code>
    for(i = 0; i < n; i++)
    {
    for(j = i + 1; j < n; j++)
    {
    if(arr[i].n > arr[j].n)
    {
    memcpy(&buf, arr[j], sizeof(buf));
    memcpy(arr[j], arr[i], sizeof(buf));
    memcpy(arr[i], &buf, sizeof(buf));
    }
    }
    }
    </font id=code></pre id=code>

    Da notare è che la variabile 'j' punta al prossimo elemento di 'i', in quanto arr[i] e arr[j] sono identici. Per array più grandi si può ottimizzare entro certi limiti, soprattutto se i valori sono già parzialmente ordinati.

    Giovanni
    ---
    http://www.y2ksw.com/vbulletin
Devi accedere o registrarti per scrivere nel forum
1 risposte