10
votes

Bibliothèque pour les structures de données de base, telles que la file d'attente, en C

Problème: strong> Pour trouver la bonne structure de données pour la file d'attente:

$ gcc -o Qu_1 -g q_queue.c
q_queue.c: In function 'main':
q_queue.c:8: error: 'Queue' undeclared (first use in this function)


4 Réponses :


-12
votes

Tout d'abord, vous avez besoin de C ++, pas C. C n'est pas une langue orientée objet, et il n'a pas de bibliothèques standard pour des choses telles que les files d'attente.

pour C ++, recherchez la STD :: Queue.

#include <queue>

int main(int argc, const char *argv[])
{
     std::queue q;
     /// etc;
}


4 commentaires

Pour être juste, cela aurait pu être mis en œuvre en utilisant des pointeurs de fonction dans la structure.


En fait, je rétracte cela, l'état n'est pas passé.


Il existe des options pour ce faire en C au lieu de C ++ - C peut être orientée objet, mais ce n'est pas nécessaire. (Voir GTK pour des exemples de code au moins un peu OO C).


Comme indiqué ci-dessus, vous n'avez pas besoin d'OOP pour avoir des génériques. Il y a deux types de génériques, libres et non libres (j'ai fait cette dichotomie tout à l'heure actuelle), faisant référence à la quantité de travail supplémentaire dont l'ordinateur doit faire pour déterminer le type de données de la structure générique. Premièrement étant des génériques libres, qui utilise le prétraitement, comme discuté ici ici Stackoverflow .com / questions / 10950828 / ... . Deuxièmement, des génériques non libres, grâce à des pointeurs / unions vides associés à un identifiant de type de données pour aider le programme à en déduire le type d'accès au moment de l'exécution.



14
votes

Ceci ressemble à un bon candidat pour le Tailq_ *? XXX PRE>

"MAN WEUE" donnera plus de détails - Il existe des listes simples, des files d'attente queue et des files d'attente circulaires là-bas. Ce sont les macros que vous auriez besoin de boulonner sur vos propres structures, pas de cours bien sûr. P>

Le code de votre scénario ressemblera à ceci (j'aurais dû faire de l'add_to_queue de retourner un code pour vérifier Pour erreur, et évitez également les Vares globaux, mais j'espère que je serais pardonné dans cet exemple): P>

#include <stdio.h>
#include <stdlib.h>
#include <sys/queue.h>

TAILQ_HEAD(tailhead, entry) head;

struct entry {
  char c;
  TAILQ_ENTRY(entry) entries;
};

void add_to_queue(char ch) {
  struct entry *elem;
  elem = malloc(sizeof(struct entry));
  if (elem) {
    elem->c = ch;
  }
  TAILQ_INSERT_HEAD(&head, elem, entries);
}

int main(int argc, char *argv[]) {
  char ch = 'A';
  int i;
  struct entry *elem;

  TAILQ_INIT(&head);
  for (i=0; i<4; i++) {
    add_to_queue(ch);
    ch++;
    add_to_queue(ch);

    elem = head.tqh_first;
    TAILQ_REMOVE(&head, head.tqh_first, entries);
    free(elem);
  }
  exit(0);
}


3 commentaires

Fait intéressant, j'ai vraiment négligé la complexité. Je n'ai pas attendu si long code. Peut-être que la simplicité de Ruby a détérioré mon esprit.


Merci! Il faut un peu de temps pour aller à travers cela.


Est-ce que l'atomique de la file d'attente?



1
votes

Il n'y en a pas dans la bibliothèque C Standard C; Traquer dans les postes liés, on dirait que la structure de données de file d'attente était censée être écrite par l'étudiant.

Contrairement à C ++, la bibliothèque C standard C ne fournit pas de conteneurs standard.


0 commentaires

5
votes

Une excellente option consiste à utiliser le bibliothèque générique . Ceci est une bibliothèque C modélisée (lâchement) sur le C ++ stl. Il fournit une structure de file d'attente, des listes, etc.


0 commentaires