Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2014
    Messaggi
    55

    Inseriemnto ordinato in lista...quale versione è più performante/corretta?

    Ciao a tutti, ho realizzato questa funzione:


    codice:
    void inserisci_nodo(nodo* &list)
    {
        //crea il nodo
        nodo* new_node = NULL;
        new_node = new nodo;
        cout<<"Inserire il valore del nuovo nodo: ";
        cin>>new_node->info;
        new_node->next = NULL;
    
    
        // cerca la posizione nel quale inserirlo
    
    
        if(list == NULL) //se la lista e' vuota bisogna collegare direttamente il nodo alla lista
        {
            list = new_node;
        }
        else //altrimenti bisogna cercare la posizione nella quale inserire il nodo
        {
            if(new_node->info < list->info)
            {
                new_node->next = list;
                list = new_node;
            }
            else
            {
                nodo* curr = list; //nodo temporaneo che controlla se il valore del nodo
                nodo* prec = list;
    
    
                while(curr != NULL && curr->info < new_node->info)
                {
                    prec = curr;
                    curr = curr->next;
                }
                prec->next = new_node;
                new_node->next = curr;
            }
        }
    }
    che fa inserire un nodo in maniera ordinata in una lista.
    Funziona al 100%.

    L'algoritmo di cui sopra l'ho fatto io seguendo una mia logica che non mi sento di definire scorretta, ma vedo che online tutti usano algoritmi di questo tipo:

    codice:
    void inserisci_nodo(nodo* &list)
    {
        //crea il nodo da inserire
        nodo* new_node = NULL;
        new_node = new nodo;
        cout<<"Inserire il valore del nuovo nodo: ";
        cin>>new_node->info;
        new_node->next = NULL;
    
    
        // cerca la posizione nel quale inserirlo
        nodo* curr = list;
        nodo* prec = NULL;
    
    
        while(curr != NULL && curr->info < new_node->info)
        {
            prec = curr;
            curr = curr->next;
        }
    
    
        if(prec == NULL)
        {
            new_node->next = list;
            list = new_node;
        }
        else
        {
            prec->next = new_node;
            new_node->next = curr;
        }
        
    }
    secondo voi, qual'è la versione più "corretta" o quantomeno performante?

  2. #2
    Entrambi sono corretti e hanno sostanzialmente le stesse performance, la seconda è un filo meglio stilisticamente perché condensa due casi speciali (lista vuota ed elemento nuovo minore di tutti quelli vecchi) in uno.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Personalmente suggerisco di stare particolarmente attento alla priorità degli operatori, usando le () per evitare (possibili) effetti collaterali negativi, soprattutto se si entra nella "forma mentis" di C e poi magari si scrive in altri linguaggi

  4. #4
    L'unica 'pecca' del tuo codice è che confronti il primo elemento 2 volte
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

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.