Solved

implementing a queue of structure

Posted on 1998-08-15
6
250 Views
Last Modified: 2010-04-15
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.
0
Comment
Question by:zigla
6 Comments
 

Author Comment

by:zigla
ID: 1252128
Edited text of question
0
 
LVL 1

Expert Comment

by:TheMadManiac
ID: 1252129
what does the menu have to do with the fifo queue ?
0
 
LVL 8

Accepted Solution

by:
Answers2000 earned 100 total points
ID: 1252130
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
Does Powershell have you tied up in knots?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
LVL 5

Expert Comment

by:ecw
ID: 1252131
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
 
LVL 1

Expert Comment

by:newexpert
ID: 1252132
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
 
LVL 8

Expert Comment

by:Answers2000
ID: 1252133
OOps ecw is right, misread the question.  Not tried his code
0

Featured Post

Optimizing Cloud Backup for Low Bandwidth

With cloud storage prices going down a growing number of SMBs start to use it for backup storage. Unfortunately, business data volume rarely fits the average Internet speed. This article provides an overview of main Internet speed challenges and reveals backup best practices.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
posix semaphore deadlock 13 123
stack 22 165
Using unmanaged DLL from managed application 14 294
Linux context switch  - loop takes long time to process 6 115
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
Examines three attack vectors, specifically, the different types of malware used in malicious attacks, web application attacks, and finally, network based attacks.  Concludes by examining the means of securing and protecting critical systems and inf…
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question