Salve a tutti ragazzi. Sto cercando di creare il bubble sort per ordinare una lista dove per esempio ogni nodo della lista non contiene un solo valore come per esempio un intero ma contiene una struttura dati supponiamo che contenga un nome e una data.
Ora se volessi ordinare questa lista per giorno mese anno, quello che voglio fare è scambiare i nodi e non i valori all'interno dei nodi, perchè se scambiassi solo i valori, assocerei a un determinato nome una data diversa.
Ora io ho cercato di fare un algoritmo che mi scambia i nodi, l'ho provato e funziona solo nel caso in cui le date nella lista sono inserite dalla più grande alla più piccola (quando si inseriscono bisogna metterle dalla più piccola alla più grande perchè l'inserimento è fatto in testa).
Io credo che ci sia un modo molto più semplice di fare questo ordinamento, ma purtroppo non ci sono arrivato.
Posto il codice, ma preferirei trovare un metodo più semplice per risolvere il problema
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct nodo
{
struct data
{
int giorno;
int mese;
int anno;
}data0;
struct nodo *next;
}Nodo;
typedef Nodo *NodoPtr;
int inserisci_date(NodoPtr *testa);
void bubble_sort_date(NodoPtr *testa, int n_date);
void stampa_date(NodoPtr testa);
int main (void)
{
printf("========================Ordinamento di date========================\n\n");
NodoPtr headPtr = NULL;
int i;
i = inserisci_date(&headPtr);
puts("Unsorted date");
puts("");
stampa_date(headPtr);
printf("\n\n");
bubble_sort_date(&headPtr,i);
puts("Sorted date");
stampa_date(headPtr);
system("pause");
return 0;
}
int inserisci_date(NodoPtr *testa)
{
char x = 's';
int i=0;
while (x == 's')
{
NodoPtr nuovoPtr = malloc(sizeof(Nodo));
if (nuovoPtr != NULL)
{
printf("Inserisci giorno mese anno (gg/mm/aaaa): ");
fflush(stdin);
scanf("%d/%d/%d", &nuovoPtr->data0.giorno, &nuovoPtr->data0.mese, &nuovoPtr->data0.anno);
nuovoPtr->next = *testa;
*testa = nuovoPtr;
i++;
}
else
printf("Impossibile allocare memoria\n");
printf("Vuoi inserire un'altra data?: ");
fflush(stdin);
scanf("%c", &x);
}
return i;
};
void bubble_sort_date(NodoPtr *testa, int n_date)
{
NodoPtr i = NULL;
NodoPtr j = NULL;
NodoPtr itemp = NULL;
NodoPtr jtemp = NULL;
NodoPtr vartemp = NULL;
int ordinato = 1;
int h;
for (h=0; n_date<h-1; h++)
{
for (i=(*testa), itemp=i; i->next!=NULL; i=i->next, itemp=i)
{
for(j=i->next, jtemp=j; j->next!= NULL;j=j->next, jtemp=j, i=itemp)
{
//itemp=i;
//jtemp1=j;
if(i->data0.anno > j->data0.anno)
{
if(i==(*testa))
{
i=j;
j=itemp;
j->next=i->next;
i->next=j;
(*testa)=i;
vartemp=i;
}
else
{
i=j;
j=itemp;
j->next=i->next;
i->next=j;
vartemp->next=i;
}
}
else
{
}
}
}
}
};
void stampa_date(NodoPtr testa)
{
while (testa != NULL)
{
printf("%d/%d/%d\n", testa->data0.giorno, testa->data0.mese, testa->data0.anno);
testa = testa->next;
}
puts("");
};