|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
[C] Come posso risolvere?
Mi trovo in questa situazione: ho del codice che si occupa di gestire una lista di dati aggiunti alla lista con la funzione push(), ma alla fine risulta aggiunta una sola voce (basta vedere la funzione push()):
Codice:
typedef struct elem { voce* ptvoce; struct elem* next; } elem; int push(elem** db, voce* v) { elem * nuova = (elem *) malloc(sizeof(elem)); elem * step = (elem *) (*db); nuova->ptvoce = v; if (step) { step = step->next; } step = nuova; return 0; }
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Codice:
typedef struct elem { voce* ptvoce; struct elem* next; } elem; int push(elem** db, voce* v) { elem * nuova = (elem *) malloc(sizeof(elem)); elem * step = (elem *) (*db); nuova->ptvoce = v; if (step) { nuova->next=step; } step = nuova; return 0; } EDIT Ultima modifica di Brazorv : 01-07-2005 alle 17:07. |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
hai una lista (espressa nella forma di un puntatore al suo primo elemento, che può anche essere nullo) e devi accodargli un nuovo elemento, ho capito bene? io farei così (non l'ho provato):
Codice:
typedef struct _elem { voce *pvoce; struct _elem *next; } elem; int push(elem **head, voce *pv) { if (!head) { return -1; } elem *nuovo = (elem*)malloc(sizeof(elem)), **step; nuovo->pvoce = pv; nuovo->next = NULL; for (step = head; *step; step = &(*step)->next); *step = nuovo; return 0; } Ultima modifica di 71104 : 01-07-2005 alle 22:04. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
non credo che quel codice metta un elemento in coda alla lista.
Se vuoi aggiungere un elemento come ultimo della lista devi fare un ciclo per trovare l'ultimo elemento attuale e poi metterlo dopo di questo. Se non ho capito male lui vuole metterlo sempre in testa alla lista. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Innanzitutto grazie ad entrambi delle risposte (devo ancora provarlo).
Poi: non mettere il nuovo elemento in cima alla lista (quello lo facevo tranquillamente), devo invece accodare il nuovo elemento alla lista.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 01-07-2005 alle 21:36. |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
avete ragione, un imperdonabile errore
![]() ho editato, così dovrebbe andare, a meno di altri imperdonabili errori ![]() ariciao ![]() |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Codice:
void push(elem **ptr,voce *pv) { elem *nuovo,*temp; nuovo =(elem *)malloc(sizeof(elem)); nuovo->pvoce=pv; nuovo->next=NULL; if(!(*ptr)){ *ptr=nuovo; return; } for(temp=*ptr; temp->next;temp=temp->next); temp->next=nuovo; } |
![]() |
![]() |
![]() |
#8 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
se la lista è vuota devi mettere nuovo come primo elemento, altrimenti scorri la lista e lo metti come ultimo.
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Se devi fare una coda probabilmente ti conviene creare una struttura "radice" che ha il puntatore sia del primo che dell'ultimo elemento. In questo modo l'inserimento diventa O(1) invece di O(N).
ciao ![]() |
![]() |
![]() |
![]() |
#11 | |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Quote:
Codice:
void push(elem **testa,elem **coda,voce *pv) { elem *nuovo,*temp; nuovo =(elem *)malloc(sizeof(elem)); nuovo->ptvoce=pv; nuovo->next=NULL; if(!(*testa)){ *testa=nuovo; *coda=nuovo; return; } (*coda)->next=nuovo; *coda=nuovo; } |
|
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#13 | |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Quote:
Manca anche un altro controllo su un puntatore. ![]() |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Jul 2004
Città: Napoli
Messaggi: 2029
|
Quote:
se devi fare una coda è meglio gestirla con due puntatori. ciauz |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Proverò con le vostre funzioni. Speriamo bene! ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#16 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
|
|
![]() |
![]() |
![]() |
#17 |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Guarda come ti ho detto prima era solo che non avevo tralasciato dei controlli
Codice:
int push(elem **testa,elem **coda,voce *pv) { if(!testa || !coda || !pv) return -1; elem *nuovo; nuovo =(elem *)malloc(sizeof(elem)); if(!nuovo) return -1; nuovo->pvoce=pv; nuovo->next=NULL; if(!(*testa)){ *testa=nuovo; *coda=nuovo; return 0; } (*coda)->next=nuovo; *coda=nuovo; return 0; } Poi se metti NULL in pv non ti crasha la funzione, ma se poi fai riferimento all'elemento che hai lasciato NULL (per esempio così tmp->pvoce ) ti crasha perchè pvoce è NULL. |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8878
|
Quote:
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#19 | |
Member
Iscritto dal: Aug 2004
Messaggi: 156
|
Quote:
Come fai il reverse della lista? |
|
![]() |
![]() |
![]() |
#20 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:39.