Last active
June 28, 2019 22:22
-
-
Save MrDave1999/921cb85abf4cee891c9ba76014a675a0 to your computer and use it in GitHub Desktop.
Operaciones básicas de una cola.
This file contains 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
#ifndef _OP_H | |
#define _OP_H | |
struct _node | |
{ | |
int data; | |
struct _node* sig; | |
}; | |
//Le asigna un alias a "struct _node" | |
typedef struct _node node; | |
//Esta función encola un elemento al final de la cola | |
void enqueue(node** firstNode, node** lastNode) | |
{ | |
node* newNode = malloc(sizeof(node)); | |
if (newNode == NULL) | |
puts("Error: No se pudo reservar memoria."); | |
else | |
{ | |
int data; | |
dataread("%d", &data, "Ingrese un valor:"); | |
newNode->data = data; | |
/* | |
- Si firstNode apunta a NULL, entonces solo creamos un nodo inicial, donde lastNode y firstNode | |
quedaría apuntando a newNode. | |
- Si firstNode no llegara apuntar a NULL, entonces ya estamos creando más de un nodo, donde lastNode sería | |
el penúltimo nodo apuntaría al nuevo nodo (el último nodo actual). | |
*/ | |
(*firstNode == NULL) ? (*firstNode = newNode) : ((*lastNode)->sig = newNode); | |
*lastNode = newNode; | |
newNode->sig = NULL; | |
} | |
} | |
//Esta función desencola un elemento al inicio de la cola | |
void dequeue(node** firstNode) | |
{ | |
node* aux = *firstNode; | |
*firstNode = (*firstNode)->sig; | |
free(aux); | |
} | |
//Esta función muestra todos los elementos de la cola. | |
void show(node* firstNode) | |
{ | |
node* aux = firstNode; | |
puts("-> Elementos de la lista:\n"); | |
while (aux != NULL) | |
{ | |
printf("%d\n", aux->data); | |
aux = aux->sig; | |
} | |
} | |
//Esta función elimina todos los elementos de la cola. | |
void clear(node** firstNode) | |
{ | |
node* aux = *firstNode; | |
while (aux != NULL) | |
{ | |
*firstNode = aux; | |
aux = aux->sig; | |
free(*firstNode); | |
} | |
*firstNode = NULL; | |
} | |
#endif |
This file contains 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> | |
/* | |
Este archivo de cabecera proporciona macros para pedir los datos de forma segura. | |
Enlace: www.github.com/MrDave1999/pscanf.h | |
*/ | |
#include <pscanf.h> | |
//En este archivo están las funciones que realizan la operación básica en una cola | |
#include "op.h" | |
int main(void) | |
{ | |
char option; | |
//Este puntero guarda la dirección base del primer nodo | |
node* firstNode = NULL; | |
//Este puntero guarda la dirección base del último nodo | |
node* lastNode = NULL; | |
while (1) | |
{ | |
puts("-> Menu de opciones:"); | |
puts("a. Insertar elemento en la cola."); | |
puts("b. Mostrar lista"); | |
puts("c. Eliminar elemento de la cola."); | |
puts("d. Eliminar toda la lista desde el inicio."); | |
puts("e. Salir"); | |
dataread("%c", &option, "Ingrese una opcion <a-e>"); | |
if (!(option >= 'a' && option <= 'e')) | |
{ | |
puts("Error: Usted debe ingresar una opcion valida <a-e>\n"); | |
continue; | |
} | |
//Solo en las opciones b hasta d detectamos si la lista está vacía. | |
if ((option >= 'b' && option <= 'd') && (firstNode == NULL)) | |
{ | |
puts("Error: La lista esta vacia\n"); | |
continue; | |
} | |
switch (option) | |
{ | |
case 'a': | |
enqueue(&firstNode, &lastNode); | |
break; | |
case 'b': | |
show(firstNode); | |
break; | |
case 'c': | |
dequeue(&firstNode); | |
break; | |
case 'd': | |
clear(&firstNode); | |
puts("-> Todos los elementos fueron eliminados de la lista."); | |
break; | |
case 'e': | |
if (firstNode != NULL) | |
clear(&firstNode); | |
return 0; | |
} | |
pauseprogram(); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment