PDA

View Full Version : Bubble Sort di una struttura con puntatori


YamIevenhere
28-10-2014, 14:47
Devo acquisire una serie di coordinate ed allocarle dinamicamente in una struct, quindi ordinarle in maniera decrescente secondo la distanza del punto dall'origine 0 0.
Ho provato ad usare un Bubble sort ma non funziona :muro: , ecco il codice:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {

int x, y;
float d_o;
} punto;

int main()
{
FILE *f1;
int i, j, end=0, tempx, tempy;
float tempd_o;
punto *p, *p2;

f1=fopen("punti.txt","r");
if (f1==NULL)
{
printf("Errore nell'apertura del file.\n");
return 0;
}
fscanf(f1,"%d", &end)
p=malloc(end*sizeof(punto));
if(p==NULL)
{
printf("Errore allocazione memoria.\n");
return 0;
}
p2=p;
for(i=0;i<end;i++)
{
fscanf(f1,"%d %d", &p2->x, &p2->y);
p2->d_o=sqrt((p2->x*p2->x)+(p2->y*p2->y));
p2++;
}
fclose(f1);

//Bubble sort
for(i=0;i<end-1;i++)
{
for(j=0;j<end-i;j++)
{
if(p[j].d_o<p[j+1].d_o)
{
tempx=p[j].x;
p[j].x=p[j+1].x;
p[j+1].x=tempx;
tempy=p[j].y;
p[j].y=p[j+1].y;
p[j+1].y=tempy;
tempd_o=p[j].d_o;
p[j].d_o=p[j+1].d_o;
p[j+1].d_o=tempd_o;

}
}
}
return 0;
}

sottovento
28-10-2014, 16:21
for(j=0;j<end-i;j++)

deve essere -1, non -i:

for(j=0;j<end-1;j++)

monte.cristo
29-10-2014, 09:31
Un paio di cose:
1) Dichiari p e p2 che di fatto puntano alla stessa area di memoria, ma dal codice che hai postato uno dei due non sembra necessario
2) L'algoritmo bubble sort è praticamente standard. Questo è lo pseudocodice della versione ottimizzata presa di wikipedia
procedure BubbleSort( A : lista di elementi da ordinare)
alto ← lenght(A) - 1
while (alto > 0) do
for i ← 0 to alto do
if (A[i] > A[i + 1]) then //scambiare il '>' con '<' per ottenere
swap ( A[i], A[i+1] ) // un ordinamento decrescente
alto ← alto - 1

Puoi semplicemente adattarla al tuo caso

sottovento
29-10-2014, 09:43
Un paio di cose:
1) Dichiari p e p2 che di fatto puntano alla stessa area di memoria, ma dal codice che hai postato uno dei due non sembra necessario

Direi di si, invece:

p2=p;
for(i=0;i<end;i++)
{
fscanf(f1,"%d %d", &p2->x, &p2->y);
p2->d_o=sqrt((p2->x*p2->x)+(p2->y*p2->y));
p2++;
}

Puntano solo inizialmente allo stesso indirizzo, poi usa p2 per scandire l'array, quindi servono entrambi per questa implementazione

monte.cristo
29-10-2014, 11:21
Edit: commento non più necessario

YamIevenhere
29-10-2014, 20:17
Grazie a tutti per le risposte! :)