PDA

Visualizza la versione completa : BubbleSort lista in c


bianchi88
29-12-2009, 01:17
ciao a tutti, premetto che sto appena capendo le liste ho provato ad implementare una lista di n elementi, ma l'output della lista che dovrebbe essere ordinata è sbagliato.
Questo è il codice:




#include<stdio.h>
#include<stdlib.h>


struct elemento{

int info;
struct elemento *next;
};
typedef struct elemento ELEMENTO;
ELEMENTO *crea_lista(int n);
ELEMENTO *somma(ELEMENTO*,ELEMENTO*);
void visualizza(ELEMENTO*);
void BubbleSort_lista(ELEMENTO *p,int n);

int main(){

int n;
scanf("%d",&n);
ELEMENTO *punta_lista;
punta_lista=malloc(sizeof(ELEMENTO));
printf("Inserisci gli elementi nella 1° lista: \n");
*punta_lista=*crea_lista(n);
BubbleSort_lista(punta_lista,n);
printf("\nLa lista ordinata è: \n");
visualizza(punta_lista);


return 0;
}

ELEMENTO *crea_lista(int n){

ELEMENTO *p,*paus;
int i;
if (n==0)
p=NULL;
else
{
// creazione del 1° nodo
p=malloc(sizeof(ELEMENTO));
printf("dammi l'informazine\n");
scanf("%d",&p->info);
paus=p;

}
for (i=1;i<n;i++){
paus->next=malloc(sizeof(ELEMENTO));
paus=paus->next;
printf("dammi l'informazine\n");
scanf("%d",&paus->info);
}
paus->next=NULL;

return p;
}

void BubbleSort_lista(ELEMENTO *p,int n){

ELEMENTO *sort;
if (n==0) return; // se lista vuota esci

else{
int flag,temp;

do {
flag=0;
for ( ;sort->next!=NULL;sort=sort->next){
if (sort->info>(sort->next)->info){
temp=sort->info;
sort->info=(sort->next)->info;
(sort->next)->info=temp;
flag=1;
}
}
}
while (flag); // finchè c'è almeno uno scambio, ricomincia il ciclo
}
}

void visualizza(ELEMENTO *p){

printf("Punta_lista---->");
while (p!=NULL){
printf(" %d ",p->info);
p=p->next;
}
printf(" NULL ");
}


forze in questa istruzione c'è qualcosa che non va?


for ( ;sort->next!=NULL;sort=sort->next){


Ringrazio tutti in anticipo.

YuYevon
29-12-2009, 08:28
Originariamente inviato da bianchi88
forze in questa istruzione c'è qualcosa che non va?


for ( ;sort->next!=NULL;sort=sort->next){



Esatto. Inizializza sort a p.



for (sort = p; sort -> next != NULL; sort = sort -> next) {

bianchi88
29-12-2009, 15:28
Grazie hai ragione, ora funziona.
Ho solo un piccolo dubbio:
se noi abbiamo un array di n elementi e vogliamo confrontare tutti gli elementi, arrivato all'ultimo elemento ci fermiamo




for (i=0;i<n-1;i++)
if (V[i]>V[i+1])


ci fermiamo a n-1 ma in una lista di interi come si fa a fermare all'elemento precedente a NULL?

YuYevon
29-12-2009, 15:40
Originariamente inviato da bianchi88
ma in una lista di interi come si fa a fermare all'elemento precedente a NULL?

Con sort -> next != NULL, come hai specificato nel ciclo for, ti fermi proprio all'ultimo elemento. Se vuoi fermarti a quello ancora precedente basta fare sort -> next -> next != NULL. Comunque nel tuo programma ci va bene sort -> next != NULL, questo perché appunto una volta arrivato all'elemento il cui campo next è nullo (ossia l'ultimo) si deve fermare e non deve fare un ulteriore controllo, proprio come se fosse l'elemento di indice n-1 di un array.

Loading