C/Visual C - Esta bien resuelto el ejercicio de pilas?

 
Vista:
sin imagen de perfil

Esta bien resuelto el ejercicio de pilas?

Publicado por Laura (1 intervención) el 18/07/2016 00:56:11
Tengo el siguiente enunciado de final de la materia estructura de datos 2 donde vemos pilas, colas y listas con punteros!!!.

En un turno de examen, a medida que se corrigen las evaluaciones, se van apilando los exámenes.
Para organizar la información. Desarrollar:

a-) Generar una pila, guardando por cada evaluación la nota obtenida. La condición de fin la indica el alumno.

b-) Una vez terminada la evaluación, organizar la información obtenida en a) en una lista ordenada por nota, indicando

Nota ( campo ordenado) Cantidad de exámenes con esa nota.

UN SOLO NODO POR NOTA
c-) Mostrar la lista generada

A continuacion les pego el código... Mi consulta es si esta bien resuelto con lo que me piden en el enunciado y como sería desapilar en caso de que me lo pidan...
Estoy al horno... En agosto tengo que dar final y siempre me costo lenguaje C...
Si alguien me puede explicar lo agradeceria muchisimo. Mi email es: [email protected]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
typedef struct eval nodo;
struct eval
{
	int nota; //tipo de dato
   int cantidad;
   nodo *sig; //puntero a la estructura
};
 
 
nodo *nuevonodo(void);
void apilar (nodo **, nodo *);
void listar (nodo*);
 
 
int main ()
{
   nodo *pi=NULL, *q, *pr;
   int nota;
   printf ("\nIngrese nota (0 para salir): ");
   scanf ("%d", &nota);
   fflush(stdin);
   while(nota)
   {
   	q=nuevonodo(); //q es igual a nuevo nodo
      q->nota=nota; //q en el campo nota almacena nota
      q->cantidad=0; //q en el campo cantidad es igual a cero
      apilar (&pi, q);
      printf ("\nIngrese nota (0 para salir): ");
      scanf ("%d", &nota);
      fflush(stdin);
   }
 
   pr=pi;
   while (pr)
   {
   	q=nuevonodo();
      q->nota=pr->nota;
      q->cantidad=1;
      apilar (&pi,q);
      pr=pr->sig;
   }
   listar (pi);
   getch();
   return 0;
}
 
nodo* nuevonodo ()
{
	nodo *q;
   q=(nodo*)malloc(sizeof(nodo));
   if (q==NULL)
   {
   	printf ("\nError de Memoria!!!");
      getch();
      exit (1);
   }
   return (q);
}
 
void apilar (nodo **pi, nodo *q)
{
	nodo *pr, *px;
   if(*pi==NULL)
   {
   	q->sig=NULL;
      *pi=q;
   }
   else if (q->nota < (*pi)->nota)
   {
   	q->sig=*pi;
      *pi=q;
   }
   else
   {
   	pr=px=*pi;
      while (pr&&(pr->nota<q->nota))
      {
      	px=pr;
         pr=pr->sig;
      }
      if (pr&&(q->nota==pr->nota))
      {//el peso es el mismo y ya existe en la lista
      	pr->cantidad++; //se actualiza en nodo
         free(q);//se borra el nuevo nodo ya que no se va a actualizar
      }
      else
      {
      	px->sig=q;
         q->sig=pr;
      }
   }
}
 
void listar (nodo *pi)
{
	if(!pi)
   printf("\nLista Vacia");
   printf ("\nNOTA\TCANTIDAD");
   while (pi)
   {
   	printf ("\n%d\t%d", pi->nota, pi->cantidad);
      pi=pi->sig;
   }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder