Professional Documents
Culture Documents
( final
+ 1) R MaxTdmQ
2. Cola de prioridades: Una cola de prioridades se utiliza para que los elementos
se atienden en el orden indicado por una prioridad asociada a cada uno. Si
varios elementos tienen la misma prioridad, se atendern de modo
convencional segn la posicin que ocupen.
Este tipo especial de colas tienen las mismas operaciones que las colas, pero con la
condicin de que los elementos se atienden en orden de prioridad.
Ejemplos de la vida diaria seran la sala de urgencias de un hospital, ya que los enfermos
se van atendiendo en funcin de la gravedad de su enfermedad.
Estas colas se dividen en dos tipos
*Colas de prioridades con ordenamiento ascendente: en ellas los elementos se insertan de
forma arbitraria, pero a la hora de extraerlos, se extrae el elemento de menor prioridad.
*Colas de prioridades con ordenamiento descendente: son iguales que las colas de
prioridad con ordenamiento ascendente, pero al extraer el elemento se extrae el de mayor
prioridad.
Consideremos el siguiente ejemplo como un numero de 15 hijos y se ordena segur la prioridad
de: como es mayor que, se intercambia con este, y como es mayor que, tambin se
intercambia con este, y el proceso termina porque es menor que.
La figura de arriba, muestra la forma de implementar una cola, como arreglo, en la que
cada casilla, representa una estructura compuesta por el tipo de dato a guardar (o bien otra
estructura).
Las variables q.rear y q.front, se van modificando cada vez que aadimos o eliminamos
datos de nuestra cola.
Para determinar la cantidad de elementos en cualquier momento utilizamos la expresin:
Cant=q.rear-q.front+1
A continuacin se presentara un ejemplo del funcionamiento de las colas, implementadas
como arreglos:
Supongamos que en una cola vamos a almacenar elementos de tipo carcter.
insert(&q,A);
q.rear=0, q.front=0
insert (&q,B)
q.rear=1
q.front=0
insert (&q, C);
q.rear=2
q.front=0
remove(&q);
q.rear=2
q.front=1
remove(&q);
q.rear=2
q.front=2
insert(&q, D);
01234
q.rear=3
q.front=2
insert(&q, E);
q.rear=4
q.front=2
Ejercicios
1.- Realizar un programa que pueda almacenar cierto nmero de enteros en una estructura de
tipo Cola, disee una solucin que permita, leer, eliminar datos de la cola.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
/*declaracion de la cola*/
struct nodo
{
int elemento;
struct nodo *siguiente;
};
typedef struct nodo Nodo;
typedef struct
{
Nodo *frente;
Nodo *final;
}Cola;
/*declaracion de las funciones*/
void CrearCola(Cola *cola);
void insert (Cola *cola, int x);
int remover(Cola *cola);
int empty(Cola cola);
main()
{
int x, opc=8, j=0;
Cola cola;
CrearCola(&cola);
clrscr();
while(opc!=3)
{
printf("\t\t\tMENU PRINCIPAL\n\n\n");
printf("\t 1. Insertar\n");
printf("\t 2. Eliminar\n");
printf("\t 3. Salir\n");
scanf("%d", &opc);
switch(opc)
{
case 1: printf("Ingrese el numero a introducir:\n");
scanf("%d", &x);
insert(&cola, x);
++j;
break;
case 2: printf("%d fue eliminado de la cola\n", remover(&cola));
--j;
getch();
break;
}
clrscr();
}
getch();
return 0;
}
/*definicion de las funciones*/
void CrearCola(Cola *cola)
{
cola->frente=cola->final=NULL;
}
/*funcion que inserta el dato en la parte final de la cola*/
void insert (Cola *cola, int x)
{
Nodo *nuevo;
nuevo=(Nodo*)malloc(sizeof(Nodo));
nuevo->elemento=x;
nuevo->siguiente=NULL;
if(empty(*cola))
{
cola->frente=nuevo;
}
else
cola->final->siguiente=nuevo;
cola->final=nuevo;
}
/*elimina el elemento que esta aL frente de la cola*/
int remover (Cola *cola)
{
int temp=NULL;
if(!empty(*cola))
{
Nodo *nuevo;
nuevo=cola->frente;
temp=cola->frente->elemento;
cola->frente=cola->frente->siguiente;
free(nuevo);
}
else
printf("ERROR, cola vacia, se puede eliminar\a\n");
return (temp);
}
int empty(Cola cola)
{
return (cola.frente==NULL);
}
2.- En
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct agenda
{
char nombre[50];
char telefono[25];
char mail[50];
};
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.
struct nodo
{
struct agenda dato;
struct nodo *proximo;
};
struct nodo *nuevonodo();
int colavacia(struct nodo *);
struct nodo *creacola(struct nodo *, struct agenda);
void mostrar(struct nodo *);
void main()
{
struct nodo *pri=NULL, *ult=NULL;
struct agenda x;
printf("Ingrese nombre: ");
gets(x.nombre);
while(strcmpi(x.nombre,"fin"))
{
printf("Ingrese telefono: ");
gets(x.telefono);
printf("Ingrese mail: ");
gets(x.mail);
ult=creacola(ult,x);
if(pri==NULL) pri=ult; // Si es la 1 pasada pongo en pri el valor del primer nodo
printf("Ingrese nombre: ");
gets(x.nombre);
}
if(colavacia(pri)==1) { printf("No se ingresaron registros"); getch(); }
else mostrar(pri);
}
struct nodo *nuevonodo()
{
struct nodo *p;
p=(struct nodo *)malloc(sizeof(struct nodo));
if(p==NULL)
{
printf("Memoria RAM Llena");
getch();
exit(0);
}
return p;
}
struct nodo *creacola(struct nodo *ult, struct agenda x)
{
struct nodo *p;
61.
p=nuevonodo();
62.
(*p).dato=x;
63.
(*p).proximo=NULL;
64.
if(ult!=NULL) (*ult).proximo=p; // Si hay nodo anterior en prox pongo la direccion del
nodo actual
65.
return p;
66.
}
67.
68.
int colavacia(struct nodo *pri)
69.
{
70.
if(pri==NULL) return 1;
71.
else return 0;
72.
}
73.
74.
void mostrar(struct nodo *pri)
75.
{
76.
struct nodo *aux;
77.
while(pri!=NULL)
78.
{
79.
printf("Nombre: %s - Telefono: %s - Mail: %s\n",pri->dato.nombre,pri>dato.telefono,pri->dato.mail);
80.
aux=pri;
81.
pri=(*pri).proximo;
82.
free(aux);
83.
}
84.
getch();
85.
}