Gestione di uno stack

di Anonimizzato8544 il
3 risposte
Salve ragazzi sto scrivendo un programma per la gestione di uno stack solo che mi sta dando delle rogne vi posto tutto il sorgente sicuro ci saranno tanti errori e mi scuso ma gli stack non li guardo da qualche anno!! questo è il mio meglio per adesso



#include <stdio.h>

struct stack
{
    int vet[10];
    int top;
};

void  inizializza(struct stack*);
int pop(struct stack*);
void push(struct stack*, int);
void stampa(struct stack*);
int contr(struct stack*);

int main()
{
    struct stack *stack1=NULL;// Per annullare eventuali worring
    int scelta, elemento, controllo;
    
    inizializza(stack1); //inizializza il top a 0;
    
    do
    {
        printf("1:inserisci elemento\n");
        printf("2:preleva elemento\n");
        printf("3:stampa elemento\n");
        printf("4: esci\n");
        
        scanf("%d",&scelta);
        
        switch(scelta)
        {
            case 1:
                controllo = contr(stack1);
                if(controllo)                // se il top è minore di 10 posso inserire!
                {
                    printf("Inserisci l'elemento: ");
                    scanf("%d", &elemento);
                    push(stack1,elemento);
                }
                else
                    printf("error\n");        //top >=10   non posso inserire :-(
                break;
                
            case 2:
                if(!controllo)                            //se top è maggiore di 0 posso prelevare !
                {
                    elemento = pop(stack1);
                    printf("%d",elemento);
                }
                else                                // è impossibile prelevare con top =0   !
                    printf("error\n");
                break;
                
            case 3:
                if(controllo)                     //qui mi basta sapere che ho 1 elemento nel mio stack se è così posso stamparlo
                    stampa(stack1);
                else
                    printf("stack vuoto\n");
                break;
                
            case 4:
                printf("arrivederci\n");
                break;
                
            default:
                printf("error");
        }
    } while (scelta != 4);
    
    return 0;
}

void inizializza(struct stack *stack1)
{
    stack1->top=0;      // Metto nella parte della struttura top puntata dalla variabile stack 0 questo per far partire lo stack da 1 situazione pulita
}

int pop(struct stack *stack1)
{
    int x;
    
    x = stack1->vet[stack1->top]; /*inserisci in x il valore ottenuto da vet[top]   sintatticamente va  
                                                        scritto così*/
    
    stack1->top--;     //ho prelevato decremento il top!
    
    return x;
}

void push(struct stack *stack1,int x)//devo inserire un valore nuovo
{
    stack1->top++;//faccio spazio aumentando di 1 il top
    stack1->vet[stack1->top] = x;// mi copio il valore nella locazione
    
}


void stampa(struct stack *stack1)
{
    int i;
    
    for(i = 0; i < stack1->top; i++)
    {
        printf("%d", stack1->vet[stack1->top]);//stampa alemento indicato dal top
    }
}




int contr(struct stack *stack1)
{
    if(stack1->top >=9)/* occorre studiare come si comporta quando viene chiamato nei casi limiti con top      
                                                                                    ==0 e con top =-=9*/
        return 0;
    else
        return 1;
}
grazie

3 Risposte

  • ]l'ho migliorato adesso mi sembra che funzioni tutto l'unica cosa è che mi da tanti warring vi posto il nuovo sorgente secondo me dovrei usare un puntatore a puntatore per togliere i warring ma poi non li riesco a gestire nei vari sottoprogrammi ecco tutto il sorgente:
    
    #include<stdio.h>
    
    
    struct stack{
        int vet[10];
        int top;
        int  pieno,vuoto;
    
    
    };
    
    void inizializza(struct stack*);
    int controlla_pieno(struct stack*);
    int controlla_vuoto(struct stack*);
    void inserisci(struct stack*,int);
    int preleva(struct stack*);
    void stampa(struct stack*);
    
    
    int main(){
        struct stack *stack1 = NULL ;
        int scelta,contr_vuoto,numero,contr_pieno;
        
        inizializza(&stack1);//pericolo"
        do{
            
        printf(" ______________________\n");
        printf("|1:preleva.............|\n");
        printf("|2:inserisci...........|\n");
        printf("|3:stampa..............|\n");
        printf("|4:inizializza.........|\n");
        printf("|5:esci................|\n");
        printf("!----------------------!\n");
            scanf("%d",&scelta);
            
        
            switch(scelta){
                    
                case 1:  contr_vuoto=controlla_vuoto(&stack1);// pericolo!
                    if(contr_vuoto!=0)
                    {
                        numero=preleva(&stack1);// pericolo!!
                        printf("%d\n",numero);
                    }
                    
                        else printf("errore stack vuoto\n");
                break;
                    
                    
                case 2:
                    contr_pieno=controlla_pieno(&stack1);  //pericolo!!!
                    if(contr_pieno!=0)
                    {
                          printf("inserisci il valore\n");
                          scanf("%d",&numero);
                             inserisci(&stack1,numero);// pericolo!!
                    }
                    else
                        printf("errore stack pieno\n");
                break;
                    
                    
                        
                case 3:
                        contr_vuoto=controlla_vuoto(&stack1);//pericolo!!!!
                        if(contr_vuoto!=0)
                        {
                            stampa(&stack1);// pericolo!!!!!
                            
                        }
                            else
                                printf("impossibile stampare stack vuoto!\n");
                break;
                    
                case 4:
                    inizializza(&stack1);//pericolo !!!!!!
                break;
                    
                case 5:
                    printf("arrivederci\n");
                break;
                default: printf("scelta errata\n");
                    }
            
        }while(scelta!=5);
      
    
        
    
    
    }
    
    
    void inizializza( struct stack *stack1){
        stack1->top=0;
        stack1->pieno=0;
        stack1->vuoto=0;
    
    }
    
    int controlla_vuoto(struct stack *stack1){
    if(stack1->top==0)
        
        return(0);
    else return 1;
    
    
    }
    
    int preleva(struct stack *stack1){
          stack1->top--;
        int x;
        x=stack1->vet[stack1->top];
      
        if(stack1->top==0)
            stack1->vuoto=0;
        
        return x;
    
    }
    int controlla_pieno(struct stack *stack1){
    
    if(stack1->top==10)
        return 0;
    else return 1;
    
    }
    
    
    
    void inserisci(struct stack *stack1,int x){
    
        stack1->vet[stack1->top]=x;
        stack1->top++;
        if(stack1->top==10)
        {stack1->pieno=1;
        }
    }
    
    void stampa(struct stack *stack1){
    
        int x;
        int i;
        x=stack1->top--;
        for(i=x;x--; ){
            printf("   _______ \n");
            printf("  |       |\n");
            printf("     %d    \n ",stack1->vet[x]);
            printf(" |_______|\n");
        }
    }
    
    
  • 
    ... prototypes
    void inizializza(struct stack*);
    ...
    
    
    struct stack *stack1 = NULL;
    ...
    inizializza(&stack1);//pericolo"
    ...
    
    passi l'indirizzo di ptr a struct in tutte le funzioni mentre queste ultime attendono un ptr a struct.
    Come sei riuscito ad eseguirlo?
  • Ora mi funziona ho tolto il puntatore a struttura però ho qualche bug nel senso certe volte quando stampo e poi prelevo mi preleva il numero corrispondente a top-2 la prima volta e successivamente top -3 poi -4 etc
Devi accedere o registrarti per scrivere nel forum
3 risposte