Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-05-2005, 17:04   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
[C] Problema esercizio C sulle liste

Ciao, tra 8 giorni ho l'esame...inizio a capirci qualcosa ma mi sono impallato con la soluzione di questo esercizio (messa online dal proff ma mi sembra sbagliata ditemi voi)

L'esercizio chiede di scrivere una funzione che presa in ingresso una lista di char elimini i doppioni e restituisca il puntatore alla lista cos modificata

Il codice della soluzione è questo (è quella del proff...io ho modificato solo la dichiarazione delle variabili e puntatori perchè mi trovo meglioa dichiararli all'inizio del codice anzichè in mezzo al codice...i commenti invece sono i miei, ditemi se ho sbagliato qualcosa):

Codice:
/* La funzione  RipulisciStr() prende in input il puntatore al primo nodo di una
   lista di interi, elimina i duplicati ritorna il puntatore al primo nodo della
   lista così ripulita, gli elementi della lista hanno il seguente tipo:
       
       typedef struct SList{
           char *stringa;
           struct SList *next;
       } SList;
*/
typedef struct SList{
           char *stringa;
           struct SList *next;
       } SList;

SList *RipulisciStr(SList *L){
    
    SList **pL;     /* Dichiaro il doppio puntatore pL che contiene l'indirizzo 
                       della locazione corrente */
    SList *elem;    // Dichiara il puntatore elem
    
    pL = &L;   // Imposta pL con l'indirizzo del primo elemento della lista (?)
    
    while(*pL != NULL){    // Finchè non si è giunti alla fine della lista
           
           elem = *pL;  /* Imposta il valore di elem all'indirizzo del nodo
                           puntato da Pl */
    
           /* Se la funzione TrovaStr restituisce un valore non nullo */                                               
           if(TrovaStr(elem->stringa, elem->next)){
               
               *pL = elem->next; /* Imposta il valore puntatoda da pL con
                                    l'indirizzo del campo next puntato da elem*/
               free(elem->stringa);
               free(elem);
           }
           /* Se non è stato trovato un doppione nella lista pL contiene
              l'indirizzo del prossimo elemento rispetto al campo elem */
           else
             pL = &(elem->next);
    }
    return L;
}

/* Funzione ausiliaria che determina se la stringa str è presente o meno nella
   lista di stringhe */

short TrovaStr(const char *str, const SList *L){
    
    while(L != NULL && strcmp(str, L->stringa) != NULL)
        L = L->next;
    
    return(L != NULL);
}
Ci sono varie cose che non mi tornano:

1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!

2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!

3) non ho capito bene che restituisce la funzione ausiliaria....

vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:21   #2
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).

Quote:
1) Ma quando faccio pL = &L vuol dire che metto in pL l'indirizzo del puntatore al primo nodo della lista vero? quindi *pL mi dovrebbe dare l'indirizzo del primo nodo....giusto? e **pL che dovrebbe darmi allora?!?!
il nodo stesso, no?

Quote:
2) Se trova un doppione libera lo spazio del vettore stringa e poi libera il nodo ma non và a rilinkare i nodi della lista una volta eliminato un nodo...mi pare strano !!!
hai ragione: si vede che ti ho addestrato io!!! e quello è un errore, ma ce n'è anche un altro!! riesci a trovarlo?

Quote:
3) non ho capito bene che restituisce la funzione ausiliaria....
ragiona: l'operatore != restituisce un valore booleano, cioè restituisce 0 se le due espressioni sono uguali, 1 se sono diverse; quindi la funzione ausiliaria ti restituisce un valore indicativo del fatto che sia stato trovato o meno un doppione: infatti se il doppione non è stato trovato, con l'iterazione L sarà arrivato alla fine (cioè a NULL), quindi "L != NULL" restituirà 0 e la funzione pure (giustamente la funzione restituisce 0 se non trova il doppione, 1 altrimenti).

Quote:
vi prego aiutatemi...ditemi che non sono completamente demente e che in questa soluzione c'è qualcosa che non torna...
e va bene, questa volta te lo sei meritato: non sei completamente demente (anzi!) e in questa soluzione ci sono molte cose che non tornano (e se mi sbaglio pure io allora ad essere dementi saremo in due: contento? ); ma ti dirò di più: con un professore così, capisco perfettamente che tu ti lamenti delle difficoltà con il C e con le liste.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:28   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da 71104
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).

il nodo stesso, no?

hai ragione: si vede che ti ho addestrato io!!! e quello è un errore, ma ce n'è anche un altro!! riesci a trovarlo?

ragiona: l'operatore != restituisce un valore booleano, cioè restituisce 0 se le due espressioni sono uguali, 1 se sono diverse; quindi la funzione ausiliaria ti restituisce un valore indicativo del fatto che sia stato trovato o meno un doppione: infatti se il doppione non è stato trovato, con l'iterazione L sarà arrivato alla fine (cioè a NULL), quindi "L != NULL" restituirà 0 e la funzione pure (giustamente la funzione restituisce 0 se non trova il doppione, 1 altrimenti).

e va bene, questa volta te lo sei meritato: non sei completamente demente (anzi!) e in questa soluzione ci sono molte cose che non tornano (e se mi sbaglio pure io allora ad essere dementi saremo in due: contento? ); ma ti dirò di più: con un professore così, capisco perfettamente che tu ti lamenti delle difficoltà con il C e con le liste.

che intendi che mette il nodo stesso in pL?! scusa ma stò un po' fuso ora, ah grazie mille della tua costante disponibilità...ti venero
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:35   #4
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1455
Quote:
Originariamente inviato da 71104
premessa: il tuo prof ha un pessimo modo di programmare (è talmente ingenuo da far tenerzza...).
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 17:39   #5
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da beppegrillo
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
si vabbè ma che cavolo certe cose sò allucinanti...elimini un nodo dalla lista...devi rilinkare gli altri altrimenti quando vai a fare la scansione sono casini
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 19:17   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da beppegrillo
Eh forse sono esempi semplici fatti di proposito. Non capiscono così figuriamoci se volesse complicarli
non, non hai capito: non mi riferivo alla chiarezza, intendevo dire che il suo prof a programmare è una sega! con quella sedicente "soluzione" in poche righe ha preso tanti di quegli strafalcioni che a pensare a tutti quei poveri studenti in balìa di quel cretino vengono prima i brividi e poi una pena infinita... povero darkangel e poveri i compagni suoi...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2005, 19:22   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da D4rkAng3l
che intendi che mette il nodo stesso in pL?! scusa ma stò un po' fuso ora, ah grazie mille della tua costante disponibilità...ti venero
denghiu' ^^ cmq, prendi questo esempio:

Codice:
typedef _nodo {
//...
} nodo, *pnodo;
.
.
.
nodo n;
pnodo pn = &n;
pnodo *ppn = &pn;
tu hai questo nodo n e un puntatore ad esso che si chiama pn; poi hai anche una variabile ppn che punta a pn; se tu fai il dereferencing di ppn ottieni pn; se fai il dereferencing di pn (cioè *pn) che cosa ottieni? ecco, la stessa cosa la ottieni facendo il doppio dereferencing di ppn, cioé **ppn; quello che ottieni non è un puntatore ad n, ne' è un puntatore a un puntatore ad n: è n stesso, cioè risulta precisamente
Codice:
**ppn == n;
spero di essere stato chiaro.

Ultima modifica di 71104 : 23-05-2005 alle 19:24.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Anthropic avrebbe nuovi antibiotici cont...
Scoperto un 'moltiplicatore nascosto' ne...
DREO: a IFA 2026 4 novità fra cui...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
NVIDIA App aggiunge una delle funzioni p...
Come sarebbe il mondo se la luce viaggia...
Titanio, ceramica e zaffiro per HUAWEI W...
Taglio delle accise sul gasolio prorogat...
Universal e ElevenLabs: una piattaforma ...
Astra mette in crisi i server di OpenAI:...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:59.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v