Skip to content

Instantly share code, notes, and snippets.

@jeanbenitez
Created March 16, 2017 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeanbenitez/dac6bdaad0c681d82232f3f799036d6f to your computer and use it in GitHub Desktop.
Save jeanbenitez/dac6bdaad0c681d82232f3f799036d6f to your computer and use it in GitHub Desktop.
Definición del TDA Cola y un ejercicio práctico (Ahorcado)
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
typedef struct cola{
char dato; // 'char' para guardar un caracter. para enteros cambienlo a 'int'
int pos; // Le añadiremos esta variable para saber la posición de la letra en la palabra original
struct cola * sig;
} Cola;
/*
MAQUETA PARA COLAS (con Lista Simple):
- El apuntador PRIMERO de una cola apunta al PTR de la Lista Simple
- El apuntador ULTIMO de una cola apunta al ultimo nodo de la Lista Simple
- Encolar sería insertar un nuevo nodo por cola
- Desencolar sería eliminar el primer nodo (PTR)
- NOTA: No se dejen confundir, el siguiente de un nodo no es el siguiente en la cola! espero lo capten ;)
Un ejemplo de como quedaría una cola con esta implementación en Lista Simple:
PRIMERO ULTIMO
| |
[e]->[l]->[e]->[f]->[a]->[n]->[t]->[e]
Si ha alguno se le ocurre hacerlo de otra forma, es válido siempre y cuando encole y desencole como se espera.
Recuerden que la programación es un arte ;)
*/
void encolar(Cola ** primeroaux, Cola ** ultimoaux, char d, int p){
Cola * c = (Cola *)malloc(sizeof(Cola)); //Nuevo nodo
c->dato = d; // Se le asigna el dato de la letra al nodo
c->pos = p; // Se le asigna el dato de la posicion al nodo
c->sig = NULL; //Como va a ir de ultimo, el que le sigue será NULL
if((*ultimoaux) != NULL) (*ultimoaux)->sig = c; //Si ya hay un nodo ULTIMO, entonces el que le seguirá a ese ultimo será el nuevo ultimo
if((*primeroaux) == NULL) (*primeroaux) = c; //Si no hay un nodo primero, entonces este nuevo nodo también será el primero
(*ultimoaux) = c; //El ultimo, sea como sea, va a ser el que se acaba de encolar
}
void desencolar(Cola ** primeroaux, Cola ** ultimoaux, char * d, int * p){
(*d) = (*primeroaux)->dato; // Se le asigna la letra a la variable 'd'
(*p) = (*primeroaux)->pos; // Se le asigna la posicion a la variable 'p'
Cola * c; // Apuntador auxiliar para la eliminación
c = (*primeroaux); // se le asigna PRIMERO
(*primeroaux) = (*primeroaux)->sig; // EL primero será el que está antes en la cola
if((*ultimoaux) == c) (*ultimoaux) = NULL; /* Si el que se va a eliminar va a ser el último, se le apunta a NULL
Esto se hace porque cuando hacemos 'free' no nos va a quedar esta variable
apuntando a NULL. Si quieren borren esta línea y veran lo que les digo... */
free(c); // Se libera.
}
int main(){
/*
EJERCICIO: Ahorcado
VAMOS A HACERLO EN C:
*/
//Usaremos 2 cola2:
Cola *primero=NULL, *ultimo=NULL;
Cola *primero2=NULL, *ultimo2=NULL;
char palabra[50] = "elefante"; // La palabra
int i; // Variable para el 'for'
int n = 5; //Numero de Intentos
char adivinado[50]; /* aqui se va a ir ubicando las letras que vayan siendo adivinadas
esto es para imprimir lo que vayamos adivinando
entonces, en las que no se hayan adivinado se va a poner guion bajo '_' */
// Recorremos la palabra, recueden que una cadena de caracteres en realidad es un vector de caracteres ;)
for(i=0;i<strlen(palabra);i++){
encolar(&primero, &ultimo, palabra[i], i); // Encolamos cada letra
adivinado[i] = '_';
}
int l; //Esta es una variable auxiliar para la posicion de la letra en palabra adivinada ya
char letra, nletra; // Variables auxiliares
int sw;
while(n!=0 && primero != NULL){ //El ciclo continuará pidiendo letras mientras haya intentos y haya letras que adivinar
printf("\n\nIngresa una letra: ");
letra = getch(); // Esto va a pedir un solo caracter
system("CLS"); // Limpiamos pantalla, pueden borrar esto para que vean el proceso
sw = 0; // Esta variable verificará si la letra fue encontrada o no
while(primero != NULL){ // Ciclo para desencolar hasta que no haya más
desencolar(&primero, &ultimo, &nletra, &l); //Desencolamos
if(nletra == letra){ // Si la letra desencolada es igual a la ingresada
sw = 1; // sw se hace '1' para avisar que encontramos por lo menos una vez la letra
adivinado[l] = letra; //Colocamos la letra adivinada en la posición que corresponde
}else{
// sino entonces la encolamos en la cola auxiliar
encolar(&primero2, &ultimo2, nletra, l);
}
} // Fíjense que si se encuentra la letra, el ciclo sigue, porque pueden haber más de una ;)
if(sw == 0){ // Si sw no cambió a '1' es porque la letra no se encontró ninguna vez
n--; // Perdió un intento
printf(" [No encontrado, te quedan %d intentos]", n);
}
adivinado[strlen(palabra)] = '\0';
printf("\n%s", adivinado);
// Con esto regresamos de la cola auxiliar a la original
while(primero2 != NULL){
desencolar(&primero2, &ultimo2, &nletra, &l);
encolar(&primero, &ultimo, nletra, l);
}
}
// Si quedaron intentos es porque en la cola ya no habian letras para adivinar
if(n!=0){
printf("\n\n GANASTE!");
}else{
printf("\n\n PERDISTE!");
}
getch();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment