#include <stdio.
h>
#include <stdlib.h>
#define MAX 5 // Tamaño máximo para pila, cola y cola circular
// ----------------- PILA -----------------
typedef struct {
int datos[MAX];
int tope;
} Pila;
void push(Pila *p, int x) {
if (p->tope < MAX - 1)
p->datos[++p->tope] = x;
int pop(Pila *p) {
if (p->tope >= 0)
return p->datos[p->tope--];
return -1;
// ----------------- COLA -----------------
typedef struct {
int datos[MAX];
int frente, final;
} Cola;
void encolar(Cola *c, int x) {
if (c->final < MAX - 1)
c->datos[++c->final] = x;
int desencolar(Cola *c) {
if (c->frente <= c->final)
return c->datos[c->frente++];
return -1;
// ----------------- COLA CIRCULAR -----------------
typedef struct {
int datos[MAX];
int frente, final, contador;
} ColaCircular;
void encolarCircular(ColaCircular *c, int x) {
if (c->contador < MAX) {
c->datos[c->final] = x;
c->final = (c->final + 1) % MAX;
c->contador++;
int desencolarCircular(ColaCircular *c) {
if (c->contador > 0) {
int x = c->datos[c->frente];
c->frente = (c->frente + 1) % MAX;
c->contador--;
return x;
return -1;
// ----------------- LISTA ENLAZADA -----------------
typedef struct Nodo {
int dato;
struct Nodo *sig;
} Nodo;
void insertarLista(Nodo **cab, int x) {
Nodo *nuevo = (Nodo*)malloc(sizeof(Nodo));
nuevo->dato = x;
nuevo->sig = *cab;
*cab = nuevo;
// ----------------- LISTA ENLAZADA CIRCULAR -----------------
typedef struct NodoC {
int dato;
struct NodoC *sig;
} NodoC;
void insertarCircular(NodoC **cab, int x) {
NodoC *nuevo = (NodoC*)malloc(sizeof(NodoC));
nuevo->dato = x;
if (*cab == NULL) {
*cab = nuevo;
nuevo->sig = *cab;
} else {
NodoC *temp = *cab;
while (temp->sig != *cab) temp = temp->sig;
temp->sig = nuevo;
nuevo->sig = *cab;
// ----------------- LISTA DOBLEMENTE ENLAZADA -----------------
typedef struct NodoD {
int dato;
struct NodoD *sig, *ant;
} NodoD;
void insertarDoble(NodoD **cab, int x) {
NodoD *nuevo = (NodoD*)malloc(sizeof(NodoD));
nuevo->dato = x;
nuevo->sig = *cab;
nuevo->ant = NULL;
if (*cab != NULL) (*cab)->ant = nuevo;
*cab = nuevo;
// ----------------- RECURSIVIDAD -----------------
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// ----------------- MAIN -----------------
int main() {
// Matriz (ejemplo de iteración)
int matriz[2][2] = {{1, 2}, {3, 4}};
printf("Matriz:\n");
for (int i = 0; i < 2; i++) { // iteración
for (int j = 0; j < 2; j++)
printf("%d ", matriz[i][j]);
printf("\n");
// Pila
Pila p = {.tope = -1};
push(&p, 10);
push(&p, 20);
printf("\nPop pila: %d\n", pop(&p));
// Cola
Cola c = {.frente = 0, .final = -1};
encolar(&c, 5);
encolar(&c, 15);
printf("Desencolar cola: %d\n", desencolar(&c));
// Cola circular
ColaCircular cc = {.frente = 0, .final = 0, .contador = 0};
encolarCircular(&cc, 100);
encolarCircular(&cc, 200);
printf("Desencolar cola circular: %d\n", desencolarCircular(&cc));
// Lista enlazada
Nodo *lista = NULL;
insertarLista(&lista, 1);
insertarLista(&lista, 2);
printf("Lista enlazada primer dato: %d\n", lista->dato);
// Lista enlazada circular
NodoC *listaC = NULL;
insertarCircular(&listaC, 7);
insertarCircular(&listaC, 8);
printf("Lista circular un dato: %d\n", listaC->dato);
// Lista doblemente enlazada
NodoD *listaD = NULL;
insertarDoble(&listaD, 50);
insertarDoble(&listaD, 60);
printf("Lista doble primer dato: %d\n", listaD->dato);
// Recursividad (factorial)
printf("\nFactorial de 5 = %d\n", factorial(5));
return 0;