2015-04-15 14 views
6

voglio ordinare una matrice di strutture utilizzando l'algoritmo di ordinamento bolla e puntatori in C. Ho una struttura auto:Bubble tipo di strutture con puntatori in C

typedef struct{ 
    char model[30]; 
    int hp; 
    int price; 
}cars; 

e allocare memoria per 12 articoli :

cars *pointer = (cars*)malloc(12*sizeof(cars)); 

e leggere dati da file:

for (i = 0; i <number ; i++) { 
    fscanf(file, "%s %i %i\n", (pointer+i)->model, &(pointer+i)->hp, &(pointer+i)->price); 
} 

mi passano puntatore 012.-bubbleSort funzione:

bubbleSort(pointer, number); 

Ecco il mio bubbleSort funzione:

void bubbleSort(cars *x, int size) { 
    int i, j; 
    for (i=0;i<size-1;i++) { 
    int swapped = 0; 
    for (j = 0; j < size - 1 - i; j++) { 
     if ((x+i)->hp > (x+j+1)->hp) { 
      cars *temp = (x+j+1); 
      x[j+1] = x[j]; 
      x[j] = *temp; 
      swapped = 1; 
     } 
    } 
     if (!swapped) { 
     //return; 
     } 
    } 
} 

Il problema è che non so come scambiare oggetti con i puntatori.

+2

provare 'auto * temp = (x + j + 1);' 'modifica auto temp = x [j + 1];' ..'x [j] = temp; ' – BLUEPIXY

+1

anche' if ((x + i) -> hp> (x + j + 1) -> hp) {'->' if ((x + j) -> hp> (x + j +1) -> hp) {' – BLUEPIXY

+0

Non è mai necessario digitare cast il ritorno di malloc. Questa è una cosa C++. Basta usare 'cars * pointer = malloc (12 * sizeof (macchine));' – Deanie

risposta

6

Si consideri la seguente soluzione per la funzione di ordinamento:

void bubbleSort(cars *x, int size) 
{ 
    int i, j; 
    for (i = 0; i < size-1; i++) 
    { 
     for (j = 0; j < size-1-i; j++) 
     { 
      if (x[j].hp > x[j+1].hp) 
      { 
       cars temp = x[j+1]; 
       x[j+1] = x[j]; 
       x[j] = temp; 
      } 
     } 
    } 
} 

il problema era in scambio di dati parte

+1

Nessuna idea. Questa è l'unica soluzione corretta finora. – DevNull

+0

Ora, dopo la correzione che mi hai indicato, anche la mia è una soluzione corretta, un po 'diversa! –

+0

La tua soluzione sarà diversa, se non copi solo esempi. E, naturalmente, ci sono infinite soluzioni diverse per lo stesso problema. Buona fortuna! – VolAnd

0
void bubbleSort(cars *x, int size) 
{ 
     int i, j; 
     cars temp; 

     for (i=0;i<size-1;i++) { 
      for (j = i+1; j < size; j++) { 
       if ((x+i)->hp > (x+j)->hp) { 
        temp = x[j]; 
        x[j] = x[i]; 
        x[i] = temp; 
       } 
      } 
     } 
} 

Questa è una risposta ad un commento sotto questo codice; dimostra che il tipo che vi suggerisco di swap di meno ... :) Ecco il codice:

#include <stdio.h> 
#include <string.h> 

typedef struct { 
    int x; 
    int hp; 
} cars; 

int swaps; 

void bubbleSortB(cars *x, int size) 
{ 
     int i, j; 
     cars temp; 

     for (i=0;i<size-1;i++) { 
      for (j = i+1; j < size; j++) { 
       if ((x+i)->hp > (x+j)->hp) { 
        temp = x[j]; 
        x[j] = x[i]; 
        x[i] = temp; 
        swaps++; 
       } 
      } 
     } 
} 

void bubbleSortA(cars *x, int size) 
{ 
    int i, j; 
    for (i = 0; i < size-1; i++) 
    { 
     for (j = 0; j < size-1-i; j++) 
     { 
      if (x[j].hp > x[j+1].hp) 
      { 
       cars temp = x[j+1]; 
       x[j+1] = x[j]; 
       x[j] = temp; 
       swaps++; 
      } 
     } 
    } 
} 

int main(void) 
{ 
    int i; 

    cars x[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} }; 
    cars y[10]={ {1,4},{1,8},{1,12},{1,6},{1,5},{1,4},{1,8},{1,12},{1,6},{1,5} }; 

    swaps=0; 
    bubbleSortA(x,10); 
    for(i=0;i<10;i++) 
     printf("%d ",x[i].hp); 
    printf("- swaps %d\n",swaps); 

    swaps=0; 
    bubbleSortB(y,10); //My sort 
    for(i=0;i<10;i++) 
     printf("%d ",y[i].hp); 
    printf("- swaps %d\n",swaps); 

} 
+0

Non capisco perché qualcuno abbia downvoted una soluzione corretta :(... –

+1

Non stai dereferenziando '(x + j)', e stai assegnando un puntatore a struct a una struttura – DevNull

+0

Ok ... Hai ragione! :) –

-1

usare una funzione di scambio come questo:

#define TYPE <your type> 
void swap(TYPE *a, TYPE *b){ 
     TYPE *temp = (TYPE*)malloc(sizeof(TYPE)); 
     *temp = *a; 
     *a = *b; 
     *b = *temp; 
     free(temp); 
} 

o questo, senza malloc:

void swap(TYPE *a, TYPE *b){ 
     TYPE temp; 
     temp = *a; 
     *a = *b; 
     *b = temp; 
} 
+0

No no no. Se i valori sono uguali, azzererai i dati. Non è un buon trucco da usare. Inoltre, non funzionerà come pensi che lo farà con le strutture. http://programmers.stackexchange.com/questions/182037/is-this-xor-value-swap-algorithm-still-in-use-or-useful – DevNull

+1

Il valore da scambiare non è un numero intero, ma una struttura! :) –

+0

@Dogbert per l'ordinamento, perché i valori dovrebbero essere scambiati se fossero uguali? Sembra un dogma, ma modificherò comunque la risposta ... –