[C] Coppie numeri in lista ordinata

Messaggioda studente-studente » 18/08/2017, 15:09

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 <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!!
studente-studente
Junior Member
Junior Member
 
Messaggio: 210 di 472
Iscritto il: 13/07/2016, 21:43

Re: [C] Coppie numeri in lista ordinata

Messaggioda apatriarca » 19/08/2017, 13:08

Non gestisci il caso in cui il nodo va inserito per ultimo e quindi il ciclo di ricerca finisce con \(k\) uguale a NULL.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4762 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Coppie numeri in lista ordinata

Messaggioda studente-studente » 08/09/2017, 10:51

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!
studente-studente
Junior Member
Junior Member
 
Messaggio: 229 di 472
Iscritto il: 13/07/2016, 21:43


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite