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