Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Stefy
    Registrato dal
    Jul 2005
    Messaggi
    18

    [C] Aiuto implementazione primitiva stack

    Ciao ragazzi, avrei bisogno di una mano su un esercizio di C avanzato.Il testo chiede l'implementazione di una funzione (primitiva) countche restituisca il numero di elementi dello STACK.
    La sintassi è count : STACK-> NATURAL.

    La mia soluzione è la seguente
    Considero la struttura dati:

    #define ITEM float
    typedef struct node { ITEM item ; struct node * next ; } Node;
    typedef Node * STACK ;

    utilizzata per implementare un ADT di tipo STACK.

    Perciò penso che l'implementazione della primitiva sia:



    int count (STACK *s){
    int n = 0;
    for(; s!= NULL; s=s->next)
    n++;
    return n;
    }



    Pensate possa essere giusta?
    Grazie !!

  2. #2
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Penso che ci sia qualcosa che non va.
    Tu passi alla funzione un tipo STACK * che equivale a Node **, un tipo che non può avere il campo item oppure il campo next.
    Per contare elementi penso che basti passare uno STACK alla funzione, invece STACK * potrebbe servire per inserire dati in testa alla lista, ma questa è un'altra storia .

  3. #3
    Utente di HTML.it L'avatar di Stefy
    Registrato dal
    Jul 2005
    Messaggi
    18
    Ah...Quindi dici che, se STACK è un puntatore a Node, allora non posso definire un'altra variabile s che punti a STACK e che possieda le stesse caratteristiche di STACK e Node?
    Quindi posso fare una cosa del genere: passare all funzione STACK s e poi inizializzare un latro puntatore a Node e utilizzare quello per il ciclo for?..in questo modo
    codice:
    int count(STACK s) {
     int n=0;
     Node *node;
     for(node=s; node!=NULL; node=node->next)
       n++;
    return n;
    }
    Che dici di questo,può andare, o devo fare qualche altra modifica? :master:
    Ti ringrazio

  4. #4
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    esatto: usa, ad esempio, questo codice di prova

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define ITEM float 
    typedef struct node { ITEM item ; struct node * next ; } Node; 
    typedef Node * STACK ;
    
    int main(){
        
        Node nodo,
             nodo2;
        
        nodo.item=0;
        nodo.next=NULL;
        nodo2.item=1;
        nodo2.next=&nodo;
        
        printf ("%d\n",count(&nodo2));
        
        getchar();
        
        return 1;
    }
    
    int count (STACK s){ 
        int n = 0; 
        for(; s!= NULL; s=s->next) 
            n++; 
        return n; 
    }

  5. #5
    Utente di HTML.it L'avatar di Stefy
    Registrato dal
    Jul 2005
    Messaggi
    18
    Siiii funziona!! ti chiedo un'ultima cosa e poi non ti rompo più: come mai hai messo return 1 alla fine?
    Grazie 1000

  6. #6
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    Il valore di ritorno ella funzione main lo metto perchè programmo sotto il sistema operativo Unix, con il quale posso analizzare il valore di ritorno dei programmi.
    Al posto di return uso spesso exit(int VALORE_DI_RITORNO); (in questo caso bisogna includere stdlib.h) ad ogni punto critico del programma (ad esempio l'apertura di un file necessario all'esecuzione).
    Se il test è superato passo oltre, se il test è fallito eseguo queste due istruzioni:
    fprintf (stderr,"%s: ERRORE - descrizione errore\n",argv[0]);
    exit (-1); //oppure return -1;
    Al successivo punto critico scrivo exit(-2) e così via, in maniera tale che, analizzando il valore di ritorno all'uscita del programma, io possa avere un mezzo di debug in più.

    Devo ancora dire una cosa importante del codice che ho scritto: il conteggio che fa distrugge la lista.
    Per contare senza distruggere bisogna utilizzare una variabile locale nella funzione (come hai fatto tu) ed assegnargli il valore passato alla funzione.

  7. #7
    Utente di HTML.it L'avatar di Stefy
    Registrato dal
    Jul 2005
    Messaggi
    18
    Ah ho capito,mi hai risposto in modo molto completo e comprensibile, grazie!!!

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.