Я изучаю 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);
}
Конечно, проблема будет функция ordinalista .... –
р всегда не нулевой –
Небольшая точка, но это было бы полезно, если бы вы могли [редактировать] (HTTP://stackoverflow.com/posts/30616913/edit) ваш вопрос: (а) распространить ваши комментарии, чтобы они были видны без горизонтальной прокрутки и (б) перевести итальянский комментарий на английский. – PJTraill