|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Apr 2006
Messaggi: 36
|
[c] - linked list
Ciao a tutti!
ho un esercizio da risolvere che proprio nn ho capito, premetto che sono alle prime armi con le linked lists . ecco il testo : Gestione camere d'albergo - simulare in C la linked list tramite due array statici : il primo contenente le informazioni (può essere anche un array di struct), il secondo array contenente i link(puntatori ai nodi della lista). E' necessario creare prima una "lista libera" inizializzando l'array dei link in modo che ogni componente punti alla componente successiva. La "lista libera" corrisponde alla memoria in cui allocare la lista delle informazioni : infatti i nodi da inserire nella linked list delle informazioni sono prelevati dalla lista libera, mentre i nodi da eliminare dalla lista delle informazioni vanno restituiti alla lista libera. -------------------------------- Non ho capito bene il testo e ho difficoltà a capire come impostare l'algoritmo. Che pensate? Secondo voi devo far uso solo di array statici o usare : struct linked_list { DATA d; struct linked_list *next; }; typedef struct linked_list ELEMENT; typedef ELEMENT *LINK; |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Feb 2004
Città: BhO
Messaggi: 3701
|
Quote:
se dici che devi simulare una lista con array statici vuole dire che quella struttura che dici tu(che è una lista) non va bene...
__________________
il cucchiaio non esiste...MondoIT: recensioni, appunti di vita da nerd, virtualizzazione e altre diavolerie informatiche Linux User 414915 linux counter Ho concluso con yorick, gor, djgusmy85, sulphur, Rospaccio, Leland Gaunt, paciuli
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
Anche io sto affrontando lo stesso esercizio e non ho ancora capito bene se qualcuno vuol riaprire l'argomento ne sarò lieto.
Anche se è stato aperto nel 2006
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
La struttura creata da ilgrigio non va bene perchè utilizza i puntatori io dovrei invece creare una lista con array statici come dici l'esercizio, qualcuno di voi saprebbe guidarmi sulla creazione della struttura?
Per esempio Codice:
struct nodo{int nome[30];int pnext;}persona[100];
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Feb 2004
Città: BhO
Messaggi: 3701
|
Quote:
__________________
il cucchiaio non esiste...MondoIT: recensioni, appunti di vita da nerd, virtualizzazione e altre diavolerie informatiche Linux User 414915 linux counter Ho concluso con yorick, gor, djgusmy85, sulphur, Rospaccio, Leland Gaunt, paciuli
|
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Una lista con array statici la puoi simulare tranquillamente.
Crei un array di struct. La struttura dati sarà di questo tipo: Codice:
struct nodo
{
xxxx info;
int next;
int free;
};
Questo se non si utilizzano i puntatori. Volendo si potrebbero comunque utilizzare i puntatori facendo in modo che next punti direttamente all'indirizzo del prossimo elemento all'interno del vettore. Inoltre volendo si può ottimizzare l'inserimento (nel caso sopra la ricerca della posizione in cui inserire un nuovo elemento è O(n) perché bisogna ricercare il primo elemento libero) mantenendo un altro vettore, come coda circolare o come stack (forse meglio il secondo per il principio di località), in cui inserire tutti gli indici che contengono gli elementi liberi nell'altro vettore (ovviamente free non serve più). |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
cionci sei stato molto chiaro ma non ho capito una cosa l'array lista_libera lo devo creare? perchè l'esercizio lo consiglia ma non so se è obbligatorio. se si iniziano da 1 gli elementi?
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Puoi utilizzarlo o meno, se non lo utilizzi devi immettere un flag "free" nella struttura dati che indica se quell'elemento è libero o meno. Se lo utilizzi però fallo sotto forma di stack, perché viene proprio carino
Ultima modifica di cionci : 19-09-2008 alle 16:49. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
se decido si usare l'array listalibera devo inserirlo nella struct cioè
Codice:
struct nodo {char nome[20];int next;
int listalibera[9];};
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ovviamente come array esterno
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
Da come ho capito l'ultimo elemento di questo array cioè listalibera deve essere -1 per segnalare la fine dei posti vuoti è vero?
Scusami per le troppe domande è solo che questo esercizio mi sta facendo impazzire |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
Quote:
Cmq da quel che ho capito, no non deve essere -1. L'ultimo elemento di listalibera deve puntare all'ultimo elemento della lista e basta! Poi è un array....lo sai che quello è l'ultimo!
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
listalibera quindi parte da 0 o da 1 ?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No non deve essere così, dovresti semplicemente mettere 0 nei posti vuoti e 1 nei posti occupati. Scorrertelo fino a trovare un posto libero (a 0) per fare un inserimento, poi al momento dell'eliminazione di un nodo basta inserire zero nel indice corrispondente.
Secondo faresti meglio a gestirlo come stack, è molto più semplice: all'inizio il vettore devi riempirlo con tutti gli indici (sono tutti liberi). Al momento dell'inserimento recuperi l'indice di un elemento libero dalla testa dello stack, al momento dell'eliminazione reinserisci l'indice dell'elemento nuovamente libero nello stack. Ultima modifica di cionci : 20-09-2008 alle 11:01. |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perché questa cosa ? Secondo me deve solamente indicare che un nodo è presente/assente.
Ultima modifica di cionci : 20-09-2008 alle 11:01. |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Prince_81: però mi sorge un dubbio: come ti è stato chiesto di implementare questa lista ? Perché l'esercizio dice una cosa diversa da quella che dico io. Quella diciamo è un'implementazione un po' particolare.
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 412
|
Codice HTML:
Siimullare in C una linked lliistt ttramiitte due array sttattiicii:: iill priimo conttenentte lle iinformaziionii (può essere anche un array dii sttructt),, iill secondo array conttenentte ii lliink (punttattorii aii nodii delllla lliistta).. [È necessario creare prima una “lista libera”, inizializzando l’array dei link in modo che ogni componente punti alla componente successiva. La lista libera corrisponde alla memoria in cui allocare la lista delle informazioni: infatti i nodi da inserire nella linked list delle informazioni, sono prelevati dalla lista libera; mentre i nodi da eliminare dalla lista delle informazioni vanno restituiti alla lista libera.] Codice HTML:
array di struct NODO {INFO, pnext}
simula la memoria dove saranno
allocati i nodi della lista lineare
ListaDati.
p_Libera
Per rendere dinamica la gestione della
“memoria simulata” viene creata inizialmente
la lista lineare ListaLibera (con p_Libera
puntatore alla sua testa)
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ah che complicazioni inutili
Un nodo che fa parte della lista libera è un nodo non appartenente alla lista vera e propria. Un nodo della lista libera punta sempre ad un nodo della lista libera, tranne l'ultimo che punterà a -1 (stessa cosa per la lista vera e propria). Ti devi ovviamente tenere un indice esterno che punta al primo elemento della lista libera ed un indice esterno che punta al primo elemento della lista vera e propria. La lista libera è composta solo da "puntatori" a next (in questo caso non sono puntatori, ma indici del vettore). Ad esempio se sono liberi gli elementi 2, 3, 4, 6, 8 su 10 elementi, il puntatore esterno punterà a 2. Il contenuto del vettore sarà: x, x, 3, 8, 6, x, -1, x, 4, x (supponendo che siano linkati così: 2->3->8->4->6) Gli inserimenti di indici liberi ti converrà farli in testa. Così come l'aggiunta di nodi liberi. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
|
io intendevo una cosa del genere (vedi allegato)
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes] "Pirating software? Choose Microsoft!" |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:21.




















