FIFO en C Primero en Entrar, primero en salir, Cola o Fila

No es lo mas eficiente, hay muchas cosas se podrian mejorar, en especifico la forma en la que se organizan  el arreglo de elementos actuales en la Fila,  sin embargo funciono para el proposito.

Yo se que la mayoría de estas estructuras ya están implementadas. Pero no se puede decir que eres programador si no sabes implementarlas por tu cuenta.




Codigo:

/*
 El tipo de dato se puede cambiar dependiendo de la implementacion que se le quiera dar, tambien se tendrian que cambiar los tipos de datos devueltos por las funciones
 En este caso yo queria un arreglo de apuntadores char* por lo cual el contenedor es char**
 */


typedef struct str_queue    {
    char **queue;
    int len;
}Queue;


Queue *create_queue();
void free_queue(Queue *q);
char *de_queue(Queue *q);
void en_queue(Queue *q, char *ptr);
   

Queue *create_queue()    {
    Queue *r = malloc(sizeof(struct str_queue));
    r->len = 0;
    r->queue = NULL;
    return r;
}

void free_queue(Queue *q)    {
    if(q)    {
        if(q->queue)
            free(q->queue);
        free(q);
    }
}

void en_queue(Queue *q, char *ptr)    {
    q->queue = realloc(q->queue,(q->len+1)*sizeof(char*));
    if(q->queue != NULL)    {
        q->queue[q->len] = ptr;
        q->len++;
    }
}

char * de_queue(Queue *q)    {
    char *r = NULL;
    if(q->len >= 1)    {
        r = q->queue[0];
        memcpy(q->queue,q->queue + 1 ,sizeof(char*)*(q->len-1));
        q->len--;
        q->queue[q->len] = NULL;
    }
    return r;
}



Yo en su momento lo utilize para un post, donde realizaba una versión iterativa y necesitaba almacenar en una Cola el listado de los directorios que aun faltaba por recorrer:

problema de memoria con readdir (Solucionado)

Ejemplo de uso:


Salida#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

int main()    {
    char *cadenas[10] = { "Cadena_0","Cadena_1","Cadena_2","Cadena_3","Cadena_4","Cadena_5","Cadena_6","Cadena_7","Cadena_8","Cadena_9"};
    char *actual;
    int index1,index2,i =0;
    srand(time(NULL));
    Queue *q = create_queue();
    while(i < 10)    {
        index1 = rand() % 10;
        index2 = rand() % 10;
        printf("Agregando a la fila: %s\n",cadenas[index1]);
        en_queue(q,cadenas[index1]);
        printf("Agregando a la fila: %s\n",cadenas[index2]);
        en_queue(q,cadenas[index2]);
        printf("Saliendo de la fila %s\n",de_queue(q));
        i++;
    }
    free_queue(q);
}



Como es randon la salida es variada, pero podemos observar el funcionamiento:
 
Salida:
 
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_5
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_7
Saliendo de la fila Cadena_2
Agregando a la fila: Cadena_9
Agregando a la fila: Cadena_2
Saliendo de la fila Cadena_5
Agregando a la fila: Cadena_1
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_8
Agregando a la fila: Cadena_5
Saliendo de la fila Cadena_8
Agregando a la fila: Cadena_0
Agregando a la fila: Cadena_3
Saliendo de la fila Cadena_7
Agregando a la fila: Cadena_4
Agregando a la fila: Cadena_0
Saliendo de la fila Cadena_9
Agregando a la fila: Cadena_7
Agregando a la fila: Cadena_1
Saliendo de la fila Cadena_2

 
Fuente de la Imagen

https://en.wikipedia.org/wiki/Queue_(abstract_data_type)

Comentarios

Entradas populares de este blog

Clave WPA2 por Defecto de equipos TotalPlay (Huawei HG8245H)

Cable modem Ubee - WPA2 y WPS por defecto