PDA

View Full Version : [C++] operatore freccia ( -> )


okay
04-04-2004, 13:00
Qualcuno sà commentare con spigazione cosa le righe di questo code?
l'ho fatto io, qualcuno mi può correggere??

#include <iostream.h>

struct Lnodo { //Struttura.... bhè questo è facile
char dato; //stringa
Lnodo *succ; //punto la prima cella della struttura
};

void main () {
Lnodo *base=NULL, *p; //la prima cella è 0, *p=puntatore a che?
cout << "Introdurre una sequenza di caratteri (^Z per terminare):" << endl;
char ch; //dato stringa
while (cin.get(ch)) { //ciclo
p = new Lnodo; //p = prima cella struttura Lnodo e nuovo oggetto
p->dato = ch; // p->dato equivale a (*p).dato
// p punta a dato e prende il primo char
p->succ = base; // p punta alla locazione dell'oggetto base 0=NULL
base = p; // base (locazione)=indirizzo di p
}
while (p) {
cout << p->dato; //non lo sò
base = p; //non lo sò
p = p->succ; //non lo sò
delete base; //cancello gli oggetti creati con new
}
}


quello che non capisco è se scrivo okay mi stampa yako.
Perchè inizia al contrario?
succ è l'indirizzo della cella come p?
pure base è un puntatore alla locazione o indirizzo?
---------------

documentate voi passo passo e ben documentato
per chiarire una volta per tutte.

ho il cervello un pò bruciato!!!

cionci
04-04-2004, 21:21
#include <iostream.h>

struct Lnodo { //Struttura.... bhè questo è facile
char dato; //stringa //carattere, non stringa
Lnodo *succ; //punto la prima cella della struttura
};

void main () {
Lnodo *base=NULL, *p; //la prima cella è 0, *p=puntatore a che? //base non punta a niente, p non è inizializzato
cout << "Introdurre una sequenza di caratteri (^Z per terminare):" << endl;
char ch; //dato stringa //carattere, non stringa
while (cin.get(ch)) { //ciclo
p = new Lnodo; //viene allocata una struttura che viene puntata da p
p->dato = ch; // p->dato equivale a (*p).dato //inizializzo la struttura con il carattere letto
// p punta a dato e prende il primo char //p non punta a dato, p punta ad una struttura di tipo Lnodo
p->succ = base; // p punta alla locazione dell'oggetto base 0=NULL //p punta sempre alla struttura, succ è un membro della struttura puntata da p, base è NULL solo al primo passaggio, al successivo punta alla struttura allocata nel ciclo rpecedente
base = p; // base (locazione)=indirizzo di p //semplicemente al valore di base viene assegnato il valore di p (non l'indirizzo), in pratica ora base punta alla stessa struttura a cui punta p
}
while (p) {
cout << p->dato; //stampa il carattere contenuto nel campo dato della struttura puntata da p
base = p; //come sopra
p = p->succ; //ci si sposta alla struttura successiva (p dopo punta alls struttura successiva) puntata dal campo succ della struttura puntata da p
delete base; //cancello la strttura puntata da base, l'abbiamo già stampata
}
}


Viene stampato al contrario perchè ogni carattere digitato viene inserito in testa alla lista... Se dopo si comincia a stampare dalla testa quindi si comincerà a stampare dall'ultimo carattere inserito...

okay
04-04-2004, 23:04
dunque:

p = new Lnodo;
la memoria, per questa struttura viene allocata dal prg?
..... e parte dalla fine dell'ultima struttura terminante con NULL ovvero /0;.....giusto?
e comunque ogno srtuttura è un byte cioè un char..... giusto?

se questo sopra è giusto puoi dirmi perchè parte al contrario?
non riesco a capirlo......forse non comprendo while(p) in quanto non vedo ne ++ ne --, che significa while(p) forse mentre p punta a qualcosa?? puoi spigarmi??

cionci
05-04-2004, 07:47
Significa: fino a che p != 0 (NULL)...l'utlima struttura allocata ha p == NULL...
No...l'alòlocazione funziona in maniera diversa, ma non ti deve importare...scrive al contrario per il motivo che ti ho scritto sopra...

Fuzzo
07-04-2004, 11:59
La tua struct nodo è formata da un campo dati char e di un puntatore al successivo nodo della lista.
Se scrivi ok e leggi ko è semplicemente perchè tratti dei caratteri e non delle stringhe, che vengono presi in considerazione singolarmente.
Esempio con OK:
- Primo carattere: O
- Aspetto della lista: base->O->NULL
- Secondo carattere: K
- Aspetto della lista: base->K->O->NULL
Se stampi la lista a partire dalla testa, base nel tuo caso, è ovvio che stampi KO e non OK ;)