#include <stdio.h>

typedef struct {
	int valor;
	struct Meu_no *prox;
} Meu_no;

int main(void)
{
	Meu_no *raiz, *cursor1, *cursor2, *novaraiz;
	int entrada,quantidade,i;

	//lendo a entrada do usuario:
	
	printf("Quantos numeros quer colocar na lista? ");
	scanf("%d",&quantidade);

	raiz=cursor1=cursor2=NULL;
	for(i=0;i<quantidade;i++){
		printf("Entre com o numero: ");
		scanf("%d",&entrada);
		cursor2=(Meu_no*)malloc(sizeof(Meu_no));
		if(cursor2==NULL){
			printf("Erro de alocacao de memoria\n");
			return; //sai do programa
		}
		//escrevendo o valor no novo noh:
		cursor2->valor=entrada;

		cursor2->prox=NULL;

		if(raiz==NULL){ //a lista estah vazia
			raiz=cursor1=cursor2;
		}
		else{ // a lista nao estah vazia
			cursor1->prox=cursor2;
			cursor1=cursor1->prox;
		}
	}

	//invertendo a lista:

	if((raiz!=NULL)&&(raiz->prox!=NULL)){
		cursor1=raiz;
	
		while(1){
			cursor2=cursor1->prox;
			if(cursor2->prox==NULL) break;
			cursor1=cursor1->prox;
		}

		novaraiz=cursor2;

		cursor2->prox=cursor1;
		cursor1->prox=NULL;

		while(1){
			if(raiz->prox==NULL) break;//a lista estah invertida
			cursor1=raiz;

			while(1){
				cursor2=cursor1->prox;
				if(cursor2->prox==NULL) break;
				cursor1=cursor1->prox;
			}
			cursor2->prox=cursor1;
			cursor1->prox=NULL;
		}
	}

	raiz=novaraiz;

	//imprimindo a lista invertida:	

	for(cursor1=NULL,cursor2=raiz;cursor2!=NULL;cursor1=cursor2,cursor2=cursor2->prox){
		if(cursor1){
			free(cursor1);
		}
		printf("%d\n",cursor2->valor);
	}
	
	if(cursor1) free(cursor1);

}
