Newsgroup: it.comp.lang.c
Titolo: Niubba e disperata

Salve a tutti cervelloni del C,
purtroppo non sono una cervellona ma questo esame di informatica devo
passarlo.
Vi chiedo una mano nel risolvere un problema del compitastro al che non ho
passato, il testo è questo:
Data una stringa s volete costruire una lista concatenata L, i cui elementi
sono isingoli caratteri di s="Pippo".
Scrivete tutto il codice C necessario a risolvere il problema, comprese le
dichiarazioni di tipo. Fate attenzione a non invertire l'ordine dei
caratteri : 3 punti in meno se memorizzate la stringa in modo da avere
l'ultimo carattere in testa della lista.
Ma è più facile memorizzare la stringa al contrario? Perché?
Sto studiando sul Deitel&Deitel (3° edizione) e l'unico esempio di lista
concatenata (pag 455), che non sia nè stack nè queue, è pieno di errori,
almeno per il mio compilatore.
Scusate la mia incapacità ma vi chiedo una mano e forse solo 5 minutini del
vostro tempo,
Sofia

Ma è più facile memorizzare la stringa al contrario? Perché?
No, anzi.  Forse il tuo professore ha provato a risolvere
l'esercizio, gli e' riuscito piu' facile al contrario (per
chissa' quale arcano motivo) e ora pensa che la via piu'
semplice sia quella che ha seguito lui... mah... misteri
della mente !...
-- 
Andrea Laforgia (
walkie...@libero.it
)
"Usenet is a strange place" [Dennis Ritchie]


Ah, dici?
Mmmmm.....meglio non sprecare infamate, potrebbe essere uno che scrive qui
con un nick!
Sofia


http://www.kyuzz.org/antirez
finger 
ant...@tella.alicom.com
 for PGP key
28 52 F5 4A 49 65 34 29 - 1D 1B F6 DA 24 C7 12 BF

        insert(&(*pHead)->next, c);
Sapevo che non avrei capito tutto, infatti chiedo ulmilmente un'ulteriore
aiuto!
Non capisco il significato di
if(!*pHead)
nella funtion insert
cioč, so cos'č "if"....ehehe.....ma non so cosa sognifica il "!" lě dentro
e di
insert(&(*pHead)->next, c);
Non so a cosa serve mettere "&" con il puntatore, non basta togliere "*" o
ha proprio un significato che non comprendo?
Grazie,
Sofia

 insert(&(*pHead)->next, c);
pHead è un puntatore ad un puntatore a pnodo, e la funzione insert accetta
come argomento un oggetto dello stesso tipo; (*pHead)->next però è un
puntatore a pnodo, per cui per passarlo a insert devi passare il suo
indirizzo, anteponendo &.
Ciao,
Cecco

ha proprio un significato che non comprendo?
No, stai attenta.
L'espressione &(*p)->next si legge: l'indirizzo del
puntatore next della struttura puntata da p.
Il principio alla base del mio codice e' che la lista
aumenta sempre per inserimento, in coda, di un elemento.
Questo elemento viene passato per riferimento.
Se il riferimento e' nullo allora l'elemento viene creato.


 l'ultimo carattere in testa della lista.
char const * s = "pippo";
typedef struct list_ {
	char c;
	struct list_ *next;
} list_t;
list_t *root = NULL;
list_t *new_node(char c) {
	/* Creo un nuovo nodo e lo inizializzo */
	list_t *tmp;
	tmp = malloc(sizeof(list_t));
	assert(tmp);
 
	tmp->next = NULL;
	tmp->c = c;
	return tmp;
}
 
void add(char c) {
	/* Aggiungo un carattere in coda alla lista; e` possibile
	 * rendere la funzione ricorsiva
	 */
	list_t *tmp;
	if (root == NULL) {
		/* Inizializzo la lista */
		root = new_node(c);
		return;
	}
	tmp = root;
	/* Scorro la lista fino all'ultimo elemento */
	while(tmp->next)
		tmp = tmp->next;
	/* Aggiungo in coda */
	tmp->next = new_node(c);
}
void show(void) {
	list_t *tmp = root;
	/* Scorro tutta la lista e stampo elemento per elemento,
	 * separati da un spazio
	 */
	while(tmp) {
		printf("%c ", tmp->c);
		tmp = tmp->next;
	}
	printf("\n");
}
void cleanup(list_t *l) {
	/* Libero la memoria allocata in modo ricorsivo, perche` e` fik0
	 * & c00l ;)
	 */
	if (l == NULL)
		return;
	cleanup(l->next);
	free(l);
}
int main() {
	int i;
	/* Scorro tutti i caratteri e li aggiungo alla lista */
	for (i = 0; p[i] != 0; i++)
		add(p[i]);
	show();
	cleanup(root);
	return 0;
}
 
Questo dovrebbe andare bene, sempre che il tuo insegnate non voglia che
tu usi le solite primitive car, cons e compagnia bella. In questo caso,
basterebbe scorrere la stringa la contrario ed aggiungere elementi in
testa alla lista:
for (i = strlen(s); i >= 0; i--)
	cons(s[i]);
Dove cons e` qualcosa tipo:
void cons(char c) {
	list_t *tmp;
 
	tmp = new_node(c);
	tmp->next = root;
	root = tmp;
}
Per stampare giochi con car e cdr.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Un apostolo vedendo Gesu` camminare sulle acque:
- Cazzo se e` buono 'sto fumo!!!