Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Marathon: arriva il Fortnite hardcore
Marathon: arriva il Fortnite hardcore
Marathon è il titolo multiplayer competitivo del momento. Ecco quali sono le caratteristiche di gioco principali, insieme alle nostre prime considerazioni dopo qualche "run" nell'extraction shooter di Bungie
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare
A New York HP ha messo al centro della scena HP IQ, la piattaforma di IA locale da 20 miliardi di parametri. L’abbiamo vista in funzione: è uno strumento che funziona, pensato per un target specifico, con vantaggi reali e limiti altrettanto evidenti
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


Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Wi-Fi 7 con il design di una vetta innevata: ecco il nuovo sistema mesh di Huawei Wi-Fi 7 con il design di una vetta innevata: ecc...
Problemi di prestazioni per MacBook Pro ...
I limiti di utilizzo di Claude sono trop...
Stop al ransomware su Google Drive: avvi...
Pragmata entra in fase gold: il titolo d...
Recensione Crimson Desert: la mastodonti...
Google Pixel 11 Pro: i render svelano il...
Ray-Ban Meta: arrivano Blayzer e Scriber...
Ecco le 7 offerte presenti su Amazon col...
Apple compie 50 anni: dai garage di Los ...
OpenAI raccoglie 122 miliardi di dollari...
Blink Outdoor 4 e Mini 2K+ in offerta su...
Beats Studio Buds+ crollano a 109€: tre ...
Le consegne di Amazon in Italia diventan...
Aggiornamento di emergenza per Windows 1...
Il prossimo top di gamma di Xiaomi avr&a...
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: 12:21.


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