La funzione inserisciInOrdine non aggiunge una parlola alla lista

di Anonimizzato28411 il
1 risposte
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

  • 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