|
|||||||
|
|
|
![]() |
|
|
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 : 07-05-2007 alle 00:35. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:21.




















