ORDINAMENTO LISTA
Salve...
Ho un bel problemuccio con una lista di interi...
In un esercizio mi si chiede di ordinare questa in senso crescente, e fino a qua non dovrebbero esserci problemi, lo saprei fare a occhi chiusi... Il fatto è che la lista deve essere ordinata NON scambiando la parte numerica dei nodi, ma modificando i collegamenti fra gli elementi...
Io quindi ho pensato di spostare in testa l'elemento che a ogni iterazione trovo maggiore, ma come posso fare per rendere la soluzione generalizzabile?
Ho un bel problemuccio con una lista di interi...
In un esercizio mi si chiede di ordinare questa in senso crescente, e fino a qua non dovrebbero esserci problemi, lo saprei fare a occhi chiusi... Il fatto è che la lista deve essere ordinata NON scambiando la parte numerica dei nodi, ma modificando i collegamenti fra gli elementi...
Io quindi ho pensato di spostare in testa l'elemento che a ogni iterazione trovo maggiore, ma come posso fare per rendere la soluzione generalizzabile?
Risposte
Utilizzando una lista bidirezionale, credo sia sufficiente scambiare i 2 puntatori, al predecessore e al successore, quando, nei vari confronti presenti nel solito algoritmo di sort, si incontrano due nodi con la parte informativa che non rispetta l'ordinamento.
Però nel testo dell'esercizio c'è scritto di modificare una lista FIFO lineare e monodirezionale... Un modo lo conosco, ma non è generalizzabile... Quindi non va bene...
Anche con una lista linkata semplice, le cose non andrebbero molto diversamente ... sarebbe sufficiente conservare, ad ogni avanzamento nella lista, in una variabile d'appoggio, il link del nodo dal quale si proviene.
prova a guardare questo se puo essert iutile
http://www.fuoridalbranco.com/unife.it/ ... (algoritmo)%20mergesort%20di%20linked%20list.c
spero il collegamento vada.
E' un mergesort di una linked list unidirezionale, ordinata in base ad un valore intero. Ovviamente viene ordinata muovendo i puntatori.
http://www.fuoridalbranco.com/unife.it/ ... (algoritmo)%20mergesort%20di%20linked%20list.c
spero il collegamento vada.
E' un mergesort di una linked list unidirezionale, ordinata in base ad un valore intero. Ovviamente viene ordinata muovendo i puntatori.
Il Link indicato da gigilatrottola mi da "accesso negato!" (non ho sbirciato...)
Dopo aver litigato un po' coi puntatori C++
(non li usavo da un pezzo), posto un abbozzo di soluzione, pare funzionante, senz'altro migliorabile.
Il sort utilizzato è un banale sort per selezione.
Dopo aver litigato un po' coi puntatori C++
Il sort utilizzato è un banale sort per selezione.
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#define tappo -1
using namespace std;
// La lista semplice è composta da alcuni nodi linkati
// tra loro; ogni nodo è definito con una struttura
// che contiene un numero intero >0 e un puntatore al successivo.
struct Nodo
{
int Info; // per memorizzare un numero intero
Nodo* Next; // puntatore al nodo successivo
};
Nodo* Succ; // puntatore al nodo successivo
Nodo* First; // puntatore al primo elemento
Nodo* Prec; // puntatore al nodo precedente dell'ultimo inserito
/******************************************************************************/
void scambia() // scambia il contenuto informativo di 2 nodi
{
int x;
x = Prec -> Info;
Prec -> Info = Succ -> Info;
Succ -> Info = x;
}
/******************************************************************************/
void ordina() // ordina la lista in base al campo Info in senso crescente
{
cout << "ordinamento ...";
Prec = First;
while (Prec -> Next -> Next != 0)
{
Succ = Prec -> Next;
while (Succ -> Next -> Next != 0)
{
if (Prec -> Info > Succ -> Info)
scambia();
Succ = Succ -> Next;
}
Prec = Prec -> Next;
}
}
/******************************************************************************/
void stampa()
{
cout << endl;
cout << "lista ordinata:" << endl;
Succ = First;
while (Succ -> Next != 0) // stampa il contenuto della lista
{
if (Succ -> Info != tappo)
cout << Succ -> Info << " ";
Succ = Succ -> Next;
}
cout << endl;
}
/******************************************************************************/
void leggi() // chiede i numeri e li pone nella lista
{
int num;
Succ = First;
do
{
cout << "Immetti un numero: " ;
cin >> num;
Succ -> Info = num; // memorizza il numero nel campo Info del nodo
Prec = Succ; // conserva il nodo precedente
Succ = new Nodo; // crea un nuovo nodo
Succ -> Next = 0 ; // il nuovo nodo è posto in coda alla lista
Prec -> Next = Succ; // il nuovo nodo è agganciato dal precedente
}
while (num != tappo);
}
/****************************** M A I N ***************************************/
void main()
{
First = new Nodo; // crea il primo nodo
leggi();
ordina();
stampa();
system ("pause");
return 0;
}
Si può usare questo programmino come base di una gestione di lista linkata più efficiente.
Da accesso negato perke va copiato tutto... 
Nel mio esempio invece de lselection si usa il mergesort
Nel mio esempio invece de lselection si usa il mergesort
"lorven":
Il Link indicato da gigilatrottola mi da "accesso negato!" (non ho sbirciato...)
Dopo aver litigato un po' coi puntatori C++(non li usavo da un pezzo), posto un abbozzo di soluzione, pare funzionante, senz'altro migliorabile.
Grazie... Ho cercato di interpretare il tuo algoritmo, pare che possa funzionare... Comunque l'esame l'ho già dato, ieri sera, parlava di stringhe e codifica di particolari parole composte da numeri e lettere.. Dovrei averlo fatto bene, stasera ho gli orali...
Speriamo bene!
Fatto!! Un bel 30... Che bella la programmazione!!
[size=150]30![/size]