Buongiorno a tutti,
vi posto una bozza di codice che dovrebbe chiedere all'utente una coppia di dati (una stinga e un numero reale) fin quando non si digita la parola END. I dati devono essere inseriti in una lista dinamica che deve essere ordinata in modo decrescente per il 'campo' numero reale e poi stampare il tutto. Ho pensato di inserire il primo dato, ovviamente già ordinato e poi ad ogni inserimento da tastiera, scorrere la lista fino alla posizione decrescente corretta.

C'è qualcosa che non va, me ne accorgo dal ciclo while con le printf in fondo. Dove c'è scritto DEBUG: sono miei controlli per capire se il programma gira e dove si intoppa

codice:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

int main ()
{
    char buffer[100];
    char fine[4]="end";
    struct nodo        //struttura elementi della lista
    {
        char nome[100];
        double dato;
        struct nodo *next;
    } nodo;
    struct nodo *p, *p_aux, *nuovo, *temp;//
    p=NULL;
    temp=NULL;
    p_aux=NULL;
    printf("Inserire il nome del luogo.\nAltrimenti inserire il valore 'end' per terminare l'inserimento.\n");
    scanf("%s", buffer);
    if (strcmp(fine, buffer)==0)
        printf("Non e' stato inserito alcun luogo.");
    else
    {
        while (strcmp(buffer,fine)!=0)
        {
            //il dato nuovo viene immagazzinato in temp
            temp = (struct nodo*)malloc(sizeof(nodo));
            strcpy(temp->nome, buffer);
            printf("DEBUG: %s %s\n",buffer, temp->nome);
            printf("Inserire il valore di concentrazione:\n");
            scanf("%lf", &temp->dato);
            printf("DEBUG: %lf\n", temp->dato);
            temp->next=NULL;
            printf("DEBUG: temp->next=null\n");
           if (p==NULL)         //se la lista e' vuota
           {
               printf("DEBUG: entro in if p==null\n");
               p=(struct nodo*)malloc(sizeof(nodo));
               strcpy(p->nome, temp->nome);
               printf("DEBUG: %s\n", p->nome);
               printf("DEBUG: %s\n", p->nome);
               p->dato=temp->dato;
               printf("DEBUG: %lf\n", p->dato);
               p->next=NULL;
           }
           else         //se la lista non e' vuota
           {
               temp->next=p;
               while (temp->next!=NULL)     //finche' non termina la lista
               {
                    if (temp->next->dato<temp->dato)        //se il nuovo dato e' maggiore dell'attuale massimo
                    {
                        nuovo=malloc(sizeof(struct nodo));
                        strcpy(nuovo->nome,temp->nome);
                        printf("DEBUG: %s\n", nuovo->nome);
                        printf("DEBUG: ");
                        nuovo->dato=temp->dato;
                        printf("%lf\n", nuovo->dato);
                        printf("DEBUG: ");
                        nuovo->next=p;
                        temp->next=NULL;
                    }
                    else            //se invece non e' il massimo
                    {
                        nuovo=malloc(sizeof(struct nodo));
                        strcpy(nuovo->nome,temp->nome);
                        printf("DEBUG: %s\n", nuovo->nome);
                        printf("DEBUG: ");
                        nuovo->dato=temp->dato;
                        printf("DEBUG: %lf\n", nuovo->dato);
                        printf("DEBUG: ");
                        p->next=nuovo;
                        printf("DEBUG: ");
                        nuovo->next=NULL;
                        printf("DEBUG: ");
                        temp->next=NULL;
                        printf("DEBUG: ");
                    }
               }
            }
            printf("Inserire il nome del luogo. Inserire il valore 'end' per terminare l'inserimento.\n");
            scanf("%s", buffer);
            temp=temp->next;        //scorro la lista verso il prossimo elemento
            printf("DEBUG: ");
        }
    }
    p_aux=malloc(sizeof(struct nodo));
    p_aux->next=p;
    //stampo la lista
    while (p_aux->next!=NULL)
    {
        printf("p_aux->next->nome: %s\n", p_aux->next->nome);
        printf("p_aux->next->dato: %lf\n", p_aux->next->dato);
        p_aux=p_aux->next;
    }
    return 0;
}
Grazie

Daniele