Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad11 Codigof1
Unidad11 Codigof1
EJEMPLO 11.1
Representación gráfica de la colocación y eliminación de elementos en una cola implementada con arrays.
Esta implementación tiene como inconveniente que puede ocurrir que la variable final llegue al valor máximo
de la tabla, con lo cual no se puedan seguir añadiendo elementos a la cola, aún cuando queden posiciones libres a la
izquierda de la posición frente .
EJEMPLO 11.2
#include <stdlib.h>
typedef struct
{
Nodo* frente;
Nodo* final;
}Cola;
1
2 Algoritmos y estructuras de datos. Una perspectiva en C. Libro de Problemas
/* acceso a la cola */
TipoDato frente(Cola cola);
EJEMPLO 11.3
EJEMPLO 11.4
Colas, colas de prioridad y montículos 3
Problema 11.1
#include <stdlib.h>
#include <stdio.h>
#define MAXIMO 100
typedef float TipoElemento;
typedef struct
{
TipoElemento A[MAXIMO];
int frente, final;
}Cola;
void VaciaC(Cola* C)
{
C->frente = 0;
C->final = MÁXIMO - 1;
}
puts("Cola completa");
exit (1);
}
C->final= sig(C->final);
C->A[C->final] = e;
}
int EstallenaC(Cola C)
{
return C.final == sig(sig(C.frente));
}
void BorraC(Cola* C)
{
if (EsvaciaC(*C))
{
puts(" Se intenta sacar un elemento en C vacía");
exit (1);
}
C->frente = sig( C->frente);
}
int EsvaciaC(Cola C)
{
return C.final == sig(C.frente);
}
TipoElemento PrimeroC(Cola C)
{
if (EsvaciaC(C))
{
puts(" Error de ejecución, C vacía");
exit (1);
}
return C.A[C.frente];
}
Problema 11.2
#include <stdio.h>
#include <stdlib.h>
typedef int TipoElemento;
struct nodoCola
{
TipoElemento e;
struct nodoCola* sig;
} NodoCola;
typedef struct
{
NodoCola * Frente,* Final;
}Cola;
/* prototipos de las operaciones */
void VaciaC(Cola* C)
{
C->Frente = NULL;
C->Final = NULL;
}
int EsVaciaC(Cola C)
{
return (C.Frente == NULL);
}
void AnadeC(Cola* C,TipoElemento e)
{
NodoCola* a;
a = (NodoCola*)malloc(sizeof(NodoCola));
a->e = e;
a->sig = NULL;
if (EsVaciaC(*C))
C->Frente = a;
Colas, colas de prioridad y montículos 5
else
C->Final->sig = a;
C->Final = a;
}
void BorrarC(Cola* C)
{
NodoCola *a;
if (!EsVaciaC(*C))
{
a = C->Frente;
C->Frente = C->Frente->sig;
if(C->Frente == NULL)
C->Final = NULL;
free(a);
}
else
{
puts("Error eliminacion de una cola vacía");
exit(-1);
}
}
TipoElemento PrimeroC(Cola C)
{
if (EsVaciaC(C))
{
puts("Error: cola vacía");
exit(-1);
}
return (C.Frente->e);
}
Problema 11.3
.....
typedef NodoCola *Cola;
......
void VaciaC(Cola* C)
{
*C = NULL;
}
int EsVaciaC(Cola C)
{
return (C == NULL);
}
void BorrarC(Cola* C)
{
NodoCola *a;
if (!EsVaciaC(*C))
6 Algoritmos y estructuras de datos. Una perspectiva en C. Libro de Problemas
{
a = (*C)->sig;
if(a == *C)
(*C) = NULL;
else
(*C)->sig = a->sig;
free(a);
}
else
{
puts("Error eliminacion de una cola vacía");
exit(-1);
}
}
TipoElemento PrimeroC(Cola C)
{
if (EsVaciaC(C))
{
puts("Error: cola vacía");
exit(-1);
}
return (C->sig->e);
}
Problema 11.4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int Telemento;
struct Puntero
{
Telemento Info;
struct Puntero *Sig, *Ant;
}puntero;
typedef struct
{
puntero *Frente, *Final;
}Bicola;
void VaciaBi(Bicola* B)
{
(*B).Frente = NULL;
(*B).Final = NULL;
}
int EsvaciaBi(Bicola B)
{
return B.Frente == NULL;
}
free(aux);
}
}
Problema 11.5
void mostrarCola(Cola* C)
{
// muestra los elementos de una cola que se le pase como parámetro.
TipoElemento e;
while (!EsVaciaC(*C))
{
e = PrimeroC(*C);
printf("%d ", e);
BorrarC(C);
}
}
void main()
{
Cola C;
int n, n1, n2, n3, i;
randomize();
n = 1 + random(500);
VaciaC(&C);
for (i = 1; i <= n; i++)
AnadeC(&C, 1+random(1024));
n1 = 3;
while (n1 <= n))
{
printf("\n Se quitan elementos a distancia %d ",n1);
n2 = 0; /*Contador de elementos que quedan */
for (i = 1; i <= n; i++)
{
n3 = PrimeroC(C);BorrarC(&C);
if (i % n1 == 2)
printf("\t %d se quita.", n3);
else
{
AnadeC(&C, n3); /* se vuelve a meter en la cola */
n2++;
}
}
n = n2;
n1++;
}
printf("\n Los números de la suerte: ");
mostrarCola(&C);
}
Problema 11.6
Problema 11.7
#include <stdlib.h>
#include <stdio.h>
#define MAXIMO 100
typedef float TipoElemento;
typedef struct
{
TipoElemento A[MAXIMO];
int frente, final;
}Bicola;
Problema 11.8
#define Maxprio 12
typedef struct
{
int prioridad;
char NombreT[20];
}Trabajo;
int i = 0;
while (EsvaciaC(cp.colas[i]) && i < cp.NP - 1)
i++;
return EsvaciaC(cp.colas[i]);
}
Problema 11.9
Codificación
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int prioridad;
char NombreT[20];
}Trabajo;
typedef struct RegistroCP
{
Trabajo trabajo;
struct RegistroCP* sig;
}NodoCp;
typedef NodoCp *ColaPrioridad;
void main()
{
Trabajo trabajo;
int d;
ColaPrioridad Cp;
Cp = NULL;
do
{
printf(" Introduzca prioridad del trabajo -1 = fin\n");
scanf("%d", &trabajo.prioridad);
if (trabajo.prioridad != -1)
{
puts(" nombre del trabajo ");
scanf("%s", &trabajo.NombreT);
AnadeCpR(&Cp,trabajo);
}
} while (trabajo.prioridad != -1);
Escribir(Cp);
do
14 Algoritmos y estructuras de datos. Una perspectiva en C. Libro de Problemas
{
printf(" borrar -1 = fin\n");
scanf("%d", &d);
if (d != -1)
BorrarCp(&Cp);
Escribir(Cp);
} while (d != -1);
}
Problema 11.10
Problema 11.11
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define Max2 100
CrearMonticulo(&monticulo);
for(i = 0; i < n; i++)
insertar (&monticulo, a[i]);
for(i = 0; i < n; i++)
{
a[i] = BuscarMinimo(monticulo);
EliminarMinimo(&monticulo);
}
printf(" datos ordenados\n");
Escribe(a,n);
}
Problema 11.12
typedef struct
{
matricula[51];
} Coche;
typedef Coche TipoElemento;
/*
cola y biola como se definen en los ejercicios 11.1 y 11.7 con 12 elementos como
máximo
*/
void main()
{
Coche coche;
char ch;
Bicola Bi;
Cola C;
int continuar = 1;
VaciaBi(&Bi);
VaciaC(&C);
while (continuar)
{
puts("\n Entrada de datos: [acción: i/d/I/D] ");
puts("\n i retirar izquierda d retirar derecha ");
puts("\n I omsertar izquierda D insertar derecha ");
puts(" Para terminar la simulación: x");
do {
scanf("%c%*c",&ch);
} while(ch != 'i' && ch != 'd' && ch != 'I' && ch != 'D' && ch != 'x');
if (ch == 'i')
{
if (!EsvaciaBi(Bi))
{
coche = PrimeroBiP(Bi);
BorraBiP(&Bi);
printf("Salida del coche: %s por la izquierda", coche.matricula);
if (!EsvaciaC(C))
{
// si hay cohes en cola d espera añadirlo
coche = PrimeroC(C);
BorraC(&C);
AnadeBiP(&Bi,coche);
}
}
}
else if (ch == 'd')
{
if (!EsvaciaBi(Bi))
{
coche = PrimeroBiF(Bi);
BorraBiF(&Bi);
printf("Salida del coche: %s por la derecha", coche.matricula);
if (!EsvaciaC(C))
{
// si hay coches en cola de espera añadirlo
coche= PrimeroC(C);
BorraC(&C);
Colas, colas de prioridad y montículos 17
AnadeBiF(&Bi,coche);
}
}
}
else if (ch == 'I')
{
printf( " Introduzca matricula: " );
gets(coche.matricula);
if (!EstallenaBi(Bi))
AnadeBiP(&Bi, coche);
else /* No cabe en la bicola ponerlo en cola de espera*/
AnadeC(&C, coche);
}
else if (ch == 'D')
{
printf( " Introduzca matricula: " );
gets(coche.matricula);
if (!EstallenaBi(Bi))
AnadeBiF(&Bi, coche);
else // No cabe en la bicola ponerlo en cola de espera
AnadeC(&C, coche);
}
continuar = !(ch == 'x');
}
}
11.13
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int Num_Trabajo, HoraLlegada, TiempoResta, HoraActual;
} Datos;
struct Nodo
{
Datos Info;
Nodo *Sig;
};
typedef struct Nodo *Lista;
Lista c[2]; /* colas de prioridad */
int t[2]; /* Tiempos CPU */
int OtroNivel, Nivel, RelojSistema;
*L = (*L)->Sig;
*r = auxiliar->Info;
free(auxiliar);
};
void main()
{
c[1] = NULL;
c[2] = NULL;
Inicializar (c);
printf ("El orden de salida es");
if (c[2] == NULL)
Colas, colas de prioridad y montículos 19
Nivel = 1;
else if (c[1] == NULL)
Nivel = 2;
else if (c[1]->Info.HoraLlegada <= c[2]->Info.HoraLlegada)
Nivel = 1;
else
Nivel = 2;
RelojSistema = 0;
t[1] = 2;
t[2] = 1;
while ((c[1] != NULL) || (c[2] != NULL))
{
CogerTrabajo (&(c[Nivel]), t[Nivel]);
OtroNivel = 3 - Nivel; /*Genera valores 1,2 alternativamente*/
ElegirNivel (&Nivel, &OtroNivel, c);
}
}