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
Post a Comment