Tags:
tag this topic
create new tag
view all tags
---+ Homework 4 - ordinamento di una lista di numeri Il cuore dell'esercizio è l'ordinamento di una lista di numeri. La lista è implementata come un vettore di 100 nodi, ovvero coppie *<valore, next>* di 100 elementi in cui * il primo elemento della coppia contiene il *valore* del nodo (numero intero) * il secondo elemento della coppia può contenere: * il valore *-1* che indica che non c'è un nodo seguente nella lista (questo è l'ultimo) * oppure l'indice del prossimo elemento nel vettore di coppie Per gestire l'inserimento e la cancellazione di nodi dalla lista dovete prevedere di manipolare 2 liste: * la lista dei nodi vuoti, realizzata all'inizio come segue: * all'inizio tutti i nodi contenuti nel vettore hanno valore 0 (zero) e ciascun nodo punta alla posizione successiva, il nodo a indice 99 ha *next=-1* * la lista dei valori inseriti, presi mano a mano dalla lista dei nodi vuoti (add) oppure rimessi sulla lista dei nodi vuoti (del) ---++ Inserimento dell'input Il vostro programma riceve una successione di comandi indicati da una lettera, seguita sulle righe successive da eventuali parametri: * *A* (Add) aggiunge un elemento *in testa alla lista*, con 1 argomento: * *Valore*, un intero a 32 bit da memorizzare nella lista * ovvero prende il primo elemento della lista dei nodi liberi e lo aggiunge in testa alla lista di valori, modificandone valore e campo next * *D* (Del) toglie il primo elemento dalla lista di valori e lo "rilascia", ovvero lo inserisce come primo elemento nella lista di nodi liberi, senza azzerarne il valore * *V* (stampa Vettore) * stampa su una riga tutti gli elementi del vettore separati da spazio, ed in fondo un accapo * Esempio: valore0 next0 valore1 next1 valore 2 next2 .... valore99 next99 * *P* (Print) stampa su una riga la lista di valori nell'ordine di visita dei nodi (seguendo il campo next) separati da spazio, e con un accapo in fondo * *Q* (Quit) termina il programma * *S* (Sort) ordina la lista di valori con l'algoritmo che preferite ---++ Ordinamento Per ordinare la lista potete usare un qualsiasi algoritmo di ordinamento a piacere, *ma ATTENZIONE:* * i nodi della lista NON si devono muovere, l'unica cosa che potete cambiare sono i puntatori al prossimo elemento Tra gli algoritmi di ordinamento, i più adatti ad una implementazione tramite una lista sono: * *insertionSort* o *selectionSort* (più semplici) * *mergesort* (più complicato) con l'accortezza di: * realizzare la routine *merge* aggiungendo alla lista risultante il minimo tra i due primi nodi delle due liste da fondere solo DOPO aver già fuso il resto delle due liste (quindi dopo la chiamata ricorsiva) * realizzare la routine *mergesort* spezzando la lista da ordinare in due liste di metà lunghezza: * o visitando la lista e spezzandola dopo N/2 nodi * oppure visitando la lista e costruendo con i suoi elementi due liste contenenti i nodi in posizione pari ed in posizione dispari nella lista originale (anche qui può convenire farlo in uscita dalla ricorsione) * NOTA: nella versione con liste non è necessario un vettore di appoggio ---++Esempio Se l'input (commentato con l'indice al primo elemento della lista, l'indice al primo elemento della lista di nodi liberi, e col contenuto del vettore) è <verbatim> # List | Free | Vettore V # -1 | 0 | 0 1 0 2 0 3 0 4 0 5 ... 0 99 0 -1 A # Add 10 10 # 0 | 1 | 10 -1 0 2 0 3 0 4 0 5 ... 0 99 0 -1 A # Add 20 20 # 1 | 2 | 10 -1 20 0 0 3 0 4 0 5 ... 0 99 0 -1 A # Add 12 12 # 2 | 3 | 10 -1 20 0 12 1 0 4 0 5 ... 0 99 0 -1 D # 1 | 2 | 10 -1 20 0 12 3 0 4 0 5 ... 0 99 0 -1 V # stampa del vettore A # Add 14 14 # 2 | 3 | 10 -1 20 0 14 1 0 4 0 5 ... 0 99 0 -1 A # Add 94 94 # 3 | 4 | 10 -1 20 0 14 1 94 2 0 5 ... 0 99 0 -1 P # stampa della lista V # stampa del vettore S # ordinamento # 0 | 4 | 10 2 20 3 14 1 94 -1 0 5 ... 0 99 0 -1 P # stampa della lista V # stampa del vettore D # cancello il primo nodo, che ora è nella lista Free # 2 | 0 | 10 4 20 3 14 1 94 -1 0 5 ... 0 99 0 -1 P # stampa della lista V # stampa del vettore Q # uscita dal programma </verbatim> La lista che abbiamo costruito contiene nell'ordine gli elementi: *94 -> 14 -> 20 -> 10* E quindi l'output (commentato e con qualche spazio aggiunto) sarà: <verbatim> 0 1 0 2 0 3 0 4 0 5 ... 0 99 0 -1 # nessun nodo inserito, il vettore contiene solo la lista dei nodi vuoti 10 -1 20 0 12 3 0 4 0 5 ... 0 99 0 -1 # dopo la cancellazione del valore 12 il vettore appare così 94 14 20 10 # sono stati inseriti 4 valori, appaiono in ordine inverso perchè ogni inserimento è un "push" sulla lista 10 -1 20 0 14 1 94 2 0 5 ... 0 99 0 -1 # dopo che sono stati inseriti anche gli altri valori il vettore appare così 10 14 20 94 # dopo il sort la lista è ordinata in ordine crescente 10 2 20 3 14 1 94 -1 0 5 ... 0 99 0 -1 # ed il vettore appare così (i valori non si sono mossi, sono cambiati solo i campi "next" dei nodi) 14 20 94 # i nodi rimasti dopo aver cancellato il primo 10 4 20 3 14 1 94 -1 0 5 ... 0 99 0 -1 # ora il nodo a indice 0 è nella lista Free, mentre i valori partono dal nodo a indice 2 </verbatim> ---++ Consegna entro il 31 maggio Per consegnare usate la solita [[http://twiki.di.uniroma1.it/~andrea/consegna-HW-2017.html][pagina]] La [[%ATTACHURL%][pagina dei test]] per ora contiene alcuni esempi costruiti a mano, appena posso li verifico con la mia implementazione
E
dit
|
A
ttach
|
Watch
|
P
rint version
|
H
istory
: r4
<
r3
<
r2
<
r1
|
B
acklinks
|
V
iew topic
|
Ra
w
edit
|
M
ore topic actions
Topic revision: r4 - 2017-05-18
-
AndreaSterbini
Log In
or
Register
Architetture2/MZ/AA16_17 Web
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
Prenotazioni esami
Laurea Triennale ...
Laurea Triennale
Algebra
Algoritmi
Introduzione agli algoritmi
Algoritmi 1
Algoritmi 2
Algoritmi per la
visualizzazione
Architetture
Prog. sist. digitali
Architetture 2
Basi di Dati
Basi di Dati 1 Inf.
Basi di Dati 1 T.I.
Basi di Dati (I modulo, A-L)
Basi di Dati (I modulo, M-Z)
Basi di Dati 2
Calcolo
Calcolo differenziale
Calcolo integrale
Calcolo delle Probabilitą
Metodi mat. per l'inf. (ex. Logica)
canale AD
canale PZ
Programmazione
Fond. di Programmazione
Metodologie di Programmazione
Prog. di sistemi multicore
Programmazione 2
AD
EO
PZ
Esercitazioni Prog. 2
Lab. Prog. AD
Lab. Prog. EO
Lab. Prog. 2
Prog. a Oggetti
Reti
Arch. di internet
Lab. di prog. di rete
Programmazione Web
Reti di elaboratori
Sistemi operativi
Sistemi Operativi (12 CFU)
Anni precedenti
Sistemi operativi 1
Sistemi operativi 2
Lab. SO 1
Lab. SO 2
Altri corsi
Automi, Calcolabilitą
e Complessitą
Apprendimento Automatico
Economia Aziendale
Elaborazione Immagini
Fisica 2
Grafica 3D
Informatica Giuridica
Laboratorio di Sistemi Interattivi
Linguaggi di Programmazione 3° anno Matematica
Linguaggi e Compilatori
Sistemi Informativi
Tecniche di Sicurezza dei Sistemi
ACSAI ...
ACSAI
Computer Architectures 1
Programming
Laurea Magistrale ...
Laurea Magistrale
Percorsi di studio
Corsi
Algoritmi Avanzati
Algoritmica
Algoritmi e Strutture Dati
Algoritmi per le reti
Architetture degli elaboratori 3
Architetture avanzate e parallele
Autonomous Networking
Big Data Computing
Business Intelligence
Calcolo Intensivo
Complessitą
Computer Systems and Programming
Concurrent Systems
Crittografia
Elaborazione del Linguaggio Naturale
Estrazione inf. dal web
Fisica 3
Gamification Lab
Information Systems
Ingegneria degli Algoritmi
Interazione Multi Modale
Metodi Formali per il Software
Methods in Computer Science Education: Analysis
Methods in Computer Science Education: Design
Prestazioni dei Sistemi di Rete
Prog. avanzata
Internet of Things
Sistemi Centrali
Reti Wireless
Sistemi Biometrici
Sistemi Distribuiti
Sistemi Informativi Geografici
Sistemi operativi 3
Tecniche di Sicurezza basate sui Linguaggi
Teoria della
Dimostrazione
Verifica del software
Visione artificiale
Attivitą complementari
Biologia Computazionale
Design and development of embedded systems for the Internet of Things
Lego Lab
Logic Programming
Pietre miliari della scienza
Prog. di processori multicore
Sistemi per l'interazione locale e remota
Laboratorio di Cyber-Security
Verifica e Validazione di Software Embedded
Altri Webs ...
Altri Webs
Dottorandi
Commissioni
Comm. Didattica
Comm. Didattica_r
Comm. Dottorato
Comm. Erasmus
Comm. Finanziamenti
Comm. Scientifica
Comm Scientifica_r
Corsi esterni
Sistemi Operativi (Matematica)
Perl e Bioperl
ECDL
Fondamenti 1
(NETTUNO)
Tecniche della Programmazione 1° modulo
(NETTUNO)
Seminars in Artificial Intelligence and Robotics: Natural Language Processing
Informatica generale
Primo canale
Secondo canale
II canale A.A. 10-11
Informatica
Informatica per Statistica
Laboratorio di Strumentazione Elettronica e Informatica
Progetti
Nemo
Quis
Remus
TWiki ...
TWiki
Tutto su TWiki
Users
Main
Sandbox
Home
Site map
AA web
AAP web
ACSAI web
AA2021 web
Programming web
AA2021 web
AN web
ASD web
Algebra web
AL web
AA1112 web
AA1213 web
AA1920 web
AA2021 web
MZ web
AA1112 web
AA1213 web
AA1112 web
AA1314 web
AA1415 web
AA1516 web
AA1617 web
AA1819 web
Old web
Algo_par_dis web
Algoreti web
More...
AA16_17 Web
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
View
Raw View
Print version
Find backlinks
History
More topic actions
Edit
Raw edit
Attach file or image
Edit topic preference settings
Set new parent
More topic actions
Account
Log In
Register User
Questo sito usa cookies, usandolo ne accettate la presenza. (
CookiePolicy
)
Torna al
Dipartimento di Informatica
E
dit
A
ttach
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback