Thread: Queues

  1. #1
    Registered User
    Join Date
    Dec 2005
    Posts
    25

    Queues

    Hello , I'm suppposed to make three queues and then insert,delete and display items in them according to a given priority
    So, if the user enters priority as 1/2/3 then I'm supposed to insert/delete/display items from it .

    This is what i got ..

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<process.h>
    #define Q_SIZE 5
    /*function declarations*/
    int underflow(int , int );
    int overflow(int );
    void insert( int a[], int r );
    void deleted(int a[], int f,int r);
    void display(int a[],int f,int r);
    /*variable declarations*/
    int q1[Q_SIZE],q2[Q_SIZE],q3[Q_SIZE];
    int f1=0,r1=-1,f2=0,r2=-1,f3=0,r3=-1;
    void main()
     {
      clrscr();
      int choice;
      int prio;
      for(;;)
      {
      printf("Que no.\n");
      scanf("%d",&prio);
      printf("ENTER 1 FOR INSERTION 2 FOR DELETION");
      printf("ENTER 3 FOR DISPLAY 4 FOR EXIT\n");
      printf("ENTER YOUR CHOICE\n");
      scanf("%d",&choice);
       switch(choice)
        {
         case 1:
          if(prio==1)
           {
    	 insert(q1, r1);
    	 break;
    	 }
    	if(prio==2)
    	 {
    	 insert( q2, r2 ) ;
    	 break;
    	 }
    	 if(prio==3)
    	  {
    	  insert( q3, r3 );
    	  break;
    	  }
          case 2:
          if(prio==1)
           {
    	 deleted( q1, f1,r1 );
    	 break;
    	 }
    	if(prio==2)
    	 {
    	 deleted( q2, f2,r1 ) ;
    	 break;
    	 }
    	 if(prio==3)
    	  {
    	  deleted( q3, f3,r1 );
    	  break;
    	}
          case 3:
          if(prio==1)
           {
    	 display( q1,f1, r1 );
    	 break;
    	 }
    	if(prio==2)
    	 {
    	 display( q2,f2,r2 );
    	 break;
    	 }
    	 if(prio==3)
    	  {
    	  display(q3,f3,r3);
    	  break;
    	  }
    	default:
    	exit(0);
           }
         }
      }
       /* overflow*/
        int overflow(int r)
        {
         if(r>Q_SIZE-1)
          {
          return 1;
          }
          else
           {
           return 0;
           }
          }
        /*underflow*/
        int underflow(int f,int r)
         {
         if(f>r)
          {
          return 1;
          }
          else
          {
          return 0;
          }
         }
        /*insert*/
         void insert(int q[],int r)
         {
         if(overflow(r)==1)
         {
         printf("overflow reached");
         return;
         }
         else
         {
         int item;
         printf("enter the item to be inserted");
         scanf("%d",&item);
         q[++r]=item;
         printf("%d",r1);/*confusion why is r1 =-1*/
         }
        }
        /* delete*/
        void deleted(int q[] ,int f, int r)
        {
        int item;
        if(underflow(f,r)==1)
         {
         printf("underflow reached");
         return;
         }
         else
          {
          item=(q[f++]);
          printf("deleted item is ..%d\n",item);
           }
         }
        /* display*/
         void display(int a[], int f ,int r)
          {
          if(underflow(f,r)==1)
           {
           printf("underflow nothing to display\n");
           return;
           }
           else
    	{
    	printf("elments in queue are \n");
    	 for(int i=f;i<=r;i++)
    	  printf("%d\n",a[i]);
    	  }
           }
    But the problem is say when the priority is 1 and when I try to insert an item, r1(the rear position for queue 1) is not incremented at all after being passed through the insert() function. Why is this happening?

  2. #2
    ATH0 quzah's Avatar
    Join Date
    Oct 2001
    Posts
    14,826
    1 - main always returns an int. If you return anything other than an int, it is completely compiler dependant, and is not portable code. Also, everyone here will get angry at you.

    2 - Learn what a function is, and use it. Your code is way too long to all be in main. No, nothing in the standard says you have to make functions. However, my sanity, and desire to actually read through your code, requests--nay, demands the use of functions. Why? Because it's much easier to debug one small function at a time. Also, it's ugly the way you have it. Oh, and it's a pain in the ass to read the flow of your program when it's one huge function that's ten pages long.


    Quzah.
    Hope is the first step on the road to disappointment.

  3. #3
    Registered Luser cwr's Avatar
    Join Date
    Jul 2005
    Location
    Sydney, Australia
    Posts
    869
    Looks to me like there are functions, but they are too lazy to indent properly. When someone's too lazy to lay out code nicely, I'm too lazy to read it.

  4. #4
    Registered User
    Join Date
    Dec 2005
    Posts
    25
    Sorry but this is the smallest main function I could manage...May be it can be further decomposed into smaller functions but being an absolute rookie in C (my experience with C is as of today 15 days old) this is the best I could manage.

    Proper identation is one of the toughest things i found while coding. I tried all most all forms of identation to make my code even neater but still people would complain ..Could people beside letting me know what exactly is wrong in the code would also suggest me ways for better/best identation technique?

  5. #5
    Rabble Rouser Slacker's Avatar
    Join Date
    Dec 2005
    Posts
    116
    >also suggest me ways for better/best identation technique?
    There's not a "best" way to indent. What people complain about is your consistency. As long as you format your code in a consistent way, it doesn't matter much how it looks because people will be able to figure out your indention style and be able to read the code. Here's your code with a more consistent formatting:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<process.h>
    #define Q_SIZE 5
    /*function declarations*/
    int underflow(int,int);
    int overflow(int);
    void insert(int a[],int r);
    void deleted(int a[],int f,int r);
    void display(int a[],int f,int r);
    /*variable declarations*/
    int q1[Q_SIZE],q2[Q_SIZE],q3[Q_SIZE];
    int f1=0,r1=-1,f2=0,r2=-1,f3=0,r3=-1;
    void main()
    {
      clrscr();
      int choice;
      int prio;
      for(;;)
      {
        printf("Que no.\n");
        scanf("%d",&prio);
        printf("ENTER 1 FOR INSERTION 2 FOR DELETION");
        printf("ENTER 3 FOR DISPLAY 4 FOR EXIT\n");
        printf("ENTER YOUR CHOICE\n");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
          if(prio==1)
          {
            insert(q1, r1);
            break;
          }
          if(prio==2)
          {
            insert( q2, r2 ) ;
            break;
          }
          if(prio==3)
          {
            insert( q3, r3 );
            break;
          }
        case 2:
          if(prio==1)
          {
            deleted( q1, f1,r1 );
            break;
          }
          if(prio==2)
          {
            deleted( q2, f2,r1 ) ;
            break;
          }
          if(prio==3)
          {
            deleted( q3, f3,r1 );
            break;
          }
        case 3:
          if(prio==1)
          {
            display( q1,f1, r1 );
            break;
          }
          if(prio==2)
          {
            display( q2,f2,r2 );
            break;
          }
          if(prio==3)
          {
            display(q3,f3,r3);
            break;
          }
        default:
          exit(0);
        }
      }
    }
    /* overflow*/
    int overflow(int r)
    {
      if(r>Q_SIZE-1)
      {
        return 1;
      }
      else
      {
        return 0;
      }
    }
    /*underflow*/
    int underflow(int f,int r)
    {
      if(f>r)
      {
        return 1;
      }
      else
      {
        return 0;
      }
    }
    /*insert*/
    void insert(int q[],int r)
    {
      if(overflow(r)==1)
      {
        printf("overflow reached");
        return;
      }
      else
      {
        int item;
        printf("enter the item to be inserted");
        scanf("%d",&item);
        q[++r]=item;
        printf("%d",r1);/*confusion why is r1 =-1*/
      }
    }
    /* delete*/
    void deleted(int q[],int f,int r)
    {
      int item;
      if(underflow(f,r)==1)
      {
        printf("underflow reached");
        return;
      }
      else
      {
        item=(q[f++]);
        printf("deleted item is ..%d\n",item);
      }
    }
    /* display*/
    void display(int a[],int f,int r)
    {
      if(underflow(f,r)==1)
      {
        printf("underflow nothing to display\n");
        return;
      }
      else
      {
        printf("elments in queue are \n");
        for(int i=f;i<=r;i++)
          printf("%d\n",a[i]);
      }
    }
    Vertical whitespace is also a good thing. You can use it to separate blocks of code that are logically separated from other blocks. There are also ways to tighten up what you have. Here's my second pass on your code:
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #define Q_SIZE 5
    
    /*function declarations*/
    int underflow(int,int);
    int overflow(int);
    void insert(int a[],int r);
    void deleted(int a[],int f,int r);
    void display(int a[],int f,int r);
    
    /*variable declarations*/
    int q1[Q_SIZE],q2[Q_SIZE],q3[Q_SIZE];
    int f1=0,r1=-1,f2=0,r2=-1,f3=0,r3=-1;
    
    int main()
    {
      int choice;
      int prio;
    
      for(;;)
      {
        printf("Que no.\n");
        scanf("%d",&prio);
    
        printf("ENTER 1 FOR INSERTION 2 FOR DELETION");
        printf("ENTER 3 FOR DISPLAY 4 FOR EXIT\n");
        printf("ENTER YOUR CHOICE\n");
        scanf("%d",&choice);
    
        switch(choice)
        {
        case 1:
          if(prio==1) insert(q1,r1);
          if(prio==2) insert(q2,r2);
          if(prio==3) insert(q3,r3);
          break;
        case 2:
          if(prio==1) deleted(q1,f1,r1);
          if(prio==2) deleted(q2,f2,r1);
          if(prio==3) deleted(q3,f3,r1);
          break;
        case 3:
          if(prio==1) display(q1,f1,r1);
          if(prio==2) display(q2,f2,r2);
          if(prio==3) display(q3,f3,r3);
          break;
        default: exit(0);
        }
      }
    
      return 0;
    }
    
    /* overflow*/
    int overflow(int r)
    {
      return r>Q_SIZE-1;
    }
    
    /*underflow*/
    int underflow(int f,int r)
    {
      return f>r;
    }
    
    /*insert*/
    void insert(int q[],int r)
    {
      if(overflow(r)==1)
      {
        printf("overflow reached");
      }
      else
      {
        int item;
    
        printf("enter the item to be inserted");
        scanf("%d",&item);
    
        q[++r]=item;
        printf("%d",r1);/*confusion why is r1 =-1*/
      }
    }
    
    /* delete*/
    void deleted(int q[],int f,int r)
    {
      if(underflow(f,r)==1)
      {
        printf("underflow reached");
      }
      else
      {
        int item;
    
        item=(q[f++]);
        printf("deleted item is ..%d\n",item);
      }
    }
    
    /* display*/
    void display(int a[],int f,int r)
    {
      if(underflow(f,r)==1)
      {
        printf("underflow nothing to display\n");
      }
      else
      {
        printf("elments in queue are \n");
        for(int i=f;i<=r;i++)
          printf("%d\n",a[i]);
      }
    }
    See the difference?

  6. #6
    Registered User
    Join Date
    Dec 2005
    Posts
    25
    ok will keep it in mind, still the problem though remains unresolved

  7. #7
    ex-DECcie
    Join Date
    Dec 2005
    Posts
    125
    Quote Originally Posted by ramayana
    Hello , I'm suppposed to make three queues and then insert,delete and display items in them according to a given priority
    So, if the user enters priority as 1/2/3 then I'm supposed to insert/delete/display items from it .

    This is what i got ..

    Code:
    ...
    int f1=0,r1=-1,f2=0,r2=-1,f3=0,r3=-1;
    
    void main()
     {
     
    ...
      scanf("%d",&choice);
       switch(choice)
        {
         case 1:
          if(prio==1)
           {
    	 insert(q1, r1);
    	 break;
    	 }
    	if(prio==2)
    	 {
    	 insert( q2, r2 ) ;
    	 break;
    	 }
    	 if(prio==3)
    	  {
    	  insert( q3, r3 );
    	  break;
    	  }
          case 2:
    ...
      }
        /*insert*/
    void insert(int q[],int r)
    {
         if(overflow(r)==1)
         {
            printf("overflow reached");
            return;
         }
         else
         {
         int item;
         printf("enter the item to be inserted");
         scanf("%d",&item);
         q[++r]=item;
         printf("%d",r1);/*confusion why is r1 =-1*/
         }
        }
    But the problem is say when the priority is 1 and when I try to insert an item, r1(the rear position for queue 1) is not incremented at all after being passed through the insert() function. Why is this happening?

    Basically speaking, you've declared r1 outside of main, which is OK.
    What you are wanting to do is to modify the value of r1.

    But, when you declare insert, you are declaring it like this:

    Code:
    void insert(int q[], int r)
    You are calling it like this:
    Code:
    insert(q1,r1);
    What is happening is that a COPY of r1 is being passed into insert. It is put on the stack. insert modifies the copy, which is then destroyed when the call returns.

    You need to pass a POINTER to r1, so that you can actually modify the CONTENTS.....

    Code:
    void insert(int q[],int *r);
    and call it like this:

    Code:
    insert(q1, &r1);
    That will help do what you want.

    There are other things that might improve your program as well....

    In each case, you are doing:

    Code:
    case 1:
       if (prio == 1) {
          do something
       }
       if (prio == 2) {
           do something else
       }
       break;
    In that situation, each different possibility is tried.

    If you code it like this (trying to put your most likely possiblity at the top), it will perform a bit better.....

    Code:
    case 1:
       if (prio == 1) {
          do something
       }
       else if (prio == 2) {
           do something else
       }
       else if (prop == 3) {
           do something completely different
       }
       break;
    }

    That way, it stops checking once you have found your prio....

    Hope this helps a bit.....

  8. #8
    Gawking at stupidity
    Join Date
    Jul 2004
    Location
    Oregon, USA
    Posts
    3,218
    Personally, I would rewrite the code to use linked lists instead of arrays. Linked lists are ideal for queues because of their nature. Queues are FIFO and in order to remove the first element from an array you'd have to do a lot more work than removing the first element from a linked list.

    Is there a particular reason you used arrays?
    If you understand what you're doing, you're not learning anything.

  9. #9
    Rabble Rouser Slacker's Avatar
    Join Date
    Dec 2005
    Posts
    116
    in order to remove the first element from an array you'd have to do a lot more work than removing the first element from a linked list.
    Not really. A queue is simple and easy to write using arrays, and the only problem would be a hard limit for how many elements you have. Just keep a pointer to the first element and the one past the last element and move them around accordingly when you insert and extract. If both of the pointers point to the same element, the queue is empty. That's basically the same thing you'd do with a linked list because an efficient queue would need both head and tail pointers. The only real difference is that you also need to wrap around the pointers to fit within the boundaries of the array, but the code is much simpler than the equivalent linked list code:
    Code:
    #include <stdio.h>
    
    void print_queue ( int queue[10], int front, int back )
    {
      int i;
    
      puts ( "" );
      for ( i = front; i < back; i++ )
        printf ( "%d ", queue[i] );
      puts ( "\n" );
    }
    
    int main ( void )
    {
      int queue[10] = {0};
      int front = 0, back = 0;
      int i = 0;
    
      do {
        queue[back++] = ++i;
    
        printf ( "Insert %d\n", i );
    
        if ( back == 10 ) back = 0;
      } while ( front != back );
    
      print_queue ( queue, front, 10 );
    
      for ( i = 0; i < 2; i++ )
        printf ( "Extract %d\n", queue[front++] );
    
      print_queue ( queue, front, 10 );
      puts ( "Done!" );
    
      return 0;
    }

  10. #10
    Gawking at stupidity
    Join Date
    Jul 2004
    Location
    Oregon, USA
    Posts
    3,218
    the only problem would be a hard limit for how many elements you have.
    How about a total number of elements you can run through your queue through the life of the program? Unless you constantly shift every element in your array when the head element is popped, you're just going to run out of room to store new elements at the tail.

    That shifting is what makes arrays less than ideal for queues of any reasonable length.
    If you understand what you're doing, you're not learning anything.

  11. #11
    Rabble Rouser Slacker's Avatar
    Join Date
    Dec 2005
    Posts
    116
    Unless you constantly shift every element in your array when the head element is popped, you're just going to run out of room to store new elements at the tail.
    I get the feeling you didn't read very far into my explanation before responding. But that's okay, people tend to ignore me or think I don't know what I'm talking about. You're thinking of a linear queue where the two pointers walk back toward the end and then everything bombs when they both get there because the total capacity of the queue shrinks when you extract from it. If that was what I was talking about then you'd be right, but I was talking about a circular queue where the pointers wrap around so that the capacity never changes and the only problem is like I said, there's still a hard upper limit on the size of the array.

  12. #12
    Gawking at stupidity
    Join Date
    Jul 2004
    Location
    Oregon, USA
    Posts
    3,218
    I get the feeling you didn't read very far into my explanation before responding. But that's okay, people tend to ignore me or think I don't know what I'm talking about.
    I read your entire post. It's just that the only indication that you were talking about a circular queue was "The only real difference is that you also need to wrap around the pointers to fit within the boundaries of the array" and it's not really clear from just that what you were referring to.

    In any event, I don't think that to make a fully functional queue that has no internal limitations (only dependant on available memory and OS) is that difficult.
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct queue_node_s
    {
      int num;
      struct queue_node_s *next;
    } QUEUE_NODE;
    
    typedef struct
    {
      QUEUE_NODE *head;
      QUEUE_NODE *tail;
    } QUEUE;
    
    QUEUE *new_queue(void)
    {
      QUEUE *q;
    
      if(!(q = malloc(sizeof(*q))))
        puts("Memory allocation error");
      else
        q->head = q->tail = NULL;
    
      return q;
    }
    
    void clear_queue(QUEUE *queue)
    {
      QUEUE_NODE *q, *qnext;
    
      for(q = queue->head;q;q = qnext)
      {
        qnext = q->next;
        free(q);
      }
    
      queue->head = queue->tail = NULL;
    }
    
    QUEUE *destroy_queue(QUEUE *queue)
    {
      clear_queue(queue);
      free(queue);
    
      return NULL;
    }
    
    void print_queue(QUEUE *queue)
    {
      QUEUE_NODE *node;
    
      printf("Elements in queue: ");
      for(node = queue->head;node;node = node->next)
        printf("%d ", node->num);
      putchar('\n');
    }
    
    QUEUE_NODE *push(QUEUE *queue, int num)
    {
      QUEUE_NODE *new;
    
      if(!(new = malloc(sizeof(*new))))
        puts("Memory allocation eror");
      else
      {
        new->num = num;
        new->next = NULL;
    
        if(!queue->head)
          queue->head = new;
        if(queue->tail)
          queue->tail->next = new;
        queue->tail = new;
      }
    
      return new;
    }
    
    QUEUE_NODE *pop(QUEUE *queue)
    {
      QUEUE_NODE *q;
    
      if((q = queue->head))
        queue->head = q->next;
    
      return q;
    }
    
    int main(void)
    {
      QUEUE *queue;
      QUEUE_NODE *node;
      char buf[BUFSIZ];
      char choice;
    
      if(!(queue = new_queue()))
        exit(EXIT_FAILURE);
    
      do
      {
        printf("1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: ");
        fflush(stdout);
    
        fgets(buf, sizeof(buf), stdin);
        choice = *buf;
        switch(choice)
        {
          case '1':
            printf("Number to push: ");
            fflush(stdout);
    
            fgets(buf, sizeof(buf), stdin);
    
            if(!(node = push(queue, atoi(buf))))
            {
              destroy_queue(queue);
              exit(EXIT_FAILURE);
            }
            printf("Pushed '%d'.\n", node->num);
            break;
          case '2':
            if(!(node = pop(queue)))
              puts("Queue is empty. Unable to pop.");
            else
            {
              printf("Popped '%d'.\n", node->num);
              free(node);
            }
            break;
          case '3':
            print_queue(queue);
            break;
          case '4':
            clear_queue(queue);
            puts("Queue cleared.");
            break;
          case '5':
            destroy_queue(queue);
            break;
          default:
            puts("Please choose 1, 2, 3, 4, or 5.");
        }
      } while(choice != '5');
    
      return 0;
    }
    My output:
    Code:
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 1
    Number to push: 7
    Pushed '7'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 1
    Number to push: 59
    Pushed '59'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 1
    Number to push: 86
    Pushed '86'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 1
    Number to push: 101
    Pushed '101'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 3
    Elements in queue: 7 59 86 101
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 2
    Popped '7'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 3
    Elements in queue: 59 86 101
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 1
    Number to push: 18
    Pushed '18'.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 3
    Elements in queue: 59 86 101 18
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 4
    Queue cleared.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 3
    Elements in queue:
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 2
    Queue is empty. Unable to pop.
    1) Push, 2) Pop, 3) Print, 4) Clear, 5) Quit: 5
    The meat of the queue is all above the main() function. The rest is jsut UI crap. It looks somewhat longer because of error checking and added functionality, but that's pretty much all you'll ever need from a queue. Changing the type of data you can store in the queue is also trivial. To me, this linked list queue is infinitely better than the array queue. There's no wasted memory (due to unused nodes/elements but there is overhead), the queue doesn't have an imposed upper limit, and it can easily store whatever kind of data you want.
    Last edited by itsme86; 12-27-2005 at 02:02 PM.
    If you understand what you're doing, you're not learning anything.

  13. #13
    Rabble Rouser Slacker's Avatar
    Join Date
    Dec 2005
    Posts
    116
    I don't think that to make a fully functional queue that has no internal limitations (only dependant on available memory and OS) is that difficult.
    Some people might. Linked lists were a bear when I first learned them, and I just couldn't get it right for the life of me. I still look for array based solutions first because of that, even though I don't have trouble with linked data structures anymore.
    but that's pretty much all you'll ever need from a queue.
    It sure seems that way. Then again, sometimes a linked data structure could be prohibitive when it comes to space usage. If all you need is a queue of integers, sometimes it's really not happy to double the space by having a node with both an integer and a pointer for every queued number. But I agree with you wholeheartedly except for that first part where you gave the impression that arrays make for bad queues.

    By the way, I meant no offense with my last few posts, and I appologize if it seemed otherwise.

  14. #14
    Registered User
    Join Date
    Dec 2005
    Posts
    25
    Quote Originally Posted by itsme86
    Personally, I would rewrite the code to use linked lists instead of arrays. Linked lists are ideal for queues because of their nature. Queues are FIFO and in order to remove the first element from an array you'd have to do a lot more work than removing the first element from a linked list.

    Is there a particular reason you used arrays?
    Yes there is ...we are required to implement queues using array here ...I know this would increase the code length as using link list to implement the same problem is rather easy ....but this is the irony of being under VTU ...makes every thing so hard for you .Anyway now I undersatnd what was wrong ....thanks a lot everyone
    Last edited by ramayana; 12-28-2005 at 12:56 AM.

  15. #15
    Registered User
    Join Date
    Jan 2002
    Location
    Vancouver
    Posts
    2,212
    Don't use all-caps for typedefs, it's ugly.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Concatenating two static queues?
    By difficult.name in forum C Programming
    Replies: 2
    Last Post: 10-18-2004, 11:19 PM
  2. stacks and queues
    By j0hnb in forum C Programming
    Replies: 4
    Last Post: 04-16-2003, 09:44 PM
  3. help with queues
    By Unregistered in forum C Programming
    Replies: 3
    Last Post: 05-21-2002, 09:09 PM
  4. queues
    By jamesb in forum C Programming
    Replies: 1
    Last Post: 04-21-2002, 08:57 PM
  5. queues
    By Unregistered in forum C Programming
    Replies: 3
    Last Post: 10-11-2001, 05:19 PM