2010-11-15 10 views
5

¿Hay alguna implementación de estructura de datos Queue que "llegue" con C o tendré que desarrollar la mía (esto es para un proyecto escolar, así que debo usar algo que exista en la instalación estándar de gcc o tenga que implementar uno por yo mismo!)¿Hay implementaciones de Queue estándar para C?

¿Qué pasa con otras estructuras de datos generales como listas enlazadas, pilas, etc.?

Gracias

+0

http://stackoverflow.com/questions/1819416/standard-data-structure-library-in-c http://stackoverflow.com/questions/14001652/does-standard-c-library-provides-linked-list-etc-data-structures –

Respuesta

2

Debe implementar la suya propia. C tiene muy poco en términos de estructuras de datos y lo obliga a recurrir a trucos discutibles para implementar tipos de datos abstractos: vea un artículo titulado "Tipos incompletos como abstracciones" si puede encontrarlo, o vea cómo se aplican los principios en, por ejemplo, PolarSSL's bignum.h file. C++, por otro lado, se supone que le permite hacer prácticamente todo lo que puede hacer en C y le ofrece formas de implementar estructuras de datos abstractas.

+0

... y C++ tiene un tipo de cola en el STL en cualquier caso. – Clifford

0

GDSL sería un gran lugar para comenzar. This thread da algunos otros.

+0

Parece una biblioteca. A menos que venga con gcc, entonces no me sirve de nada. –

+2

Hmm. Parece un requisito extraño ... después de todo, la mayor parte de lo que vas a utilizar estará en alguna biblioteca u otra. No puedo ver el problema a menos que el proyecto sea sobre estructuras de datos, ¡pero no soy su supervisor! – spender

0

Tiene que implementar sus propias estructuras de datos, pero existen muchas bibliotecas de estructura de datos.

1

Puede usar named pipe. Es una estructura de datos FIFO y es parte del estándar posix. Si todo lo que quiere es enque hacia atrás y eliminarlo del frente, funcionará. Sin embargo, tendrá que hacer un seguimiento de los límites del mensaje a mano, tal vez teniendo el primer elemento como la cantidad de bytes en el siguiente mensaje.

+0

Esto sería lento y no portátil, además de requerir una comprensión de las llamadas al sistema Unix para depurarlo. –

+1

@larsmans: creo que es una respuesta justa dadas las etiquetas de pregunta. – Clifford

21

Pruebe esto. Unix viene con varios tipos de listas vinculadas: puede usar una de ellas para crear otras estructuras posiblemente basadas en listas, como una pila.

man queue 
+3

+1, con la observación de que esta no es una interfaz estándar. Sin embargo, Linux, BSD y yo creemos que Mac OS X lo proporciona. –

+0

Técnicamente no es la respuesta correcta pero definitivamente es útil.^_ ^ – Goahnary

0

Si se trata de un "proyecto de la escuela", entonces la aplicación de sus propias estructuras de datos pueden estar en el esquema de puntuación, y utilizando una función de biblioteca puede impedir que el examinador concesión de dichas marcas.

La biblioteca estándar de ISO C no contiene tales estructuras de datos, pero GNU libc cubre más que solo el estándar ISO. Esto incluye Pipes and FIFOs que puede cumplir sus requisitos.

0

No es exactamente el estándar, pero muchos sistemas tienen bsd/sys/queue.h y bsd/sys/tree.h que son bibliotecas basadas en macros.

Ver el documentation here.

0

Utilice BSB lib. sys/queue.h y sys/tree.h tienen implementaciones de varias listas y árboles.

0

No. Pero aquí es una aplicación muy simple:

typedef struct node { 
    int val; 
    struct node *next; 
} node_t; 

void enqueue(node_t **head, int val) { 
    node_t *new_node = malloc(sizeof(node_t)); 
    if (!new_node) return; 

    new_node->val = val; 
    new_node->next = *head; 

    *head = new_node; 
} 

int dequeue(node_t **head) { 
    node_t *current, *prev = NULL; 
    int retval = -1; 

    if (*head == NULL) return -1; 

    current = *head; 
    while (current->next != NULL) { 
     prev = current; 
     current = current->next; 
    } 

    retval = current->val; 
    free(current); 

    if (prev) 
     prev->next = NULL; 
    else 
     *head = NULL; 

    return retval; 
} 

fuente completo here

Cuestiones relacionadas