Pile in C

di il
8 risposte

Pile in C

Ciao a tutti... Sì, sono ancora qui. E penserete: "Ma questo non ci prova mai da solo?". In realtà ci provo e riprovo, ma senza basi, e senza delle spiegazioni dei professori dell'Università che danno troppe, troppe cose per scontate, faccio una gran fatica. E sul mio libro "Programmare in C" non le trovo nemmeno le pile... Comunque, ho un problema con un altro programmino che sto provando per capire, appunto, il funzionamento di questo tipo di liste.
Il mio codice è questo :
#include <stdio.h>
#include <stdlib.h>

struct cella {
	int numero;
	struct cella *next;
};

void push(struct cella **p, struct cella *nuovo);

int main()
{
	struct cella *pila = NULL;	//*pila è la nostra testa-->azzeriamola
	struct cella *temp = NULL;
	struct cella *nuovoELemento = NULL;
	
	push(&pila, nuovoELemento);
	
	temp = pila;
	while(temp != NULL)
	{
		printf("\n\nNumero: %d\n", pila->numero);
		pila = pila->next;
	}
	pila = temp;
		
	system("pause");
	return 0;
	
	
}

void push(struct cella **p, struct cella *nuovo)
{
	int numeroInserito;
	
	printf("\n\nUtente, scrivi il numero da inserire nella pila: \n");
	scanf("%d", &numeroInserito);
	nuovo->numero = numeroInserito;
	if(nuovo == NULL)
		exit(1);
	else
		nuovo->next = *p;
		*p = nuovo;
} 
Sto semplicemente cercando di inserire un elemento che scrive l'utente all'interno della lista, ma quando vado a stampare il programma crasha... Avete qualche consiglio da darmi? Ci hanno dato programmi da fare e prima di provarli devo capire le fondamenta dell'argomento, che trovo tutt'altro che facili...
Grazie mille in anticipo

8 Risposte

  • Re: Pile in C

    Eccoti un esempio di pila LIFO
    
    typedef struct _ELEMENT
    {
        int val;
        struct _ELEMENT* next;
    }ELEMENT;
    
    typedef struct _STACK
    {
        ELEMENT* first;
        ELEMENT* last;
    }STACK;
    
    void push(STACK* stk,ELEMENT* e)
    {
        if (stk->first == NULL)
        {
            stk->first = e;
            stk->last = e;
        }
        else
        {
            stk->last->next = e;
            stk->last = e;
        }
    }
    
    ELEMENT* pop(STACK* stk)
    {
        if (stk->first == NULL) return NULL;
    
        ELEMENT* e;
    
        if (stk->first == stk->last)
        {
            e = stk->first;
            stk->first = NULL;
            stk->last = NULL;
        }
        else
        {
            int i;
            for (e = stk->first; e->next != stk->last ; e = e->next);
            e->next = NULL;
            ELEMENT* tmp = e;
            e = stk->last;
            stk->last = tmp;
        }
        return e;
    }
    
    int main()
    {
        STACK stk;
        stk.first = NULL;
        stk.last = NULL;
    
    
        ELEMENT* e;
    
        e = malloc(sizeof(ELEMENT));
        e->val = 1980;
        e->next = NULL;
        push(&stk,e);
    
        e = malloc(sizeof(ELEMENT));
        e->val = 11;
        e->next = NULL;
        push(&stk,e);
    
        e = malloc(sizeof(ELEMENT));
        e->val = 19;
        e->next = NULL;
        push(&stk,e);
    
        e = pop(&stk);
        printf("%d/",e->val);
        free(e);
    
        e = pop(&stk);
        printf("%d/",e->val);
        free(e);
    
        e = pop(&stk);
        printf("%d",e->val);
        free(e);
    
        return 0;
    }
    
    L'uso poi della system("pause") denota il fatto che non usi un buon ide.
  • Re: Pile in C

    Ciao, grazie per la risposta.
    Io però ho ancora problemi sul comprendere il fatto che passiamo &stk con la & commerciale ed 'e' senza alla funzione...
    Per quanto riguarda l'IDE, uso Dev-C++ perché ha il background nero e quindi la sera tardi non mi stanca la vista in maniera esagerata come la schermata bianca di Code::Blocks...
  • Re: Pile in C

    Dev-c++ è una schifezza obsoleta malfunzionante che porta ad effetture numerosi errori.
    In code::blocks puoi cambiare tutti i colori dell'editor andando in:
    setting->editor->syntax highlighting,clicca su default e scegli il colore foreground.

    Per la tua domanda la spiegazione è semplice:
    
    STACK stka;//memoria reale quindi se una funzione vuole un STACK* lo devo passare per indirizzo
    push(&stka,...);
    
    STACK* stkb = malloc(sizeof(STACK));//puntatore alla memoria che contiene il vero stack,
    //essendo già un puntatore posso passarlo direttamente
    
    push(stkb,...);
    
    
    quindi passo &stk perchè la funzione vuole uno STACK* mentre io ho uno STACK,mentre per "e" io ho già ELEMENT* e quindi lo posso passare direttamente.
    Studiati un pò di argomenti sui puntatori!
  • Re: Pile in C

    Ma se io non facessi passare alcun parametro? Ho provato ma crasha dopo l'inserimento del numero... E' vero, alcune cose mi sono ancora non molto chiare, ma quello che non capisco proprio è il motivo per cui passiamo dei parametri alle funzioni... Non potremmo fare la funzione in maniera normalissima senza passare parametri?
    Intanto ti ringrazio per la disponibilità
  • Re: Pile in C

    Si volendo puoi dichiarare tutto globale,ma anche se leggermente piu veloce viene sempre sconsigliato perché si creano diverse problematiche.quindi ti tocca passare i parametri.
    Devi vedere una funzione come un brano di codice che esegue un compito e i parametri sono i dati del nostro compito.
    Calcolare l'area del quadrato:
    
    double area_quad(double lato)
    {
        return lato*lato
    }
    
    Semplice pulito elegante,prova a scriverlo senza parametri,compresi quelli di ritorno
  • Re: Pile in C

    Ho capito... Ora sto facendo altri programmini per comprenderne a pieno il ragionamento ma credo proprio di averlo capito
  • Re: Pile in C

    Dato che ero al cell non riuscivo a scrivere tutto il codice,guarda queste altre modalità:
    
    void area_quad(double* lato)
    {
       *lato *= *lato;
    }
    
    
    double latoquad;
    
    void area_quad(void)
    {
       latoquad *= latoquad;
    }
    
    per farti capire cosa possa accadere usando una scorretta grammatica e identazione ti faccio vedere come diventerebbe con un pò di obfuscated c.
    
    double area_quad(double* lato)
    {
       return *lato**lato;
    }
    
    puoi ben capire che non indentando bene il codice la riga "*lato**lato" può trarre in inganno,decisamente meglio "*lato * *lato" anche l'uso inutile del puntatore aumenta la sua inleggibilità.

    Bisogna cercare sempre di scrivere codice elegante,bello da vedersi,facile da leggersi e da comprendere.Ovvio è piu facile a dirsi che a farsi.
  • Re: Pile in C

    Hai perfettamente ragione, un codice steso in maniera elegante è sempre bello da vedere.
    Grazie mille ancora per l'aiuto
Devi accedere o registrarti per scrivere nel forum
8 risposte