Riordinare una lista

di il
9 risposte

Riordinare una lista

Ho realizzato questo programma, che stampa in ordine crescente i numeri inseriti, cosa mi consigliate di fare per fare un'ulteriore aggiunta che stampi i numeri ottenuti con un ordine che metta al primo posto il valore in mezzo alla sequenza dei numeri inseriti?

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


struct nodo {
  int info;
  struct nodo *next;
};


/*
**  leggi_lista
*/

struct nodo *leggi_lista(void) {
  int a;
  struct nodo *p, *primo;

  primo = NULL;
	printf("\nNumero:");
  scanf("%d", &a);
  while (a != 0) {
    p =(struct nodo*) malloc(sizeof(struct nodo));
    p->info = a;
    p->next = primo;
    primo = p;
    printf("\nNumero:");
    scanf("%d", &a);
  }
  return(primo);
}


/*
**  stampa_lista
*/

void stampa_lista(struct nodo *primo) {
  while (primo != NULL) {
    printf("\n\n%d ", primo->info);
    primo = primo->next;
  }
  return;
}


/*
**  bubble_sort
*/

struct nodo *bubble_sort(struct nodo *primo) {
  struct nodo *p, *ultimo;
  int flag, appo;

  ultimo = NULL;

  flag = 1;
  while (flag == 1) {
    p = primo;
    flag = 0;
    while (p->next != ultimo) {
      if (p->info > (p->next)->info) {
        appo = p->info;
        p->info = (p->next)->info;
        (p->next)->info = appo;
        flag = 1;
      }
      p = p->next;
    }
    ultimo = p;
  }

  return(primo);
}


/*
**  main
*/

int main(void) {
  struct nodo *primo;

  printf("Inserisci gli elementi (0 per terminare):\n");
  primo = leggi_lista();
  primo = bubble_sort(primo);
  stampa_lista(primo);

  return(1);
}

9 Risposte

  • Re: Riordinare una lista

    che stampi i numeri ottenuti con un ordine che metta al primo posto il valore in mezzo alla sequenza dei numeri inseriti
    Cioè? Cosa intendi per "valore in mezzo alla sequenza"? Se ho 10 valori quale ti do, il quinto o il sesto? E al secondo posto cosa metto? Prendo dalla sequenza rimasta dopo aver "estratto" il precedente?
    Prova a spiegare meglio ed eventualmente fai qualche esempio
  • Re: Riordinare una lista

    Cioè? Cosa intendi per "valore in mezzo alla sequenza"? Se ho 10 valori quale ti do, il quinto o il sesto? E al secondo posto cosa metto? Prendo dalla sequenza rimasta dopo aver "estratto" il precedente?
    Prova a spiegare meglio ed eventualmente fai qualche esempio
    ho tralasciato il fatto che devono essere dispari e per far ciò devo lavorare ancora sul ciclo while o do-while ma ancora non riesco ad ottenere un risultato soddisfacente
    consideriamo questi 7 numeri inseriti:

    5 - 76 - 34 - 40 - 60 - 15 - 25

    il programma dovrà leggere, ordinare (5<15<25<34<40<60<76) e stampare in questa maniera

    34 - 25 - 40 - 15 - 60 - 5 - 76

    spero di essermi spiegato un pò meglio :p
  • Re: Riordinare una lista

    Ecco ho risolto il "problema" dei numeri pari, se la successione è pari faccio ripartire dall'inizio
    do{
    		primo = NULL;
    	printf("\nNumero:");
      scanf("%d", &a);
      while (a != 0) {
        p =(struct nodo*) malloc(sizeof(struct nodo));
        p->info = a;
        p->next = primo;
        primo = p;
        printf("\nNumero:");
        scanf("%d", &a);
        conta=conta+1;
        resto=conta % 2;
        
    	}					
    	if(resto==0)
    	{ system("CLS");
    	printf("Errore la successione inserita e' pari!\n\n"); 
    	}
      }while(resto==0);
     
      return(primo);
    ora m rimane di risolvere come ho scritto sopra attenderò i vostri consigli
  • Re: Riordinare una lista

    A meno che tu non debba per forza lavorare con la lista, potresti caricare un array temporaneo e lavorare con questo.
    Determini l'indice centrale, chiamiamolo i (nel tuo esempio di 7 valori, i verrà caricato con 3);
    predisponi una variabile booleana chiamala 'sx' (ma potresti chiamarla anche 'dx' invertendo la logica) che parte da 'true';
    predisponi una variabile intera 'salto' che parte da 1;
    fai un ciclo di questo tipo
    a) se sx è true fai i=i-salto altrimenti fai i=i+salto
    b) se i non è nel range [0,lunghezza] (dove nel tuo caso lunghezza è 7-1) allora esci dal ciclo
    c) prendi il valore dall'array all'indice
    d) se sx è true allora sx = false altrimenti sx = true
    e) salto = salto + 1
    f) riparti da a)
  • Re: Riordinare una lista

    Mh...buona idea , devo provare, comunque la necessità della lista ce l'ho solo all'inizio perchè il numero degli elementi non deve essere finito nè scelto dall'utente prima di inserirli.

    il tuo procedimento era proprio quello che pensavo io, utilizzare un array e utilizzare la variabile "conta", che m contava il numero degli elementi inseriti (meno lo 0), come indice.
    ma nn avendolo mai fatto di unire liste ed array, a che punto del codice posso inserire l'array e il ciclo for?
  • Re: Riordinare una lista

    mh...buona idea , devo provare, comunque la necessità della lista ce l'ho solo all'inizio perchè il numero degli elementi non deve essere finito nè scelto dall'utente prima di inserirli.
    Un array lo puoi usare anche se non conosci a priori il numero degli elementi; nel tuo caso potresti partire con un array di 100 interi e implementare sistemi di reallocazione nel momento in cui l'utente "sfora" una certa soglia.
    Secondo me non ha senso usare una lista; la struttura dati deve essere scelta soprattutto in base alle operazioni che si vogliono eseguire sui dati contenuti.
  • Re: Riordinare una lista

    Non hai tutti i torti, ma se volessi tentare ad utilizzare entrambe le strutture dati? si può fare? se si, come ho detto prima, dove posso inserire l'array temporaneo? dopo il bubble sort o prima?
  • Re: Riordinare una lista

    Devi decidere tu. Lo puoi fare dove vuoi.
    Ti suggerisco di creare una funzione a cui passi la lista e lui te la "riordina", utilizzando un array temporaneo allocato sulla base della dimensione della lista in input, e in output ti ricarica la lista secondo la sequenza che si viene a trovare nell'array temporaneo ordinato.
    Poi questa funzione la chiami da dove vuoi tu.
  • Re: Riordinare una lista

    Farò come hai detto, credo che inserire l'array nel punto in cui faccio stampare i numeri inseriti ordinandoli dal più piccolo al più grande sia più giusto, così utilizzo l'array di dimensione [conta] e da lì li "riordino" nuovamente utilizzando il calcolo del valore mediano che poi servirà per determinare l'elemento posto nel punto centrale della sequenza e così via, così dovrebbe funzionare, ci lavoro un pò e poi scrivo il risultato per renderti partecipe dato che sei stato molto gentile e utile
Devi accedere o registrarti per scrivere nel forum
9 risposte