11
votes

Existe-t-il des implémentations standard de la file d'attente pour C?

existe-t-il une implémentation de la structure de données de la file d'attente qui "vient" avec c ou devrai-je développer le ma part (ceci est pour un projet d'école, je dois donc utiliser quelque chose qui existe dans l'installation Standard GCC ou doit en mettre en œuvre une par moi-même!)

Qu'en est-il des autres structures de données générales telles que des listes liées, des piles, etc.


8 Réponses :


1
votes

Vous devez mettre en œuvre votre propre. C a très peu de choses en termes de structures de données et vous oblige à recourir à des astuces arguelles pour mettre en œuvre des types de données abstraits: voir un article intitulé "Types incomplets comme abstractions" Si vous pouvez le trouver, ou voir comment les principes sont appliqués, disons, Fichier Bignum.H de Polarssl . C ++ d'autre part est censé vous permettre de faire à peu près tout ce que vous pouvez faire en C et de vous donner des moyens de mettre en œuvre des structures de données abstraites.


1 commentaires

... et C ++ a un type de file d'attente dans la STL dans tous les cas.



-3
votes

Vous devez mettre en œuvre vos propres structures de données, mais il existe de nombreuses bibliothèques de structure de données.


0 commentaires

1
votes

Vous pouvez utiliser un tuyau nommé . C'est une structure de données FIFO et fait partie de la norme POSIX. Si tout votre besoin est en cours sur le dos et retirez du front, cela fonctionnera. Vous devrez garder une trace des limites des messages à la main, peut-être que le premier élément soit le nombre d'octets dans le prochain message.


2 commentaires

Cela serait lent et non portable, ainsi que pour une compréhension des appels de système Unix pour la déboguer.


@larsmans: Je pense cependant qu'il s'agit d'une réponse équitable compte tenu des balises de questions.



26
votes

Essayez ceci. Unix est livré avec plusieurs types de listes liées - vous pouvez utiliser l'une d'entre elles pour créer d'autres structures éventuellement basées sur la liste telles qu'une pile.

man queue


2 commentaires

+1, avec la remarque que ce n'est pas une interface standard. Linux, BSD et je pense que Mac OS X fournit cependant.


Pas techniquement la bonne réponse, mais c'est définitivement hella utile ^ _ ^



0
votes

pas standard non exacé, mais de nombreux systèmes ont BSD / sys / file d'attente.h et BSD / sys / arbor.h qui sont des bibliothèques macro-basées sur la macro.

Voir le Documentation ici .


0 commentaires

1
votes

Utilisez BSB LIB. sys / file d'attente.h et sys / arbre.h avoir des implémentations de diverses listes et arbres.


0 commentaires

5
votes

non. Mais voici une implémentation très 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;
}


0 commentaires

0
votes

Glib (à ne pas être confondu avec GLIBC) implémente de nombreuses structures de données communes, y compris les files d'attente à double extrémité. Contrairement à FreeBSD's Macro-Wheices , GQUUES de GLIB est basé sur des fonctions qui peuvent être plus faciles à déboguer et à taper vérifier .

https://developer.gnome.org/glib /Stables/glib-Double-und-Quuesues.html


0 commentaires