Perchè tanta fretta nel fare gli esercizi?
Sono costretto a darvi gli esercizi 7 8 e 9 prima che finisca il corso in modo che possiate prepararvi per l'esame (soprattutto per il canale di Tronci).
Gli esercizi verteranno su:
- 7 liste linkate
- 8 alberi
- 9 ci devo pensare
-- Comment added by
AndreaSterbini on 04 Dec 2002
re: Perché abbiamo poco tempo!
-- Comment added by
LeonardoParisi on 04 Dec 2002
Esatto ... abbiamo poco tempo per provare a implementare ciò che vi verrà chiesto all'esame ...
-- Comment added by
AndreaSterbini on 04 Dec 2002
cosa ci verra chiesto all`esame??? puo farmi una panoramica generale sui possibili argomenti? grazie e ciao a tutti! cmq e' vero! abbiamo pochissimo tempo x fare gli esercizi! e poi sono anche molto complicati!
-- Comment added by
AndreaSantoro on 04 Dec 2002
Poco TEMPO?!?!?
Concordo
-- Comment added by
StefanoColasanti on 07 Dec 2002
Print/Fine
In questo esercizio, all'esempio di Input Output viene messo in Input print-fine e dopo in Output la lista dei numeri...ok, ma non dovrebbe essere che la lista appare tra il Print e il Fine? Cioè, la lista deve apparire appena scriviamo fine oppure appena scriviamo print da stdin? Magari è sottointeso, ma a scanzo di equivoci lo chiedo
-- Comment added by
DavidVulpetti on 07 Dec 2002
Print/Fine
Accidenti ... sarà la centesima volta che vi dico che l'input e l'output sono su due stream diversi ...
-- Comment added by
AndreaSterbini on 07 Dec 2002
Qualche domanda....
Salve Professore, volevo chiederle:
- ) Quando e' scaduto l'homework 6?
- ) Sull'Homework7, visto che il cursore deve fermarsi al primo elemento, e siccome lei si e' ipotizzato che si debba inserire un nuovo elemento dopo il cursore, dunque... come facciamo a mettere un elemento prima del primo elemento
?
- ) perche' c'e' cosi' poca gente che fa domande su questo homework? mi sono perso qualcosa oppure e' solamente dovuto al fatto che c'ha dato piu' tempo?
Grazie.
-- Comment added by
DavideSammartino on 08 Dec 2002
- rileggi la homepage
- i casi sono due:
- inserisci "dopo" il cursore e quindi diventa difficile inserire prima del primo elemento
- inserisci "prima" del cursore e quindi diventa difficile inserire dopo l'ultimo elemento
- quindi lascia stare l'esercizio così com'e'
- forse l'esercizio è troppo facile ... devo inventare qualcosa (anche per muovere un po' il bersaglio
)
--
AndreaSterbini - 08 Dec 2002
Momento di pausa........
-- Comment added by
LeonardoParisi on 08 Dec 2002
Esempio Corretto ?
Input |
add 1
add 2
add 3
print
prev
add 4
print
next
add 5
print
fine
|
Output |
1
2
3 *
------
1° print
-------
1
2
4 *
3
------
2° print
------
1
2
4
3
5 *
------
3° print
------
|
E' giusto così l'output prof?
-- Comment added by
AndreaBandino on 08 Dec 2002
Sì (tranne per i trattini e le scritte tra trattini)
-- Comment added by
AndreaSterbini on 09 Dec 2002
"tranne per i trattini e le scritte tra trattini"
Si lo so. Le avevo messe per distinguere le varie fasi del programma
--
AndreaBandino - 09 Dec 2002
lista vuota
ma nella sort se la lista e' vuota lo stampiamo "vuota"
-- Comment added by
EmanuelePiersanti on 09 Dec 2002
buona idea
-- Comment added by
AndreaSterbini on 09 Dec 2002
input ed output
se io in input dò:
add 1
add 2
add 3
print
prev
add 4
add 6
print
fine
è giusto che l'output sia:
1
2
3 *
1
2
3
4 *
6
grazie
-- Comment added by
CristianoMarra on 10 Dec 2002
Direi che invece dovrebbe essere (
ATTENTI: separo i due print con dei trattini
che non fanno parte dell'output! ):
1
2
3 *
----
1
2
4
6 *
3
-- Comment added by
AndreaSterbini on 10 Dec 2002
Problemi di allocazione memoria
Scusatemi,volevo sapere una cosa.Se ho per esempio una lista1 che punta a una struttura NODO(quindi dichiarata NODO *)con tutti i suoi puntatori next e prev,come faccio a copiare il contenuto della lista1 in una lista2 secondaria?Se dichiaro lista2 come NODO * e poi faccio :
lista2=lista1;
non mi da' errore e
teoricamente mi copia il contenuto di destra a sinistra,ma come ALLOCAZIONI di memoria.Quindi appena modifico qualcosa in lista2 mi modifica indirettamente(o direttamente) la lista1.Come posso fare per far si che le due liste seppur inizialmente identiche abbiano un'allocazione di memoria differente,cosi' da manipolare solo una delle due liste?
Per favore rispondetemi!Grazie!!
-- Comment added by
FabioPoliti on 11 Dec 2002
Non dovrebbe essere necessario, per risolvere l'esercizio, effettuare una copia "fisica" di una lista, e comunque questo andrebbe contro lo spirito dell'allocazione dinamica della memoria, il cui scopo e' proprio quello di allocare la memoria strettamente indispensabile (e di rilasciarla quando non serve piu')
Comunque, se proprio vuoi effettuare la copia di una lista, tieni presente che quando dichiari una variabile
lista2 di tipo
(Nodo *) NON stai allocando lo spazio di memoria di una struttura, ma solo un puntatore. Se poi scrivi
lista2 = lista1 entrambe le variabili puntano alla stessa lista, ed ogni operazione effettuata tramite l'una avra' effetto anche sull'altra, per il semplice motivo che l'"oggetto" e' unico, ed i puntatori allo stesso oggetto sono due (quindi, in questo caso l'operazione e' sostanzialmente inutile). Se vuoi effettuare una copia fisica, devi allocare lo spazio per la nuova lista, quindi (ammettendo che
lista1 punti ad una lista non vuota), devi :
- allocare un nuovo
Nodo
- assegnare l'indirizzo di questo nodo a
lista2
- effettuare un ciclo che, per ogni ulteriore elemento di
lista1 crea un nuovo
Nodo, copia
solo il valore del corrispondente elemento di
lista1 , e linka opportunamente questo nuovo
Nodo a
lista2 . Il ciclo termina quando si esaurisce
lista1
- ricordarti di rilasciare lo spazio di memoria occupato da
lista2 quando non serve piu' (effettuando una scansione e liberando uno ad uno lo spazio occupato dai suoi elementi. Non basta dereferenziare l'indirizzo puntato da
lista2, il C continuerebbe a considerare occupate quelle locazioni di memoria, anche se non sarebbe piu' possibile accedervi. Sarebbe quello che in termine tecnico viene definito "garbage" (spazzatura), e che un in linguaggio come il lisp viene liberato da un apposito demon, il "garbage collector", che pero' in C non esiste).
--
ArcangeloTripi - 11 Dec 2002
Perfetto ... non avrei potuto dirlo meglio, grazie
-- Comment added by
AndreaSterbini on 11 Dec 2002
input e output2
Ringraziandola della precedente risposta(e quindi correggendo l'errore)le volevo chiedere ancora un'altro esempio di input e output, questa volta però includendo tutti i comandi(ciò potrebbe anche tornare utile per gli altri studenti così possono vedere anche altri esempi), se io do il seguente input:
add 1
add 2
add 3
print
prev
del
add 4
add 5
print
next
add 6
print
fine
l' output deve essere:
1
2
3 *
1
3
4
5 *
1
3
4
5
6 *
grazie
-- Comment added by
CristianoMarra on 11 Dec 2002
a occhio direi che è giusto ...
-- Comment added by
AndreaSterbini on 11 Dec 2002
Problemi con malloc
Ragazzi mi dite per favore cosa vuol dire "assignment makes pointer from integer without a cast" in una riga del genere newPtr=malloc(sizeof(NODO)); ??
grazie
-- Comment added by
AlessandroCaruso on 11 Dec 2002
ma
ma anche gli zeri possono essere inclusi?
-- Comment added by
CristianoMarra on 11 Dec 2002
cioè
è lecito fare add 0 ?
-- Comment added by
CristianoMarra on 11 Dec 2002
re: ma
certo (0 è un intero) e sono validi anche i numeri negativi!
re: malloc
vuol dire che non hai fatto il cast dal
void *
tornato da malloc
al tipo
NODO *
della variabile
newPtr
-- Comment added by
AndreaSterbini on 11 Dec 2002
aggiornamento sulla malloc
In effetti il vero motivo di questo errore è che ti sei dimenticato la riga
#include stdlib.h
per cui il compilatore assume che malloc ritorni un intero e poi ne fa un cast a puntatore. Se includi il file la malloc è dichiarata correttamente e
non c'e' bisogno di fare il cast.
-- Comment added by
AndreaSterbini on 17 Feb 2003
Stdin
Come faccio a vedere se la stringa che ho preso in stdin è uguale a un'altra stringa definita nella dichiarazione delle variabili?
-- Comment added by
LucaGiovanditto on 11 Dec 2002
usa la funzione
strcmp
-- Comment added by
AndreaSterbini on 11 Dec 2002
grazie prof
-- Comment added by
AlessandroCaruso on 11 Dec 2002
Nome e Cognome
In questo esercizio non bisogna mettere il nome e cognome?
-- Comment added by
LucaGiovanditto on 11 Dec 2002
Accidenti, me ne sono dimenticato ... per non "muovere il bersaglio" lasciamo perdere ... (chi proprio ci tiene lo stampi solo se in input c'e' l'opzione
-v
... non lo controllero')
-- Comment added by
AndreaSterbini on 12 Dec 2002
perche' la soluzione dell'hw non e' pubblicata?
-- Comment added by
ElisabettaDAiutolo on 12 Dec 2002
Perchè non ho ancora finito di implementarla

(nella versione che gestisce gli errori)
Lo faccio al più presto (e vi do' anche i risultati dei test)
-- Comment added by
AndreaSterbini on 12 Dec 2002
puo' mettere intanto online la versione che non gestisce gli errori?
Grazie
-- Comment added by
ElisabettaDAiutolo on 12 Dec 2002
Rilascio memoria
Per verificare l'effettivo rilascio di memoria, ho provato a farmi stampare
l'intero contenuto nel nodo appena cancellato. Domanda: Perchè mi stampa il numero e
non mi da errore o un NULL????
Grazie
-- Comment added by
AndreaArtibani on 12 Dec 2002
Perchè il sistema operativo non ha avuto ancora il tempo di dare quel pezzo di memoria ad un altro programma e non è stato ancora modificato. (il rilascio non implica che la memoria venga "ripulita")
-- Comment added by
AndreaSterbini on 12 Dec 2002
Warning
Prechè mi da questo warning?
warning: passing arg 2 of `strcmp' from incompatible pointer type.
Questa è la riga corrisondente:
if(strcmp(add,comando)==0), add è char *add="add"; comando è char *comando[6];.Nonostante tutto il programma funziona!
-- Comment added by
DomenicoBoiano on 13 Dec 2002
comando é un
array di 6 puntatori ad array di caratteri (come argv, tanto per intenderci) e non un array di caratteri semplice quindi dovresti scrivere comando[0] oppure definirlo come
char comando[6]
oppure come
char * comando
-- Comment added by
AndreaSterbini on 13 Dec 2002
- 1 ora all'alba
...
da domani sarò il vostro peggior incubo...
-- Comment added by
LauraRavagli on 13 Dec 2002
inizio subito:
struct nodo {
int x
struct nodo *next;
};
struct nodo *aggiungi_elemento(struct nodo *lista, int val)
{
struct nodo *nuovo = (struct nodo *) malloc(sizeof(struct nodo));
nuovo->x = val;
nuovo->next = lista;
return nuovo;
}
scusate l'ignoranza:
qual'è la necessità (oltre magari lo stile ) di dichiarare la funzione come nodo?
sarebbe la stessa cosa dichaiarare la funz void e
invece del
return nuovo;
fare
lista = nuovo;
...vediamo chi risponde...
-- Comment added by
LauraRavagli on 13 Dec 2002
c'è qualcuno che spia
-- Comment added by
LauraRavagli on 13 Dec 2002
lista è un argomento, quindi è passata
per valore e anche se la modifichi non riuscirai a modificare il valore della variabile usata nel main, fuori dalla funzione.
Per comunicare la nuova lista fuori si usano due stili:
- funzionale (quello visto a lezione)
- con passaggio della variabile da modificare per riferimento
La funzione di cui sopra in questo secondo caso va chiamata così:
aggiungi_elemento(&L,5)
e va modificata così:
void aggiungi_elemento(struct nodo **lista, int val)
{
struct nodo *nuovo = (struct nodo *) malloc(sizeof(struct nodo));
nuovo->x = val;
nuovo->next = *lista;
*lista = nuovo;
}
Nota che ora l'argomento lista è
un puntatore ad un puntatore ad una struct e che per leggerlo/modificarlo va dereferenziato usando
*lista
-- Comment added by
AndreaSterbini on 13 Dec 2002
si,si
io ho l'abitudine di definirmi direttamente il puntatore:
typedef struct Nodo * TipoNodo;
struct Nodo
{
int x;
TipoNodo next;
};
main()
{
TipoNodo Lista;
aggiungi_elemento(&Lista,88);
}
void aggiungi_elemento(TipoNodo *vNodo, int valore)
{
TipoNodo a;
a = malloc(sizeof(struct Nodo));
a->x = valore;
a->next = (*vNodo);
(*vNodo) = a;
}
-- Comment added by
LauraRavagli on 13 Dec 2002
Dubbio su del e NOTA IMPORTANTE
Non ho ben capito una cosa: se nella lista ho un solo elemento, quando faccio "del" lo toglie e la lista rimane vuota... è qui che devo stampare "vuota" o solo quando eseguo "del" sulla lista vuota?
Una nota MOLTO importante:
aggiungendo elementi con lo stesso valore dopo la chiamata sort non si può stabilire, confrontando con l'output di un programma simile, su quale ci sia il puntatore:
add 1
add 1
add 1
prev
print
dà in output
1
1 *
1
Dopo il sort potrebbe dare qualsiasi cosa: nel mio homework quando vado a mettere un elemento in una lista e il successivo nell'altra (per dividerla) cambia l'output se faccio una modifica piccolissima:
if (ilnumeroèpari---++) {lo metto in A}
else {lo metto in b}
dove ilnumeroèpari è un contatore: se parte da zero l'output è
1
1
1 *
mentre se parte da 1 (o da qualsiasi altro numero dispari) è
1 *
1
1
Probabilmente un tipo diverso di output viene dato anche se si prende metà lista da una parte e metà dall'altra...
E non solo!: facendo più volte la sort (Es con la lista composta da 3 "uni") l'output a volte è in un modo, a volte nell'altro.
Ho consegnato il mio homework, se vuole può guardarlo.
-- Comment added by
LudovicoGrossi on 13 Dec 2002
Hai ragione ... mmmhhhh ...
... facciamo così ... nei tests eviterò di eseguire il sort della lista quando il cursore è su un elemento con valore presente più di una volta nella lista.
-- Comment added by
AndreaSterbini on 14 Dec 2002
re: del
vuota viene stampato solo se la lista è
già vuota quando si chiede il del.
-- Comment added by
AndreaSterbini on 14 Dec 2002
DOMANDE:
salve prof vorrei sapere alcune cose:
1) Se la posizione corrente è l'ultimo nodo e noi scriviamo il comando next, cosa deve apparire o succedere? del tipo "non puoi anadre avanti è l'ultimo nodo".
2) Se la posizione corrente è il primo nodo e noi scriviamo il comando prev cosa deve succedere? L'esempio è come L' 1) invertito.
-- Comment added by
AndreaBandino on 14 Dec 2002
Sul testo dice di restare sull'ultimo elemento se ci sei già e vuoi andare avanti, viceversa per il primo
-- Comment added by
LudovicoGrossi on 14 Dec 2002
probz..
allora..ho un problema con una parte del programma in cui voglio che la stringa che immetto da stdin( tipo add 4) venga spillata dopo lo spazio in un'altra stringa...il problema è che dopo lo spazio me lo considera ancora come l'inizio della stringa..lo so sembra una cosa assurda pero praticamente la pos 0 dell'array me la considera sia all'inizio che dopo lo spazio..scusate se è un po contorto ma è difficile da spiegare..cmq vi attacco sotto quello che ho scritto riguardo solo a questa parte e aspetto vostri commenti..tnx
main()
{
LISTNODEPTR startPtr = NULL;
char choice[size];
char choice2[size];
int item,x,m;
scanf("%s", &choice);
while(choice[0] = 'f') { /*switch per il vari comandi da eseguire*/
switch (choice[0]) {
case 'a':
for(x = 0;x < strlen(choice);x---++) {
if(choice[x] == ' ')
{
for(m = x---+1;m < strlen(choice);m++)
sprintf(choice2,"%s",choice[m]);
}
sscanf(choice2,"%d\n", &item);
}
inserisci(&startPtr, item);
break;
-- Comment added by
LorenzoLivi on 14 Dec 2002
cacchio lo attaccato male ve lo riattacco qui un po meglio..scusate..:D
main()
{
LISTNODEPTR startPtr = NULL;
char choice[size];
char choice2[size];
int item,x,m;
scanf("%s", &choice);
while(choice[0] = 'f') {
switch (choice[0]) {
case 'a':
for(x = 0;x < strlen(choice);x---++) {
if(choice[x] == ' ')
{
for(m = x---+1;m < strlen(choice);m++)
sprintf(choice2,"%s",choice[m]);
}
sscanf(choice2,"%d\n", &item);
}
inserisci(&startPtr, item);
break;
-- Comment added by
LorenzoLivi on 14 Dec 2002
vabbe ci rinuncio...:D bravo chi lo sa leggere:D..ciap
-- Comment added by
LorenzoLivi on 14 Dec 2002
Prova a usare il tag <verbatim>
-- Comment added by
AndreaSterbini on 14 Dec 2002
che cos'è il tag?
-- Comment added by
LorenzoLivi on 14 Dec 2002
Guarda come faccio a inserire un pezzo di codice in una pagina di twiki ...
tag=elemento HTML
-- Comment added by
AndreaSterbini on 14 Dec 2002
ok tnx..
-- Comment added by
LorenzoLivi on 14 Dec 2002
Ma perchè ti vuoi impiccare da solo? a che ti serve unire tutto il comando in una stringa e poi gestirla? Serve solo per okkupare spazio in questo esercizio! Spezza in due l'assimilazione dei dati! Ti crei uno switch e la prima parte dell'assimilazione la metti fuori da questo , mentre l'altra parte, dove richiesta la metti nel case! Più semplice di così!
--
AndreaBandino - 14 Dec 2002
bhe guarda quello che cerco di fare è di spezzare in due la stringa, per dividere nnumero e comando..magari nn ci riesco pero è proprio quello che cerco di fare...cmq grazie.
-- Comment added by
LorenzoLivi on 15 Dec 2002
Io intendevo dire che se usi due scanf, il primo al di fuori dello switch, che prende la stringa del comando, ed il secondo scanf, che prende l'intero, lo inserisci nei case in cui è richiesto il secondo argomento, risparmi, codice ed elimini cicli inutili!
La gestione della stringa poteva servire nell'ese 6 perchè c'erano da esaminare le possibili combinazioni tra nome e cognome ma in questo ese, ci sono solo 2 argomenti e basta - comando - intero - e sono per così dire standard, ovvero non ci sono comandi con più parole (con spazzi) o più numeri ma solo comando(spazio)intero o comando e basta.
--
AndreaBandino - 15 Dec 2002
ok ti ringrazio....pero c'è una cosa strano in quello che ho fatto io..come ho detto prima mi considera 2 volte la posizione 0 dell'array..probabilmente faccio fare qualcosa di strano pero a me nn sembra..cmq grazie ancora e provo a semplificare la questione..ciap-
-- Comment added by
LorenzoLivi on 15 Dec 2002
le due settimane....
dalla consegna dell'homework6 le due settimane terminerebbero venerdi.. o sbaglio?
spostare la scadenza a venerdi sarebbe troppo???
-- Comment added by
ElisabettaDAiutolo on 15 Dec 2002
passare la riga...
alle funzioni a questo punto non serve... lùil suggerimento choice mi sembra la soluzione migliore per questo Hw
-- Comment added by
ElisabettaDAiutolo on 15 Dec 2002
... le due settimane
partivano dal giorno della pubblicazione

... se insistete prorogo ...
-- Comment added by
AndreaSterbini on 15 Dec 2002
Algoritmi
è possibile inserire negli appunti di esecitazioni gli algoritmi usati durante il corso? Sarebbe stato molto utile per chi non frequenta , grazie.
-- Comment added by
ElinaRazumovsky on 16 Dec 2002
RE:...le due settimane
io insisto... ma sono l'unica?
-- Comment added by
ElisabettaDAiutolo on 16 Dec 2002
insisto pure io..

tanto per solidarietà!
-- Comment added by
LorenzoLivi on 16 Dec 2002
RE:..le due settimane..
mi manca di testare il programma... ma visto che allo scorso HW vinse la scanf sulla mia tenacia....se si potesse prorogare..
-- Comment added by
ElisabettaDAiutolo on 16 Dec 2002
Consegna esercizio
Mi sono accorto che nella mail di conferma i miei tre include:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
sono diventati:
#include
#include
#include
Ho provato a riconsegnare l'esercizio con lo stesso risultato.
Mi puo' dire prof se il file dell'esercizio e' giunto completo? Grazie.
-- Comment added by
PaoloPancotto on 16 Dec 2002
Che stai dicendo ... all'email non manca nulla ... sei tu che hai la visualizzazione HTML attiva nel tuo programma email e quei pezzi vengono nascosti perchè vengono interpretati come tag HTML ...
-- Comment added by
AndreaSterbini on 16 Dec 2002
Merge-sort
Dove si può trovare l'algoritmo merge-sort visto in aula????
Grazie mille.
-- Comment added by
AndreaArtibani on 16 Dec 2002
FunzioniRicorsiveSuListeDiStrutture
-- Comment added by
AndreaSterbini on 16 Dec 2002
Il merge-sort mi sta facendo impazzire! :|
So che e' ben spiegato e so che c'e' l'esempio di Arcangelo pero' non riesco proprio a capire dove sbaglio. Premesso che ho grossi dubbi su come implementare l'algoritmo su una lista non normale, ma doppiamente linkata... tutto qui sembra funzionare... (anche se probabilmente tutti i puntatori a prev dei vari nodi sono a NULL) ... anche se nella realta' dei fatti non e' cosi', ottengo, infatti, questo output:
add 56
add 1
add 5
add 8
print
56
1
5
8 *
sort
DEBUG PRINT LISTA A
56 *
5
DEBUG PRINT LISTA B
1 *
8
PASSO DI MERGE
1 *
8
56
5
Ignorando la posizione del cursore (questo e' un problema a cui posso ovviare dopo), la funzione sembra svolgere il suo dovere ossia:
spezzo in due la lista grande, il primo elemento di A non e' minore del primo di B, quindi prendo il primo di B e attacco il resto ... pero' sembra ferma li

... E io sono veramente a corto di idee questa volta... C'e' qualcuno che puo' darmi qualche consiglio?
-- Comment added by
MauroFerrara on 16 Dec 2002
credo di aver capito concettualmente l'algoritmo

vi faro' sapere se riusciro' o meno a metterlo in pratica
-- Comment added by
MauroFerrara on 17 Dec 2002
Please
Prof, si potrebbe spostare la consegna anche di un solo giorno per permettere di correggere e completare bene l'esercizio?
-- Comment added by
AndreaBandino on 17 Dec 2002
Prorogato a mezzanotte di giovedì
La consegna è prorogata a mezzanotte di giovedì
-- Comment added by
AndreaSterbini on 17 Dec 2002
due cose:
1) venerdi ci fara' lezione?
2) grazie della proroga, cosi' provo anche a fare la parte facoltativa.. grazie
-- Comment added by
ElisabettaDAiutolo on 17 Dec 2002
Parte facoltativa
Ci sono riuscito (almeno cosi' pare), il problema stava nel fatto che la parte ricorsiva non andava ! grrr la ho spuntata solo a notte inoltrata.
-- Comment added by
MauroFerrara on 17 Dec 2002
La lezione di venerdì è spostata a giovedì pomeriggio alle ore 16 in aula 5 di Matematica
(assieme al canale P-Z)
-- Comment added by
AndreaSterbini on 17 Dec 2002
cacchio ma perchè prolunghiamo sempre dopo che consegno?
-- Comment added by
LorenzoLivi on 17 Dec 2002
Puoi sempre migliorare e riconsegnare!
-- Comment added by
AndreaSterbini on 17 Dec 2002
Dubbi sulla parte facoltativa (per il prof)
Ho riconsegnato l'esercizio comprensivo di parte facoltativa, pero' credo di aver sbagliato... rileggendo il testo (e sopratutto le domande e risposte) mi e' venuto un dubbio.
Implementare il comando aggiuntivo:
sort che ordina la lista usando l'algoritmo merge-sort
il cursore rimane sul nodo che indicava prima
Il cursore rimane sul nodo che indicava prima significa:
a) che rimane nella stessa posizione (come ho fatto io), allego un esempio:
add 0
add 4
add 2
print
0
4
2 *
sort
print
0
2
4 *
fine
b) oppure sul nodo specifico (in questo caso 2) che indicava?!? quindi presumo con un output del genere:
add 0
add 4
add 2
print
0
4
2 *
sort
print
0
2 *
4
fine
So di uscirmene piuttosto in ritardo pero' siccome la consegna e' stata posticipita potrei correggere... Se allega anche un paio di esempi sarebbe perfetto... La ringrazio in anticipo della risposta!
-- Comment added by
MauroFerrara on 17 Dec 2002
Merge-Sort
Prof, una volta che viene utilizzato il comando sort, cosa deve succedere? viene stampata ordinata la lista automaticamente? Oppure, per stamparla bisogna indicare print?
Seconda cosa: se avevamo in non ordine 3 7(*) 4 9, una volta ordinata,
avremo 3 4 7(*) 9, quindi il prossimo numero che inseriremo sarà tra il 7 ed il 9 ?
-- Comment added by
AndreaBandino on 18 Dec 2002
- la seconda che hai detto (la stampa si fa con print
- esatto
-- Comment added by
AndreaSterbini on 18 Dec 2002
Se...
... la lista è vuota e scriviamo next o prev, stampiamo "vuota\n" anche qui?
-- Comment added by
AndreaBandino on 18 Dec 2002
ok allora provo a migliorarlo e lo rimando..
-- Comment added by
LorenzoLivi on 18 Dec 2002
Re: se ...
Solo se l'ho scritto nell'esercizio.
-- Comment added by
AndreaSterbini on 19 Dec 2002
Professore ma c'e' un modo con Cygwin per fare il debug riga per riga del programma? se si, come si fa?
Grazie
-- Comment added by
DavideSammartino on 19 Dec 2002
usa
gdb
-- Comment added by
AndreaSterbini on 19 Dec 2002
un'altra cosa... per il "sort", gli elementi devono essere ordinati in ordine crescente vero? dal piu' piccolo al piu' grande?
-- Comment added by
DavideSammartino on 19 Dec 2002
si
-- Comment added by
AndreaSterbini on 19 Dec 2002
paragonabile all vecchia....
questo Hw7 mi ha impegnato alla pari di quello del parsing di una stringa in un'altra... fiuu...
grazie al posticipo ho completato pure la parte facoltativa: saltato pure lezione

buona serata a tutti
-- Comment added by
ElisabettaDAiutolo on 19 Dec 2002
Peccato ... ti aspettavo per farti gli auguri di Buon Natale!
-- Comment added by
AndreaSterbini on 20 Dec 2002
non riesco a capire perchè questo codice non mi funziona correttamente, ossia mi aspetterei l'inserimento in testa.
inserisci_nodo è la routine che sta su
FunzioniRicorsiveSuListeDiStrutture
mettendo
lista =inserisci_Nodo(Elem,lista,i); tutto ok
void main()
{
Nodo *lista = NULL;
Nodo *Elem =NULL;
int i;
for (i=0;i<15;i---++)
{
Elem =malloc(sizeof(Nodo));
Elem->pros = NULL;
Elem->num = i;
lista =inserisci_Nodo(Elem,lista,0);
}
stampa(lista);
-- Comment added by
LauraRavagli on 27 Dec 2002
In inserisci_nodo c'era un '==' al posto di un '=' ... ho corretto il codice
-- Comment added by
AndreaSterbini on 28 Dec 2002
... anch'io sto sul rincretinito andante che non me ne sono accorta
-- Comment added by
LauraRavagli on 28 Dec 2002
No such template def TMPL:DEF{PROMPT:before}
- Ricordatevi di dare un titolo alla vostra domanda come segue:
<tre spazi>---+++<spazio>Titolo della domanda
Testo della domanda