Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c++] problema sulle liste?

    salve a tutti, stavo facendo questo problema sulle liste:
    Sia data la struttura seguente, con il campo info puntatore ad una stringa allocata nella memoria dinamica:struct elem {char* info; elem* pun;};
    Scrivere una funzione che data una lista L di elementi di tipo elem ed una stringa st, elimina dalla lista L tutti gli
    elementi il cui campo informazione è maggiore o uguale a st. La lista e la stringa devono essere passate come argomento alla
    funzione.
    ho svolto la funzione in questo modo:
    codice:
    void elimina (elem*testa, char * st) {
     
     if (testa==NULL)
      return;
     elem *p=testa; elem *q=NULL;
     
     for (p; p!=NULL; p=p->pun){
      q=p; //un elemento indietro
      
      if (strcmp (p->info, st)<=0) {
       q->pun=p->pun;
       delete p->info;
       delete p;
    
      }
     }
    return;
    }
    il codice del professore invece è questo:

    codice:
    void elimina(elem*& p, char* s) {
    if (p== NULL)
    return;
    elem*q, *r;
    // elimino elementi in testa
    while ((p != NULL) && (strcmp(p->info, s) <=0)) {
    q=p;
    p=p->pun;
    delete[] q->info;
    delete q;
    }
    if (p == NULL)
    return;
    r = p;
    q = p->pun;
    //elimino non in testa
    while(q!=NULL) {
    if (strcmp(q->info, s) <=0) {
    r->pun = q->pun;
    delete[] q->info;
    delete q;
    q = r->pun;
    }
    else {
    r = q;
    q = q->pun;
    }
    }
    }
    come vedete il mio codice è più corto, di conseguenza sarà sbagliato sicuramente in qualche suo punto. il problema è che non riesco a capire perchè il mio codice non funziona.

  2. #2
    Prova a riflettere sulle differenze tra queste righe:
    codice:
    // tua 
    void elimina (elem*testa,char* st)
    
    // del prof
    void elimina(elem *& testa, char*s)
    e capirai tutto il codice.

    Inoltre cerca di capire anche la differenza tra:
    codice:
    delete    p->info;    // tua
    delete[]  p->info;    // del prof

  3. #3
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    Prova a riflettere sulle differenze tra queste righe:
    codice:
    // tua 
    void elimina (elem*testa,char* st)
    
    // del prof
    void elimina(elem *& testa, char*s)
    e capirai tutto il codice.

    Inoltre cerca di capire anche la differenza tra:
    codice:
    delete    p->info;    // tua
    delete[]  p->info;    // del prof
    avevo immaginato che il problema fosse proprio nel riferimento, tuttavia non capisco cosa può cambiare dal passare come argomento un elem per puntatore-riferimento e passarlo solo come puntatore. un riferimento nel c++ non è un "nome alternativo" dell'oggetto? in che modo riesce a cambiare drasticamente tutto il codice?

  4. #4
    Il punto è che se passi il puntatore alla testa per valore allora nella funzione chiamante il puntatore originale non sarà modificato e quasi sicuramente andrà a puntare ad aree di memorie sporche causando undefined behaviour.

  5. #5
    Capisco, quindi è lo stesso meccanismo della funzione scambia?
    mi sembra di capire quindi che devo usare il riferimento ogni volta che ho da modificare la testa della lista, è giusto?

  6. #6
    capisco, quindi è lo stesso meccanismo della funzione scambia?

    sì.
    mi sembra di capire quindi che devo usare il riferimento ogni volta che ho da modificare la testa della lista, è giusto?
    Se devi modificare il puntatore alla testa della lista sì, altrimenti no.

  7. #7
    OK. Grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.