• C

implementing a queue of structure

i would like to get help on how to implement a FIFO queue of data structures using c. i would like to use it as an entry point in my program i am currently coding for tcp/ip routing program. It should have a menu.I would appreciate if i got help soon .I am a student at the university.
ziglaAsked:
Who is Participating?
 
Answers2000Connect With a Mentor Commented:
Create a struct something like this

typedef tagMYSTRUCT
{
struct tagMYSTRUCT * pNext ; /* pointer to next element */
/* Your data goes here */
char exampledata ;
} MYSTRUCT ;

You also need a variable which points to the top element of the queue, e.g.
MYSTRUCT * pTopElement = NULL ;

To add element to queue do this

int AddItem( char data ) /* return 0 for success, -1 for error */
{
 /* Allocate new item */
 MYSTRUCT * newitem = (MYSTRUCT *)malloc( sizeof(MYSTRUCT) ) ;

 /* malloc could fail */
 if ( newitem == NULL ) return -1 ;

 /* if queue is previously empty then this is top element */
 if ( pTopElement == NULL )
 {
    pTopElement = newitem ;
    newitem->exampledata = data ;
    newitem->pNext = NULL ; /* Last item in queue */
    return 0;
 }

 newitem->pNext = pTopElement ;
 newitem->exampledata = data ;
 pTopElement = newitem ;
 return 0 ;
}

To remove an item

int PopItem( char * pdata ) /* return 0 for success, -1 for error */
{
   MYSTRUCT * pTemp ;

   if ( pTopElement == NULL )
   {
      /* Nothing in queue, return error */
      return -1 ;
   }

   /* Get data from top item */
   *pdata = pTopElement->exampledata ;

   /* Free top item, and make 2nd from top the top */
   pTemp = pTopElement->pNext ;
   free(pTopElement) ;
   pTopElement = pTemp ;

   return 0 ;

}

To clean up when you're finished completely with the queue
void FreeQueue( void )
{
  char cDummy ;

  while ( pTopElement != NULL )
  {
       PopItem( &cDummy ) ;
  }
}

Replace the example data (in my case a character) with the data you really need.  If you want each item to have a block of data I suggest you memcpy into the structure.

That should be enough to get you started (sorry for any typos above, but the algorithm should be there for you).

And don't forget to check the return values from AddItem and PopItem, because they can fail.  AddItem will fail if you run out of memory.  PopItem will fail if you calling code attempts to pull more stuff out the queue than you've added to it.

0
 
ziglaAuthor Commented:
Edited text of question
0
 
TheMadManiacCommented:
what does the menu have to do with the fifo queue ?
0
Improve Your Query Performance Tuning

In this FREE six-day email course, you'll learn from Janis Griffin, Database Performance Evangelist. She'll teach 12 steps that you can use to optimize your queries as much as possible and see measurable results in your work. Get started today!

 
ecwCommented:
Answers2000.  You've implemented a LIFO.  You're adding to the front of the list and removing from the front.  Try something like:

#include <assert.h>
#include <malloc.h>

struct queue_item {
  void *data;
  struct queue_item *next;
};

typedef struct queue *Queue;
struct queue {
  struct queue_item *head;
  struct queue_item *last;
} ;

Queue Queue_create(void)
{
Queue queue = calloc((size_t) 1, sizeof(*queue));
  return queue;
}

void *Queue_add_item(Queue queue, void *data)
{
struct queue_item *item;

  assert(queue != 0);

  if ((item = malloc(sizeof(*item)))) {
   item-> data = data;
   item-> next = 0;
   if (! queue-> head) {
     queue-> head = queue-> last = item;
   } else {
     queue-> last = queue-> last-> next = item;
   }
  }
  return item;
}

void *Queue_get_head(Queue queue)
{
struct queue_item *next = 0;
void *data = 0;
  assert(queue != 0);
  if (queue-> head) {
    data = queue-> head-> data;
    next = queue-> head-> next;
    free(queue-> head);
    if (! (queue-> head = next)) {
      queue-> last = 0;
    }
  }
  return data;
}

0
 
newexpertCommented:
Zigla: I don't see how a menu relates to a FIFO queue though.  Can you elaborate on the problem a little bit more, please?
0
 
Answers2000Commented:
OOps ecw is right, misread the question.  Not tried his code
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.