Le pile in C

di il
2 risposte

Le pile in C

Ciao a tutti! Ho un serio problema, spero possiate aiutarmi! Sto cercando di scrivere un programma utilizzando le pile... Il programma seguente dovrebbe leggere i dati dallo standard input, creare una pila e stampare i numeri in ordine corretto. Purtroppo mi dà errore di segmentazione.. Probabilmente ho fatto errori da principiante, ma sono alle prime armi! Per questo mi hanno consigliato di iscrivermi qui.. Per favore aiutatemi! grazie!
#include <stdio.h>
#include <stdlib.h>

typedef struct nodo Nodo;				//nodo che costituisce la pila

Nodo *inserisci_nodo(int x, Nodo *p);

struct nodo								
{
	int dato;
	Nodo *next;	//puntatore al nodo successivo
};

Nodo *inserisci_nodo(int nuovo_dato, Nodo *prox)	//funzione che introduce un nuovo valore nella pila
{
	prox = (Nodo *)malloc(sizeof(Nodo));
	if (prox == NULL)
	{
		printf("Errore: malloc!\n");
		exit(EXIT_FAILURE);
	}
	prox -> dato = nuovo_dato;
	prox -> next = NULL;
	return prox;
}

int main()
{
	Nodo *testa = NULL;		//testa della pila
	printf("Scrivi una sequenza di numeri interi (* termina)\n");
	int n;	//contiene i dati letti dallo standard input
	scanf("%d", &n);
	if( n != '*')
	{
		testa = inserisci_nodo( n, testa);	//introduco il primo nodo
	}
	Nodo *cima = testa;	//nuova variabile che continua a puntare il primo elemento della lista
	testa = testa ->next;
	scanf("%d", &n);
	while( n != '*')
	{
		testa->next = inserisci_nodo( n, testa->next);
		testa = testa->next;
		scanf("%d", &n);
	}
	while(cima!=NULL)	//stampo la lista partendo dal primo nodo
	{
		printf("%d", cima->dato);
		cima = cima->next;	
	}
	exit(EXIT_SUCCESS);
}

2 Risposte

  • Re: Le pile in C

    Un errore di segmentazione è causato da un puntatore sbagliato, in genere Null quando non dovrebbe esserlo... Controlla esattamente in quale riga avviene e in quali condizioni.
  • Re: Le pile in C

    Prima di tutto non stai usando una pila, perché inserisci da una parte e inizi a leggere dall'altra. Per leggere i numeri in ordine devi prima di tutto inserire dalla parte opposta rispetto a quanto fai adesso (ovvero per ogni inserimento crei un nuovo nodo e fai puntare il suo next alla cima della pila e fai puntare il puntatore cima al nuovo nodo creato, per cui alla fine invece di avere i puntatori testa e cima avrai sempre solo cima ), dopodiché usi un'algoritmo di visita ricorsiva in post-ordine, ovvero prima scendi nella pila a partire dalla cima seguendo i puntatori next, dopodiché stampi il valore di ogni nodo, tipo:
    
    void visita(Nodo *n) {
        visita(n->next);
        printf("valore nodo: ", n->dato);
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte