PDA

Visualizza la versione completa : [C] Aggiungere in coda un elemento


Fabiuz
22-12-2004, 16:47
Buonasera a tutti, smanettatori e smanettatrici dei vari linguaggi di programmazione!
Sono di nuovo qua per rompere le scatole e.. porvi una nuova domanda!
Ed eccola: io devo mettere in coda un elemento ad una lista (di strutture), posso farlo semplicemente scorrendo la lista fichè punta a NULL e poi inserire la struttura oppure cè qualche metodo più efficente???

Perdonate la pignoleria!!!!

Ciauz e thx!!! :unz: :unz: :unz:

Ilmalcom
22-12-2004, 16:49
Originariamente inviato da Fabiuz
Buonasera a tutti, smanettatori e smanettatrici dei vari linguaggi di programmazione!
Sono di nuovo qua per rompere le scatole e.. porvi una nuova domanda!
Ed eccola: io devo mettere in coda un elemento ad una lista (di strutture), posso farlo semplicemente scorrendo la lista fichè punta a NULL e poi inserire la struttura oppure cè qualche metodo più efficente???

Perdonate la pignoleria!!!!

Ciauz e thx!!! :unz: :unz: :unz:
Ciao, suppongo tu abbia scaricato le esercitazioni da UniVe. Ti comunico intanto che c'è un'imprecisione: la funzione MettiInCoda, proprio per come è strutturata, funziona solo con liste non nulle :) Quindi crea il primo elemento all'esterno della procedura e poi lavoraci sopra tranquillamente.

L'unico modo per aggiungere in coda è scorrere tutta la lista, purtroppo!
Esempio (addirittura il tuo caso specifico :D):


void MettiInCoda (Sportello s, Prenotazione p) {
Sportello aux = s;
Sportello nuovo;
nuovo = malloc (sizeof (Elem_Sportello));
nuovo->prenotazione = p;
while (aux->next != NULL)
aux = aux->next;
aux->next = nuovo;
nuovo->next = NULL;
}

Fabiuz
22-12-2004, 16:57
Eh si, scaricate proprio 15 min fa!!
Cmq senza sporcare i thread.. il più curioso esercizio è il n°2
Praticamente il succo è: cancella il primo elemento della lista !!! Ma come faccio a verificare se non ci sono + posti nella sala? Devo dire alla f.ne quale sala è ??? Boh!

Ilmalcom
22-12-2004, 17:02
Originariamente inviato da Fabiuz
Eh si, scaricate proprio 15 min fa!!
Cmq senza sporcare i thread.. il più curioso esercizio è il n°2
Praticamente il succo è: cancella il primo elemento della lista !!! Ma come faccio a verificare se non ci sono + posti nella sala? Devo dire alla f.ne quale sala è ??? Boh!
:dottò: L'esercizio 2 chiede banalmente di rimuovere il primo elemento della lista e di aggiornare lo stato del cinema in modo opportuno. Non comporta alcun tipo di difficoltà aggiuntiva: aumenti di 1 le prenotazioni in una delle sale solo se non vi sono già un numero di prenotazioni uguali alla capienza. La sala è contenuta all'interno delle prenotazioni dello sportello stesso.

Fabiuz
22-12-2004, 17:05
Ma il fatto è che non so come collegare Sala, CAPIENZA e prenotazioni!!!! E così mi succede anche con l'Esercitazione precedente! Puoi farmi un esempio di codice???

Fabiuz
22-12-2004, 17:28
ti prego !!!! Altrimenti non posso fare più niente !!!

:cry: :cry: :cry: :cry: :cry: :cry: :cry:

Aiutatemi....fatemi vedere la luce !!! Sn in un mare di oscurità (oltre che di disperazione)!!!!

I need your help.....Thanks :messner: :messner:

infinitejustice
22-12-2004, 17:48
se magari rendete partecipi anche noi :zizi:

Fabiuz
22-12-2004, 18:07
Allora io ho questa cosa:
typedef enum Sala { A, B, C, D } Sala;
const intCAPIENZA [ ] = { 50, 70, 100, 30 };
int prenotazioni [ ] = { 0, 0, 0, 0 };
typedef struct{
Sala sala;char*CF;}Prenotazione;
typedef struct Elem_Sportello {
Prenotazione prenotazione;
struct Elem_Sportello *next; } Elem_Sportello;
typedef Elem_Sportello *Sportello;

Io devo fare questa f.ne:
int EvadiPrenotazione(Sportello *ptr_s );
che accetta la prima prenotazione contenuta nella lista puntata da ptr_s e la toglie dalla lista. La f.ne restituisce 0 se questo non risulta possibile in quanto non sono più disponibili posti in quella sala, altrimenti restituisce 1 e aggiorna la disponibilità dei posti nella sala prescelta.
Solo che non so come fare!!!

Fabiuz
22-12-2004, 18:12
e questo è il testo intero dell 'esercizio:

Un valore di tipo Prenotazioneè un record di due campi. Il primo campo rappresenta la sala in cui viene proiettato il film che si intende vedere (A, B, C o D); il secondo campo CF, di tipo char *, serve a contenere il codice fiscale del richiedente. In ogni sala sono disponibili solo un numero fissato di posti, determinato dall’array costante CAPIENZA, ed il numero di prenotazioni accettate per quella sala è memorizzato nella variabile globale prenotazioni.Un potenziale spettatore entra nella biglietteria del Cinema Multisala, compila la sua prenotazione e si mette in fila ad uno sportello ad aspettare il suo turno. Di fronte ad ogni sportello della biglietteria, cisarà dunque una lista di prenotazioni che aspettano di essere evase: un valore di tipo Sportello è una lista semplice di prenotazioni in attesa.

Così riesco a spiegarmi meglio!!

Ilmalcom
22-12-2004, 18:30
int EvadiPrenotazione (Sportello* ptr_s) {
int num_sala;
Sportello temp;
if (*ptr_s == NULL)
return 0;
else {
num_sala = ((*ptr_s)->prenotazione).sala;
if (prenotazioni[num_sala] < CAPIENZA[num_sala]) {
prenotazioni[num_sala]++;
temp = *ptr_s;
(*ptr_s) = (*ptr_s)->next;
free (temp);
return 1;
}
else
return 0;
}
}

Loading