Visualizzazione dei risultati da 1 a 4 su 4

Discussione: BubbleSort lista in c

  1. #1

    BubbleSort lista in c

    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:

    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?
    codice:
      for ( ;sort->next!=NULL;sort=sort->next){
    Ringrazio tutti in anticipo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326

    Re: BubbleSort lista in c

    Originariamente inviato da bianchi88
    forze in questa istruzione c'è qualcosa che non va?
    codice:
      for ( ;sort->next!=NULL;sort=sort->next){
    Esatto. Inizializza sort a p.

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

  3. #3
    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

    codice:
    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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.
    every day above ground is a good one

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.