L'esercizio consiste nell'inserire in una lista le coppie di numeri <x,y>, in ordine di distanza dall'origine cioè secondo la formula $sqrt(x^2 +y^2)$.
N.B. So che si poteva fare in maniera più efficiente o con meno passaggi però ho cercato di farlo tutta farina del mio sacco essendo il primo esercizio del genere, motivo per il quale il codice un poco "lungo"!
- Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct punto *link;
typedef struct punto
{
float ascisse,ordinate;
link next;
} Punto;
link InserimentoListaOrd(float x, float y, link h);
link newNode(link h, float x, float y);
void inserirepunti(void);
void stampalista(link h);
int dist(float x1, float y1, float x2, float y2);
int main()
{
inserirepunti();
return 0;
}
void inserirepunti(void)
{
link h=NULL; //h puntatore a testa della lista
float x,y; //numeri da inserire richiesti all'utente
int flag=1; //flag che regola la fine dei numeri inseriti
puts("Inserimento punti:");
puts("<-1,-1> per terminare");
scanf("%f%f",&x,&y);
if(x==-1 && y==-1)
{
flag=0;
puts("Fine inserimento.");
}
while(flag)
{
if(x==-1 && y==-1)
{
flag=0;
puts("Fine inserimento.");
}
else
{
h=InserimentoListaOrd(x,y,h);
scanf("%f%f",&x,&y);
}
}
puts("\nSTAMPO LISTA:");
stampalista(h);
}
link InserimentoListaOrd(float x, float y, link h)
{
link k=h, nuovo=NULL;
if(h==NULL) //lista vuota
{
h=newNode(h,x,y); //credo il primo nodo
return h;
}
nuovo=newNode(nuovo,x,y); //arrivo qua perche' la lista non e' vuota, allora creo un nodo
if(!dist(x,y,k->ascisse,k->ordinate))
{//vedo se il nodo deve andare precedere il primo nodo
nuovo->next=k;
h=nuovo;
return h;
}
for(; k!=NULL && dist(x,y,k->next->ascisse,k->next->ordinate); k=k->next); //cerco la posizione esatta del nodo
nuovo->next=k->next;
k->next=nuovo;
return h;
}
link newNode(link h, float x, float y)
{
h=malloc(sizeof *h);
if(h==NULL)
{
puts("Errore durante l'allocazione del nodo.");
exit(1);
}
h->ascisse=x;
h->ordinate=y;
return h;
}
int dist(float x1, float y1, float x2, float y2)
{
int ritorno=0;
if(sqrt((x1*x1)+(y1*y1))>sqrt((x2*x2)+(y2*y2)))
ritorno=1;
return ritorno;
}
void stampalista(link h)
{
if(h==NULL)
return;
printf("<%.2f,%.2f> ", h->ascisse, h->ordinate);
stampalista(h->next);
}
Grazie in anticipo!!