Newsgroup: it.comp.lang.c
Titolo: Problema con una lista

Salve a tutti! Sono qua per chiedere a qualcuno perchè il programma che scrivo qui di seguito non funziona correttamente.
Vi spiego in 2 parole cosa dovrebbe fare il programma:
una volta definita una struttura con 3 interi rappresentanti le coordinate spaziali di un punto (x,y,z,), dopo aver costruito un vettore contenente n strutture di questo tipo, copiare il vettore in una lista (da creare) e ordinarla in base al valore del campo x (in ordine crescente). Fatto questo stampare la lista ordinata. 
La struttura è ok, il vettore anche, la cosa che non va giù al programma è la lista.
Ecco il programma (il dubbio è alla fine). Copiate e incollate x vedere cosa fa.
#include <stdio.h>
#include <stdlib.h>
typedef struct pt{
        int x;
        int y;
        int z;
        }punti3D;
typedef struct list_tag{
        punti3D value;
        struct list_tag *next;
        }list;
 
void ordina (list *listptr){
     punti3D t;
     int ordinato=0;
     list *tmp=listptr;
     while (!ordinato){
           ordinato=1;
           tmp=listptr;
           while(tmp && tmp->next){
              if (tmp->value.x > tmp->next->value.x){
                 ordinato=0;
                 t=tmp->value;
                 tmp->value=tmp->next->value;
                 tmp->next->value=t;
              }
           tmp=tmp->next;
           }
     }
}
list*crea_lista(punti3D *vett, int n){
   int i;
   list *lp, *tmp_lp;
   lp=(list*)malloc(sizeof(list));
   tmp_lp=lp;
   for (i=0; i<n; i++){
       lp->value=vett[i];
       lp->next=(list*)malloc(sizeof(list));
       lp=lp->next;
   }
   lp= NULL;
   lp=tmp_lp;
   ordina (tmp_lp);
   return lp;
}
int main(int argc, char *argv[]){     
    int num,i;
    punti3D *arr;
    list *list,*hlp;
    printf("\n\nInserire il numero di elementi che il vettore deve contenere: ");
    scanf("%d", &num);
    arr=(punti3D*)malloc(num*sizeof(punti3D));
    for (i=0; i<num; i++){
        printf("\n\nInserire le 3 coordinate dell'elemento numero %d del vettore\n\nx= ", i+1);
        scanf("%d", &arr[i].x);
        printf("\ny= ");
        scanf("%d", &arr[i].y);
        printf("\nz= ");
        scanf("%d", &arr[i].z);
    }
    list=crea_lista(arr, num);
    printf("\n\nLa lista ordinata in base alla coordinata x e' la seguente: ");
    while (list!=NULL){
        printf("%d  ", list->value.x);
        list = list->next;
    }
    printf("\n\n");
    free (hlp);
    system("PAUSE");
  return 0;
}
Avrete notato che a video viene stampato un valore in più dell'ultimo valore inserito dall'utente. Questo è il problema! Ho pensato: magari nella lista ho messo il NULL in un blocco successivo invece che nell'ultimo... invece a me sembra tutto ok... Vorrei sapere: è lecito fare l'istruzione lp=NULL (nella funzione crea_lista, alla riga 44 se avete copiato in un ambiente di programmazione)??? Perchè a me sembra proprio lì l'errore.. ma semanticamente è giusto! (almeno credo)... Illuminatemi per favore.. Premetto che le funzioni si dovrebbero toccare il meno possibile, mentre il main potrebbe essere modificato a piacere.
Grazie per l'attenzione!
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it


ciao, io cambierei il crea_lista cosi':
int i;
   list *lp, *tmp_lp,*pre;
pre = NULL;
   for (i=0; i<n; i++){
       lp=(list*)malloc(sizeof(list));
       if (pre)
           pre->next = lp;
       if (i == 0)
           tmp_lp = lp;
       lp->value=vett[i];
       lp->next = NULL;
       pre = lp;
   }
   lp=tmp_lp;
   ordina (tmp_lp);
   return lp;
ciao
davide

davide
Ciao, ok, cosě funziona.. ho solo un piccolo problema: il mio era il testo di un esame scritto universitario, quindi ora, che avrň l'orale, dovrň portare il programma scritto all'esame e corretto per far si che funzioni.... ma cosě č un po' troppo corretto :)
Per quello dicevo che era meglio modificare il main (che non faceva parte del compito scritto) piuttosto che le funzioni (che invece ne facevano parte!).
La mia domanda principale č: perchč pur essendo logicamente giusto mettere il NULL alla fine della lista, viene messo il NULL in un nodo succesivo a quello in cui dovrebbe essere inserito, avendo scritto l'istruzione 
lp = NULL 
nel punto in cui l'ho inserita io??? 
Grazie comunque


 }
La tua funzione crea_lista č sbagliata, va modificata, non si puň toccare
solo il main.
Se devi portarlo corretto, lo devi correggere dove deve essere corretto.