|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
[c] scorrimento di liste tramite un iteratore- help!!
ho un problema nel far scorrere un elemento di tipo iteratore lungo una lista. l'elemento di tipo iteratore non è altro in pratica che pun puntatore alla lista.
le strutture sono queste: Codice:
struct NodoLista { void *value; struct NodoLista *next; }; typedef struct NodoLista *list; struct nodoIt { list *punt; }; typedef struct nodoIt *iterator; Codice:
iterator get_iterator(list l) { iterator I; I = malloc(sizeof(struct nodoIt)); if (!l) return NULL; I->punt = l; return I; } Codice:
void *next(iterator i) { list t = NULL; t = (list *) i->punt; if (t->next == NULL) return NULL; t = t->next; i->punt = t; } |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Oct 2006
Messaggi: 170
|
CIAO TECNOLOGIA INFORMATICA O INFROMATICA PROGETTO PROGRAMMAZIONE 2, TI VA MALE è?
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
abbastanza male via.. eheh
anche a vedere su twiki sta funzione next ha dato piu di qualche problemino... mi sai dare qualche suggerimento? |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Io avrei fatto così (codice non testato!):
Codice:
typedef struct node { void *value; struct node *next; } NODE, *PNODE; typedef struct { PNODE head; } LIST, *PLIST; typedef struct { PNODE node; } ITERATOR, *PITERATOR; PITERATOR getIterator (PLIST pl) { PITERATOR pi; pi = (PITERATOR) malloc (sizeof (ITERATOR)); if (pi != NULL) pi->node = pl->head; return pi; } PNODE next (PITERATOR pi) { PNODE pn; pn = pi->node; if (pn != NULL) pi->node = pn->next; return pn; }
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
Quote:
void *next(iterator i) { // sposta l'iteratore avanti di una posizione sulla lista list t = NULL; t=*(i->punt); if (t->next == NULL) i->punt = NULL; else { t = t->next; i->punt = &t; } } pero in questo modo m va in segmentation default alla sua prima chiamata, mentre prima mi ci andava solo quando era a fine lista... ![]() |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
che stia sbagliando la get_itarator in principio? la cosa strana è che cmq finche non si è a fine lista l'iteratore pare funzionare.. è come se non mi riconoscesse il NULL finale...
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
in teoria per far spostare avanti di una posizione l'iteratore non basterebe fare la seguetne istruzione?
i->punt = (list *) (*(i->punt))->next; ps: faccio il casting perche i->punt dev'essere di tipo list, o meglio puntatore a list.. dov'è che sbaglio??? ![]() |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
aaaaaa ho risolto.. la funzione next mi funziona..riesco a scorrere correttamente la lista fino alla fine e non avere errori..
sinceramente non ho ben capito come ho fatto perche la funzione non mi pare di averla cambiata.. (anche se dopo ore e un fine sett ad alto tasso alcolico, tutto è possibile) ![]() |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
ora peròmi sorge un altro problema
![]() nel main che fornisce il prof c'è un ciclo while fatto cosi: Codice:
i = get_iterator(l); int cont=0; /* deve stampare "a, b, c, d, e," */ while(has_next(i)) { cont++; char *s = (char *)next(i); printf("%s,", s); } printf("\nlunghezza lista: %d\n",cont); mi chiedo.. come puo funzionare quella conversione di stringhe? la next ritorna un void (obbligatorio),e il prof a priori non sa come è fatta la struttura dell'iteratore.. che nel mio caso è: Codice:
struct nodoIt { list *punt; }; typedef struct nodoIt *iterator; |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Mar 2006
Messaggi: 46
|
il fatto è che se gli faccio ritornare il puntatore poi non mi funziona piu.. cmq essendo una funzione di tipo void è obbligatorio far ritornare qualcosa? io pensavo che fosse sufficente modificare il mio puntatore dentro alla funzione, in modo che la modifica fosse permanente.. senza pero tornare nulla con il return..
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Codice:
void *next(iterator i) { list t = NULL; t = (list *) i->punt; if (t->next == NULL) return NULL; t = t->next; i->punt = t; } t = (list *) i->punt; è sbagliato perchè t è di tipo list e i->punt è di tipo list , quindi dovrebbe essere : t = i->punt; Inoltre la tua funzione ha poco senso. Non si capisce se vuoi ritornare un valore di ritorno o meno . il prototipo è del tipo : void *next(iterator) , dal quale sembrerebbe tu voglia ritornare un tipo "puntatore a tipo sconosciuto" , il problema è che dentro la funzione tu non ritorni proprio nulla , tranne NULL in caso la lista passata alla funzione sia non valida. Inoltre dal fatto che tu passi un tipo "iterator" come parametro che è un puntatore a tipo "struct NodoIt" sembra che tu voglia modificare dalla funzione il valore dei campi della struct puntata da iterator e non ritornare un puntatore al nodo successivo (come invece il valore di ritorno farebbe intendere) . La mia proposta per la nuova funzione next è : Codice:
void next(iterator i) { if (i->punt == NULL) return; i->punt = i->punt->next; } PS : Ho appena letto che hai risolto e a quanto sembra la tua funzione deve ritornare qualcosa e sembra un char .... in tal caso bisogna cambiare un bel po' di cose. Guardando il main mi verrebbe in mente : Codice:
void *next(iterator i) { void *p = NULL; if (i->punt == NULL) return NULL; p = i->punt->value; i->punt = i->punt->next; return p; } Ciao
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 06-05-2007 alle 23:35. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:32.