views:

474

answers:

5

Post related to the question here.

Problem: to find the right data structure for the queue:

 #include <stdio.h>                                                                                                                                                             
 #include <stdlib.h>
 #include <stdarg.h>
 #include <time.h>

 int main(int argc, const char *argv[])
 {
     Queue q;
     ch ='A';
     for (int k = 0; int k < 4; int k++) {
         q.addQ(ch);
         ch++;
         q.addQ(ch);
         ch=q.front();
         q.removeQ();
     }
     return 0;
 }

I tried to compile it, but the Queue is undeclared:

$ 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)

Question: What is the library for the basic data structures such as the queue in the example?

+1  A: 

First off, you need C++, not C. C is not an object-oriented language, and it doesn't have standard libraries for things like queues.

For C++, look for the std::queue.

#include <queue>

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

You can, of course, make queue-like structure in C, but you'll wind up doing a lot of the work yourself. See the answer below about the TAILQ_ macros.

JSBangs
To be fair, it could have been implemented using function-pointers in the struct.
Aiden Bell
Actually I retract that, the state isn't passed.
Aiden Bell
There are options for doing this in C instead of C++ - C can be object-oriented, but it isn't required. (See Gtk for examples of at least somewhat OO C code).
Reed Copsey
+5  A: 

This looks like a good candidate for the TAILQ_* ?

#include <sys/queue.h>

"man queue" will give more details - there are simple lists, tail queues and circular queues there. Those are the macros that you'd need to bolt on your own structures, not classes of course.

The code for your scenario will look something like this (I should have made the add_to_queue return some code to check for error, and avoid global vars too, but hopefully I would be forgiven in this example):

#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);
}
Andrew Y
Interestingly, I really overlooked the complexity. I did not wait for so long code. Perhaps, Ruby's simplicity has deteriorated my mind.
Masi
Thank you! It takes some time to go step-by-step through it.
Masi
+1  A: 

That is not valid C.

Anyway, C doesn't have a standard libraries for these data structures.

Mike Mu
A: 

There isn't one in the standard C library; tracing back through the related posts, it looks like the Queue data structure was meant to be written by the student.

Unlike C++, the standard C library does not provide a standard set of containers.

John Bode
+2  A: 

A great option is to use the C Generic Library. This is a C library modeled (loosely) on the C++ STL. It provides a queue struct, lists, etc.

Reed Copsey