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

    [C]Funzione sulle liste...perchè da errore?

    Ciao,
    oddioo l'esame si avvicina (è su carta, non deve girare eil proff guarda più che altro la logica che ci stà dietro)....questo era il primo esercizio di un vecchio esame...esercizio a sbarramento...ovvero se non si prendono 7 punti su 10 su questo puoi anche aver fatto gli altri esercizzi tutti perfetti ma sei tristemente bocciato...

    Come logica ci dovrei essere...perchè ad occhio e croce è la stessa usata dal proff nella soluzione ma non mi gira e il compilatore dà vari errori...

    Potete dirmi cosa ci sia di sbagliato e se come logica ci stà?

    codice:
    /* La funzione int Comp(LStr *L) riceve il puntatore al primo nodo della lista
       ordinata in senso non decrescente rispetto al valore del campo val, la
       modifica in modo tale che  elementi consecutivi che hanno lo stesso valore
       del campo val sono sostituiti da un elemento  il cui valore del campo val è
       lo stesso e il campo str è la stringa prodotta dalla concatenazione, nell'
       ordine, delle strighe degli elementi sostituiti. La funzione ritorna il
       numero massimo di elementi con lo stesso valore del campo val */
       
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct VStr{
        long val;
        char *str;
        struct VStr *next;
    }VStr, *LStr;
    
    int Comp(LStr *L){
        
        int max = 0;    // Valore massimo da restituire al chiamante
        int numvol = 0; // Numero di doppioni trovati per un determinato elemento
        int nuovalunghezza;    // Numero di caratteri della nuova stringa
        int val;        // Contiene il valore del campo val puntato da L
        
        LStr prev;    /* Contiene l'indirizzo del nodo che precede il nodo puntato
                         da L */
        
        prev = NULL;  // Inizialmente prev corrisponde a NULL perchè L punta 1° nodo
        
        while(L!=NULL)    // Scorre la lista fino alla fine
        
            /* Se L non punta al primo nodo e il valore del campo val del nodo
               precedente (messo in val) è uguale al valore del campo val del nodo
               corrente */
            
            if(prev != NULL && val == L->val){
                /* Calcola la nuova lunghezza della nuova stringa */
                nuovalunghezza = strlen(prev->str)+strlen(L->str);
                /* Rialloca dinamicamente per inserire la nuova stringa */
                prev->str = realloc((prev->str, (nuovalunghezza+1)*sizeof(char));
                /* Concatena le 2 strinhe nel campo str puntato da prev */
                strcat(prev->str, L->str);
                
                /* Linka il nodo puntato da prev al nodo puntato da L (L sarà
                   eliminato) */
                prev->next = L->next;
                
                /* Libera la memoria del vettore il cui puntatore è nel campo str 
                   puntato da L */
                free(L->str);
                /* Elimina il nodo L e libera la memoria */
                free(L);
                
                L = prev->next; // Aggiorna il valore di L al nodo successivo
                
                numvol++;       // Incrementa il numero di doppioni trovati
            }
            
            else{
                if(numvol > max)
                        max = numvol;
                
                numvol = 1;
                val = L->val;
                prev = L;
                L = L->next;
            }
            
            if(numvol > max)
                    max = numvol;
            
            return max;
    }
    Ancora infinitamente grazie

    Ciao
    Andrea

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    Gli errori che mi dà sono questi:

    g++.exe -x c++ -c C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c -o C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.o -Wall -fpermissive
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c: In function `int Comp(VStr **)':
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:36: request for member `val' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:38: request for member `str' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:40: warning: left-hand operand of comma expression has no effect
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:40: parse error before `;'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:42: request for member `str' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:42: warning: implicit declaration of function `int strcat(...)'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:46: request for member `next' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:50: request for member `str' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:54: assignment to `VStr **' from `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:64: request for member `val' in `*L', which is of non-aggregate type `VStr *'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:65: assignment to `VStr *' from `VStr **'
    C:\DOCUME~1\Andrea\DOCUME~1\C\file\zxzxz.c:66: request for member `next' in `*L', which is of non-aggregate type `VStr *'
    Failure


    Almeno come logica ci stà?

  3. #3
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    a occhio ci sono 2 errori...

    quarda il post sotto.
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  4. #4
    Utente di HTML.it L'avatar di byaur
    Registrato dal
    Aug 2004
    Messaggi
    1,061
    però non postare le cose 2 volte...

    c'è gia una tua discussione intitolata "[C]Aiuto...perchè questa funzione non và? errore" del 26-05-2005 18:46 che tratta dello stesso argomento...non è correttissimo, puoi avere anche 8 esami(e ti assicuro che c'è ne ho io tanti) però non sei in diritto di postare quante volte vuoi la stessa discussione. sono cose che mi infastidiscono molto. e per questo, anche se avevo capito che ha il tuo frammento di codice e lo messo nella discussione precendente , tolgo quello che ho scritto.

    poi i moderatori sapranno che fare.
    Chi di noi non vorrebbe
    sollevare il velo sotto cui sta nascosto il
    futuro...
    David Hilbert

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da byaur
    poi i moderatori sapranno che fare.
    Ho provveduto a chiudere la discussione più vecchia che non aveva risposte. Per il resto, quoto tutto ciò che ha detto byaur.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

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.