Pilha com c

Ola estou fasendo um programa que cadastre dados em uma pilha dinamica…Ra, nota1, nota2 e media, as funções desta pilha são: inserir, remover, mostrar topo da pilha, mostrar todos os dados cadastrados.
A media quando for apresentada junto com os demais dados é o que eu não estou conseguindo faser, gostaria de ajuda para emplementar esta função de media, vejam o meu código.


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

 typedef struct
 {
    int ra;
    float nota1, nota2;
    float media;
 }t_dados;

 typedef struct
 {
    t_dados info;
    struct t_pilha *prox;
 }t_pilha;

 t_pilha *topo;
 t_dados novoDado;

 void criar_pilha()
 {
    topo =  (t_pilha*)malloc(sizeof (t_pilha));
    topo = NULL;
 }

 int vazia()
 {
    return(topo == NULL ? 1:0);
 }

 void push(t_dados e)
 {
    t_pilha *aux = malloc(sizeof (t_pilha));
    aux->info = e;
    aux->prox = topo; //aux->topo aponta para topo.
    topo = aux; //topo aponta para procimo elemento aux.
 }

 void pop()
 {
     t_pilha *aux;

     if(vazia())
     {
         printf("\nPilha vazia\n");
         return;
     }
     aux = topo;
     topo = topo->prox;
     free(aux);
     printf("\nRegistro removido com sucesso\n");
 }

 void mostra_topo()
 {
    if(vazia())
    {
        printf("\nPilha vazia\n");
        return;
    }
    system("cls");
    printf("\n------DADOS CADASTRADOS------\n");
    printf("%i\n", topo->info.ra);
    printf("nota 1: %.2f\n nota 2: %.2f\n", topo->info.nota1, topo->info.nota2);
    printf("%.2f\n", topo->info.media);
 }

 void mostra_tudo()
 {
     t_pilha *aux = topo;

     if(vazia())
     {
         printf("\nPilha vazia\n");
         return;
     }
     system("cls");
     while(aux != NULL){
       printf("RA: %i\n", topo->info.ra);
       printf("Nota 1: %.2f\nNota 2: %.2f\n", topo->info.nota1, topo->info.nota2);
       printf("Media: %.2f\n", topo->info.media);
       aux = aux-> prox;
       printf("\n\n");
     }
 }

 float media()
 {
     t_pilha *aux = topo;

     while(aux != NULL){
        topo->info.media = (topo->info.nota1 + topo->info.nota2)/2;
        aux = aux ->prox;
        return;
     }
 }

 int menu()
 {
     int opcao;

     printf("\n\nMENU DE OPCOES\n\n");
     printf("0 - Sair\n");
     printf("1 - Inserir\n");
     printf("2 - Remover\n");
     printf("3 - Exibir topo\n");
     printf("4 - Exibir tudo\n");
     printf("\nOpcao desejada: ");
     scanf("%i", &opcao);

     return opcao;
  }

  void inserir()
  {
      printf("\n\nLendo os dados\n");
      printf("\nRA: ");
      scanf("%i", &novoDado.ra);
      printf("\nNota 1: ");
      scanf("%f", &novoDado.nota1);
      printf("\nNota 2: ");
      scanf("%f", &novoDado.nota2);
      media();
  }

  int main()
  {
      int opcao;
      criar_pilha();

      do{
        opcao = menu();
        switch(opcao){
           case 0:
             break;
           case 1:
             inserir();
             push(novoDado);
             break;
           case 2:
             pop();
             break;
           case 3:
             mostra_topo();
             break;
           case 4:
             mostra_tudo();
             break;
           default:
                printf("\nOpcao invalida\n");
             break;
        }
        }while(opcao != 0);
           getch();
           return 0;
      }

se você definiu um ponteiro auxiliar é ele que você deve usar…

[code]float media()
{
t_pilha *aux = topo;

 while(aux != NULL){  
    aux->info.media = (aux->info.nota1 + aux->info.nota2)/2;  
    aux = aux ->prox;  
    return;  
 }  

} [/code]

outras observações:

1…você chama média no inserir… pq não calcula ai mesmo a média e joga na váriavel ?.. (da maneira como esta fazendo toda hora ele corre a pilha novamente “re-fazendo os calculos” )

2… por que média retorna float sendo que você não atrubui seu retorno a nada, na verdade sua media() nem retorna float de fato… se realmente for usa-la use void mesmo

3…acredito que seu professor quer a média de todos os alunos…se for isso…dentro do mostra_tudo(), incremente uma váriavel “soma+=aux->info.media” dentro do while e um contador++…e depois do while…divida o valor dessa variavel soma pelo contador.

4… o mostra tudo esta usando topo ao invés de aux dentro do while…esta funcionando dessa forma?

opa valeu pelas dicas vou implementalas, a pergunta 4 sua é sim, deste jeito não deu problema, a media é de cada aluno individual, e a soma deve ser calculada antes do elemento se inserido na pilha.

Que feio!!! Copiando… Mas nao adiantara nada no dia da prova. Tambem nao vou te entregar. So uma dica: ano passado eu quase me ferrei fazendo a mesma coisa que vc esta fazendo. Pergunte, converse com o Professor. No exercicio da Unidade I, sobre lista encadeada, por exemplo, estava com uma duvida em relacao a funcao strcmp que compara os dados de duas strings. Na propria apostila tinha a resposta. Presta atencao, os professores estao vasculhando a rede atras de possiveis colas. Eu percebo que nao e o que vc esta fazendo em sua plenitude, mas todo cuidado e pouco…Abracos.

Caraca esse professor é barra pesada, rerere