La funzione inserisciInOrdine non aggiunge una parlola alla lista

di il
1 risposte

La funzione inserisciInOrdine non aggiunge una parlola alla lista

Buonasera non capisco perché la funzione inserisciInOrdine non mi aggiunge alla lista la stringa "arancia".

#include <iostream>
#include <string>
struct cell{
 std::string str;
 cell *next;
};
typedef cell *list;
void inserisciInOrdine(list& l, std::string s)
{
 list curr = l;
 list prev = nullptr;
 list aux = new cell;
 aux->str = s;
 while (curr != nullptr && curr->str <= s)
 {
   prev = curr;
   curr = curr->next;
 }
 aux->next = curr;
 if (curr = l) 
  l = aux;
 else
  prev->next = aux;
}
void print(list l)
{
  cell *aux = l;
  while (aux != nullptr)
  {
   std::cout << aux->str << ' ';
   aux = aux->next;
  }
  std::cout << std::endl;
}
int main()
{
 list l = new cell;
 l->str = "testa";
 
 inserisciInOrdine(l, "arancia");
 inserisciInOrdine(l, "mela");
 print(l);
}


1 Risposte

  • Re: La funzione inserisciInOrdine non aggiunge una parlola alla lista

    Ciao, non mi sono focalizzato più di tanto sulla logica della funzione inserisciInOrdine(), ma aggiustando un paio di cose che mi sono saltate agli occhi sembra funzionare:
    - nel main() non hai inizializzato il membro next a nullptr;
    - nell'if della funzione inserisciInOrdine() stai utilizzando l'operatore di assegnazione.

    In ogni caso, oltre a quanto detto nell'altra discussione

    Nippolo ha scritto:


    Non c'è bisogno della variabile aux nella funzione print(), puoi usare direttamente l.
    io farei qualcosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct nodo
    {
        string str;
        nodo *next;
    };
    
    typedef nodo* lista;
    
    void inserisci_in_testa(lista &L, const string &s)
    {
        nodo *nuovo = new nodo;
        nuovo->str = s;
        nuovo->next = L;
        L = nuovo;
    }
    
    void inserisci_in_ordine(lista &L, const string &s)
    {
        nodo **p = &L;
        while(*p && (*p)->str < s)
        {
            p = &(*p)->next;
        }
        inserisci_in_testa(*p, s);
    }
    
    void print(lista L)
    {
        while(L)
        {
            cout << L->str << " ";
            L = L->next;
        }
        cout << endl;
    }
    
    int main()
    {
        lista L = nullptr;
        inserisci_in_ordine(L, "ciliegia");
        inserisci_in_ordine(L, "arancia");
        inserisci_in_ordine(L, "fragola");
        inserisci_in_ordine(L, "pera");
        inserisci_in_ordine(L, "mela");
        print(L);
    }
    Infine quel typedef lo toglierei proprio e mi sporcherei di più le mani coi puntatori.
Devi accedere o registrarti per scrivere nel forum
1 risposte