[C] Coppie numeri in lista ordinata

studente_studente
Ciao, ho fatto un esercizio ma non capisco perché ad un certo punto mi spunta la finestra di windows con la scritta che il programma ha smesso di funzionare. Non capita con tutti i numeri, motivo per il quale penso sia il codice.. spero possiate dargli un'occhiata

L'esercizio consiste nell'inserire in una lista le coppie di numeri , 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"!

#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!!

Risposte
apatriarca
Non gestisci il caso in cui il nodo va inserito per ultimo e quindi il ciclo di ricerca finisce con \(k\) uguale a NULL.

studente_studente
Ciao, scusa se rispondo ora ma non avevo messo da parte la materia perché avevo l'esame di un'altra a giorni..
Grazie per la celere risposta, ora ho corretto il codice e funziona!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.