c - Crash while trying to sort a list -


i learning c, forgive me error. (and same bad english, since not english.)

i have sort numerical int list. pseudocode, on how should work:

/* takes minimum of entire list , put on first position, takes minimum of entire list starting second position, , etc... */ while(list != null){     min = minimum(list);     swap(min->dato, list->dato);     list = list->next; } 

i know, why if create sorted list, program crash? here, entire program:

#include <stdlib.h> #include <stdio.h> #include <stdbool.h>  struct elemento{        int dato;        struct elemento *next; };  struct elemento *crealista(); void printlista(struct elemento *); struct elemento *ordinalista(struct elemento *); struct elemento *minimo(struct elemento *);  main(){      struct elemento * lista = crealista();      printf("prima: \n");     printlista(lista);     printf("dopo: \n");     printlista(ordinalista(lista));      system("pause");   }  void printlista(struct elemento *p){       printf("start->");      while(p != null){              printf("%d->",p->dato);              p = p->next;      }      printf("null \n");  }  struct elemento *minimo(struct elemento *p){        int minimo = p->dato;        struct elemento * ritorno;        while(p != null){               if(p->dato < minimo){ minimo = p->dato; ritorno = p;}           p= p->next;               }        return(ritorno);  } struct elemento *ordinalista(struct elemento *p){     bool flag = false;     int temp;     struct elemento * start = p;     struct elemento * min;          while(p != null){                 min = minimo(p);               temp = p->dato;               p->dato = min->dato;               min->dato = temp;            p=p->next;          }      return (start); }  struct elemento *crealista(){     struct elemento *p,*p2;      int i,n;     p = (struct elemento *)malloc(sizeof(struct elemento)); //p diventa un puntatore di tipo elemento, alla porzione di memoria restituita da malloc     printf("gimme first dato: "); scanf("%d",&p->dato);     printf("\nhow many dato u want?: "); scanf("%d",&n);     if(n>0){              p2 = p;         for(i=0; i<n; i++){               p2->next = (struct elemento *)malloc(sizeof(struct elemento));               p2 = p2->next;               printf("\ngimme %d dato: ",i); scanf("%d",&p2->dato);         }         p2->next = null;     }else{p->next = null;}     return (p);  } 

if minimo() called on sorted list, if(p->dato < minimo)is never true, { minimo = p->dato; ritorno = p;} never executed, ritorno left uninitialized. change function to:

struct elemento *minimo(struct elemento *p){        int minimo = p->dato;        struct elemento * ritorno = p;   //this line changed!        while(p != null){               if(p->dato < minimo){ minimo = p->dato; ritorno = p;}           p= p->next;               }        return(ritorno);  } 

Comments