Inserire valori in una lista ordinata

di il
1 risposte

Inserire valori in una lista ordinata

Salve a tutti, avrei un problema con il seguente programma, che, dato un array di n elementi
ad esempio già ordinati in ordine crescente, e dati ad esempio altri k=3 elementi dello stesso tipo,
dovrebbe andarli ad inserire uno alla volta nel primo array! Ovviamente il programma che ho riportato corrisponde alla parte interessata ed è quella che mi da problemi.
Se può essere utile aggiungo che per quanto riguarda il primo valore da inserire funziona perfettamente, e lo inserisce rispettando le relazioni! Una volta riiniziato il ciclo si "impappina"!
Nel programma, n rappresenta la dimensione dell'array su cui inserire i k elementi, che nell'esempio ho supposto pari a 3. Gli array rispettivamente sono v[n] e w[k].
Spero di essere stato abbastanza chiaro.
Grazie per l'attenzione!
 void crea_spazio (elenco_corsi v[], int& n, int pos){
    n=n+1;
    
    int i=n-1;
    
    while (i>pos){
        v[i]=v[i-1];
        i--;
    }
    
    return;
}

void inserisci (elenco_corsi v[],elenco_corsi w[], int& n, int j) {
    bool fatto=true;
    int i=0;
    
    while(fatto && i<n)
    {
    
        if (w[j].studenti<v[i+1].studenti&&w[j].studenti>v[i].studenti){
        crea_spazio(v, n, i+1);
        v[i+1]=w[j];
        fatto=false;
        }
    
        i++;
    }
    return;
}


void inserisci_k (elenco_corsi v[], int& n, elenco_corsi w[], int k){
    
    for(int j=0; j<k; j++)
        inserisci(v, w, n, j);
    
    return;
}

1 Risposte

  • Re: Inserire valori in una lista ordinata

    Allora, per prima cosa devi essere sicuro che la dimensinoe dell'array sia sufficiente per contenere i nuovi elementi. Ad esempio se la sua dimensione è 10 e contiene già 8 elementi, puoi aggiungerne al massimo altri due, altrimenti potresti accedere ad area di memoria che non è di tua competenza ('segmentation fault' ad esempio).
    Per quanto riguarda l'inserimento, penso che sia meglio non mettere nei parametri l'array e la posizione dell'elemento da inserire, bensì solo il valore da inserire:
    
    void inserisci(elenco_corsi v[],const elenco_corsi &e,int &n) {
    
    in questo modo puoi usare la funzione per inserire qualsiasi elemento di tipo 'elenco_corsi' in un array dato dello stesso tipo, sia che esso provenga da un array che da una singola variabile (la funzione infatti deve inserire 'uno e un solo' elemento).
    Penso che poi sia sufficiente solo la verifica:
    if (e.studente <=v[i].studente)
    dato che il posto da inserire è quello in cui il suo valore sia o ugale o minore.
    A questo punto il codice modificato potrebbe essere questo:
    
    void crea_spazio (elenco_corsi v[], int& n, int pos) {
        for ( int i = n ; i > pos ; i-- )
            v [ i ] = v [ i - 1 ] ;
        n++;
    }
    
    void inserisci ( elenco_corsi v[] , const elenco_corsi &e , int &n ) {
        int i = 0 ;
        while ( i < n ) {
            if ( e.studenti < v[i].studenti ) break ;
            i++ ;
        }
        crea_spazio(v,n,i);
        v[i] = e;
    }
    
    void inserisci_k (elenco_corsi v[] , int& n , elenco_corsi w[] , int k ) {
        for(int j=0; j<k; j++)
            inserisci (v, w[j], n ) ;
    }
    
Devi accedere o registrarti per scrivere nel forum
1 risposte