尝试对列表进行排序时崩溃

时间:2015-06-03 10:02:34

标签: c list sorting crash

我正在学习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); 
}

1 个答案:

答案 0 :(得分: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);

}