2015-06-03 2 views
1

Я изучаю C, поэтому простите меня за любую ошибку. (и сделать то же самое для моего плохого английского, так как я не английский.)Ошибка при попытке отсортировать список

Мне нужно отсортировать числовой список int. Это псевдокод, о том, как он должен работать:

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

Я знаю, почему, если я создаю упорядоченный список, сбой программы? Здесь вся программа:

#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 do 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); 
} 
+0

Конечно, проблема будет функция ordinalista .... –

+0

р всегда не нулевой –

+0

Небольшая точка, но это было бы полезно, если бы вы могли [редактировать] (HTTP://stackoverflow.com/posts/30616913/edit) ваш вопрос: (а) распространить ваши комментарии, чтобы они были видны без горизонтальной прокрутки и (б) перевести итальянский комментарий на английский. – PJTraill

ответ

0

minimo() Если вызывается отсортированного списка, if(p->dato < minimo) никогда не верно, так { minimo = p->dato; ritorno = p;} никогда не выполняется, так ritorno остается неинициализированным. Измените функцию:

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); 

} 
Смежные вопросы