Created
March 16, 2017 03:40
-
-
Save jeanbenitez/dac6bdaad0c681d82232f3f799036d6f to your computer and use it in GitHub Desktop.
Definición del TDA Cola y un ejercicio práctico (Ahorcado)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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