Preliminars
En aquest exercici treballarem sobre la següent estructura de dades, que ens serveix per a mantenir una seqüència de valors dins de items encadenats mitjançant punters.
struct Item { int value; Item* next; };
Exercici
Implementeu una funció RECURSIVA que, donats dos Item* que apunten a seqüències d’items encadenats tals que tenen els seus valors ordenats creixentment, retorna un altre Item* que apunta a una nova seqüència que és la fusió ordenada de les dues seqüències originals. En altres paraules, la nova seqüència d’items no comparteix memòria amb les original, i la seva seqüència de valors és la que s’obtindria posant en una llista els valors de les dues seqüències originals i ordenant-los creixentment.
// Pre: pitem1, pitem2 apunten als primers elements de seqüències correctes d'items encadenats. // Els últims elements de les seqüències apunten a NULL. Els propis pitem1,pitem2 podrien // ser NULL, cas en el qual no hi hauria elements a les respectives seqüències. // Post: Retorna un Item* que representa la fusió ordenada de les dues seqüències originals. // Les seqüències de valors originals no han canviat. Item* merge(Item* pitem1, Item* pitem2);
Aquí tenim un exemple de paràmetres entrada i sortida de la funció:
merge([1]->[4]->[4]->[8]->[9]->NULL, [2]->[2]->[4]->[5]->NULL) = [1]->[2]->[2]->[4]->[4]->[4]->[5]->[8]->[9]->NULL
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: Makefile, program.cpp, merge.hpp. Us falta crear el fitxer merge.cpp amb els corresponents includes i implementar-hi la funció anterior. Quan pugeu la vostra solució al jutge, només cal que pugeu un tar construït així:
tar cf solution.tar merge.cpp
Entrada
L’entrada té un nombre arbitrari de casos. Cada cas consisteix en dues línia, on cadascuna conté una llista de valors enters ordenats creixentment. Fixeu-vos en que el programa que us oferim ja s’encarrega de llegir aquestes entrades. Només cal que implementeu la funció abans esmentada.
Sortida
Per a cada cas, la sortida conté tres línies, les dues primeres amb les mateixes llistes originals, i la tercera amb la llista resultant de la fusió ordenada. Fixeu-vos en que el programa que us oferim ja s’encarrega d’escriure aquestes dades. Només cal que implementeu la funció abans esmentada.
Input
4 6 6 9 9 10 1 3 5 5 6 6 4 5 3 5 5 7 10 5 7 9 12 16 18 21 22 23 25 3 7 11 13 16 20 20 20 23 24 2 5 4 5 5 5 9 5 6 10 13 15 19 3 7 9 13 17 20 20 22 25 2 6 9 10 14 18 20 20 21 4 5 6 10 14 14 14 18 21 5 7 9 11 13 14 15 1 1 5 9 13 13 17 18 5 6 6 10 12 14 15 17 20 21 5 9 13 16 17 19 23 26 30 30 5 5 9 2 2 3 4 5 8 12 15 1 1 5 9 13 17 19 3 5 5 9 10 12 4 0 1 4 4 8 10 10 13 3 4 7 11 12 16 5 8 4 7 10 13 17 19 21 22 0 3 3 7 9 9 13 13 13 17 3 5 7 11 13 4 7 8 10 13 17 2 5 5 5 6 7 7 10 2 6 7 9 9 12 13 15 18 22 2 2 3 5 4 7 8 11 12 4 5 9 10 14 17 2 2 3 4 8 8 8 0 1 3 3 4
Output
4 6 6 9 9 10 1 3 5 1 3 4 5 6 6 9 9 10 5 6 6 4 5 4 5 5 6 6 3 5 5 7 10 5 7 9 12 16 18 21 22 23 25 3 5 5 5 7 7 9 10 12 16 18 21 22 23 25 3 7 11 13 16 20 20 20 23 24 2 5 2 3 5 7 11 13 16 20 20 20 23 24 4 5 5 5 9 5 6 10 13 15 19 4 5 5 5 5 6 9 10 13 15 19 3 7 9 13 17 20 20 22 25 2 6 9 10 14 18 20 20 21 2 3 6 7 9 9 10 13 14 17 18 20 20 20 20 21 22 25 4 5 6 10 14 14 14 18 21 5 7 9 11 13 14 15 4 5 5 6 7 9 10 11 13 14 14 14 14 15 18 21 1 1 5 9 13 13 17 18 5 6 6 10 12 14 15 17 20 21 1 1 5 5 6 6 9 10 12 13 13 14 15 17 17 18 20 21 5 9 13 16 17 19 23 26 30 30 5 5 9 5 5 5 9 9 13 16 17 19 23 26 30 30 2 2 3 4 5 8 12 15 2 2 3 4 5 8 12 15 1 1 5 9 13 17 19 3 5 5 9 10 12 1 1 3 5 5 5 9 9 10 12 13 17 19 4 0 1 4 4 8 10 10 13 0 1 4 4 4 8 10 10 13 3 4 7 11 12 16 5 8 3 4 5 7 8 11 12 16 4 7 10 13 17 19 21 22 0 3 3 7 9 9 13 13 13 17 0 3 3 4 7 7 9 9 10 13 13 13 13 17 17 19 21 22 3 5 7 11 13 4 7 8 10 13 17 3 4 5 7 7 8 10 11 13 13 17 2 5 5 5 6 7 7 10 2 5 5 5 6 7 7 10 2 6 7 9 9 12 13 15 18 22 2 2 3 5 2 2 2 3 5 6 7 9 9 12 13 15 18 22 4 7 8 11 12 4 7 8 11 12 4 5 9 10 14 17 4 5 9 10 14 17 2 2 3 4 8 8 8 0 1 3 3 4 0 1 2 2 3 3 3 4 4 8 8 8