Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] può andare come soluzione a questo esercizio sulle liste o è indecente?

    Ciao....altro esercizio per l'esame di programmazione 1...questa volta non ho guardato la soluzione del proff e l'ho risolto a modo mio (diverso da come l'ha fatto lui...) dite che può andare?è decente come soluzione o fà schifo?

    L'esercizio dice:

    Scrivere una funzione con prototipo int *extract(List *pL, int *nE) che elimini dalla lista *pL gli elementi x per i quali esiste un elemento successivo y tale y.cod > x.cod, alloca dinamicamente un vettore che contiene i valori dei campi cod degli elementi eliminati, restituisce in *pL il puntatore al primo elemento della lista modificata, in *nE il numero degli elementi eliminati e ritorna il vettore.

    Se non ci sono elementi eliminati la funzione ritorna NULL. Si assume che i valori dei campi cod siano tutti distinti

    Esempio: se la lista è 5->12->7->10->9 viene modificata in: 5->7->9, il vettore creato è [12, 10] e in *nE è restituito 2.

    Mia Soluzione:

    codice:
    /* La funzione extract() riceve il puntatore al primo nodo della lista e il
       puntatore alla variabile nE dove andare ad inserire il numero degli elementi
       eliminati e ritorna l'indirizzo del vettore di interi */
    
    #include <stdio.h>
    #include <stdlib.h>
       
    typedef struct Elem{
        int cod;
        struct Elem *next;
    } Elem, *List;    
    
    int *extract(List *pL, int *nE){
        
        List L;         // Dichiaro il puntatore al nodo corrente
        List succ;      // Dichiaro il puntatore al nodo successivo
        int dimvet;    // Numero di elementi che compongono il vettore
        int *vett=NULL;     // Puntatore alla prima locazione del vettore di interi
        int val1;     // Contiene il valore del campo cod del nodo puntato da L
        int val2;     // Contiene il valore del campo cod del nodo puntato da suc
        int contatore = 0;    // Indice di scorrimento del vettore
        
        L = pL;           // Setta L al primo nodo della lista
        succ = L->next;    // Setta suc al nodo successivo ad L
        
        /* Ciclo che calcola quanti elementi vanno eliminati dalla lista e quante
           locazioni dovranno essere allocate per il vettore di interi vet */
        
        while(succ != NULL){
            
            val1 = L->cod;
            val2 = succ->cod;
            
            if(Less(val1, val2) == 1){       // Se la funzione Less restituisce 1
                    dimvet++;                // incrementa dimvet
            }
            
            L = L->next;    // Aggiorna L e fallo puntare al prossimo nodo
            succ = succ->next; // Aggiorna succ e fallo puntare al prossimo nodo
            *nE = dimvet;
        }
        
        vett = calloc(dimvet, sizeof(int)); // Alloca un vettore di dimevet interi
        
        L = pL;    // Reimposta nuovamente il puntatore L al primo nodo della lista
        succ = L->next;    // Reimposta suc al nodo successivo a L
        
        /* Ciclo che salva i valori da eliminare nel vettore ed elimina i nodi */
        
        while(succ != NULL){
            
            val1 = L->cod;
            val2 = succ->cod;
            
            if(Less(val1, val2) == 1){    // Se la funzione Less restituisce 1
                    
                    /* Imposta il valore del campo next puntato da L con il valore
                       del campo next del nodo puntato da succ */
                    L->next = succ->next;
                    
                    /* Copia il valore del campo cod del nodo puntato da suc nel
                       vettore di interi alla posizione indicizzata da contatore */
                    vett[contatore] = succ->cod;
                    
                    contatore++;    // Incrementa il contatore
                    
                    free(succ);    // Elimina il nodo puntato da succ 
            }
            
           L = pL;    // Reimposta nuovamente il puntatore L al primo nodo
           succ = L->next;    // Reimposta suc al nodo successivo a L
       }
       
       return(vett);       // Ritorna il puntatore alla prima locazione del vettore
    }
    
    /* La funzione Less() riceve il valore del campo cod del nodo corrente e il
       valore del campo cod del nodo successivo, se il valore corrente < del valore
       successivo restituisce 1, 0 altrimenti */
       
    short Less(int val, int valsucc){
        
        if(valsucc > val)
              return 1;
        else
          return 0;
    }
    Grazie
    Andrea

  2. #2
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    io l'avrei fatto ricorsivamente...
    e cmq stai attento nella dichiarazione della funzione...c'è un errore...
    se dici che
    codice:
    List L;         // Dichiaro il puntatore al nodo corrente
    è un puntatore ad un nodo(corretto, perchè nella definizione della struct...mica ti posso dire tutto :maLOL, perchè nella dichiarazione
    codice:
    (List *pL, int *nE)
    List *pL è un puntatore anche esso???
    le 2 dichiarazioni sono diverse ed infatti il compilatore da errore "Illegals Types"...
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    ah si i miei soliti errori di distrazione...che rincojonito...cmq considerando che l'esame è su carta e bada più che altro alla logica...sarebbe stato passabile?

  4. #4
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    va bè che bada alla logica...
    però far passare un doppio puntatore per un puntatore non è un errore di distrazione...sicuramente lo avrebbero notato
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

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 © 2024 vBulletin Solutions, Inc. All rights reserved.