GIDForums  

Go Back   GIDForums > Computer Programming Forums > C++ Forum
User Name
Password
Register FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
 
Thread Tools Search this Thread Rate Thread
  #1  
Old 01-Apr-2009, 20:04
ghost305 ghost305 is offline
New Member
 
Join Date: Apr 2009
Posts: 3
ghost305 is on a distinguished road

Help with FIFO QUEUE


Description

Create a Queue class that implements a queue abstraction. A queue is a FIFO list (First In First Out queue). A simple example is waiting in line, where the first person in the line is the first served. New arrivals are added to the back of the line, the next person served is (removed) from the front of the line.

The Queue class needs to implement the following operations:

* adding to the queue at one end (the tail)
* removing from the queue at the other end (the head)
* printing all items the queue (from head to tail)
* erasing all items in the queue (leaving the queue empty).
* destructor to empty the queue before it's destroyed (to release all memory)

Additions and removals always occur at the opposite ends of the queue.

You should create the following methods in your Queue class to implement the above operationsm

Your Queue implementation uses a companion QueueItem class to represent each element in the list. A QueueItem contains character string as the data value, a unique (among all QueueItems in a Queue) integer node identifier, and a pointer to the next QueueItem in the list. The following is the definition for the QueueItem class.

CPP / C++ / C Code:
class QueueItem {
public:
QueueItem(char *pData, int id); // ctor
void setNext(QueueItem *pItem);
QueueItem* getNext();
int getId();
const char* getData();
private:
char mData[30]; // or, use a char* if you want to dynamically alloc memory
int mNodeID;
QueueItem * mpNext;
};

The QueueItem member functions are very basic, just setting or getting data members of the class. All the linked list manipulation is done by the Queue class member functions.

The Queue class member functions manipulate the linked list of QueueItem's, creating and destroying QueueItem objects as needed using the C++ new and delete operators. The Queue class member data includes a pointer to the head and and pointer to the tail of the linked list of QueueItems, and an integer node counter used to provide a unique node ID for every newly created QueueItem (incremented each time a new QueueItem is added, and passed as a parameter to the QueueItem constructor. It is never decremented).

The following is a partial example of the Queue class; you will need to fill in the remaining methods.

class Queue {
public:
Queue(); // ctor inits a new Queue
~Queue(); // dtor erases any remaining QueueItems
void addItem(char *pData);
void removeItem();
...
private:
QueueItem *mpHead; // always points to first QueueItem in the list
QueueItem *mpTail; // always points to the last QueueItem in the list
int mNodeCounter; // always increasing for a unique id to assign to each new QueueItem
};

The Queue class member functions should not have access to the private members of QueueItem objects. They call the public member functions of QueueItem.

As an example, the outline of the Queue::addItem() member function is shown below. It must add a new QueueItem at the tail of the Queue, and update the mpTail pointer to point to it. The first item in the Queue is both the head and the tail of the list.:


void Queue::addItem(char *pData)
{
// dynamically create and init a new QueueItem object
QueueItem *pQI = new QueueItem(pData, ++mNodeCounter);

if (0 == mpHead) // chk for empty queue
mpHead = mpTail = pQI;
else
{
// link new item onto tail of list using mpTail pointer
...
}
}

The removeItem() method removes the head QueueItem from the queue, and should release the memory using the C++ delete operator. It updates mpHead to point at the following item (if any) as the new head. If the list becomes empty, both mpHead and mpTail must be set to null (0). It does not change the value of mNodeCounter (which is always incremented when a new item is added). If called on an empty Queue, it does nothing.

The erase() method removes all the items in the queue and should release the memory. To implement, you could loop calling removeItem() until the queue is empty.

The Queue destructor should ensure that all items are removed from the queue. The easiest way is to call the erase() method from the destructor.
The user code (main) never see's QueueItem objects, since they are used only for implementation inside of class Queue. main() has only the Queue object to work with. For example, the following code would create a queue with three elements, and then print it out:



-------------------------------------------------------------------------------
my Program:

//QueueItem.h
//Declaration of class QueueItem


#ifndef QUEUEITEM_H
#define QUEUEITEM_H



class QueueItem
{
public:
QueueItem(char *pData, int id); // constructor
void setNext(QueueItem *pItem); //set pointer to next Item
QueueItem* getNext(); //get pointer to next Item
int getId(); //get Id
const char* getData(); //get data member

private:
char mData[30]; // or, use a char* if you want to dynamically alloc memory
int mNodeID;
QueueItem *mpNext; // pointer to another object of same type
};//end class QueueItem

#endif
------
//Queue.h
//Declaration of class Queue

//prevent multiple inclusions of header file
#ifndef QUEUE_H
#define QUEUE_H

#include "QueueItem.h" // include definitions of class QueueItem from QueueItem.h

class Queue
{
public:
Queue(); // constructor
~Queue(); // destructor
void addItem(char *pData);
void removeItem();
void eraseList();
void printList();

private:
QueueItem *mpHead; // always points to first QueueItem in the list
QueueItem *mpTail; // always points to the last QueueItem in the list
int mNodeCounter; // always increasing for a unique id to assign to each new QueueItem
};//end class Queue
#endif
-----------
//member function definitions for class QueueItem

#include <iostream> // allows program to output data
using namespace std;

#include <string>

#include "QueueItem.h" // include definition of class QueueItem from QueueItem.h

//QueueItem constructor
QueueItem::QueueItem(char *pData, int id)
{
pData = mData;
id = mNodeID;
mpNext = NULL;

}// end constructor

void QueueItem::setNext(QueueItem *pItem)
{
mpNext = pItem;
}// end setNext function


QueueItem* QueueItem::getNext()
{
return mpNext;
}//end getNext function

int QueueItem::getId()
{
return mNodeID;
}//end getId function

const char* QueueItem::getData()
{
return mData;
}//end getData function
--------------
//member function definitions for class Date
#include <iostream> //allows program to output data on screen
using std::cout;
using std::endl;
using namespace std;

#include <iomanip>
using std::setfill;
using std::setw;

#include <string>
using std::string;
using std::strcpy;

#include "Queue.h" //include definition of class Queue from Queue.h



//constructor
Queue::Queue()
{
mpHead = NULL;
mpTail = NULL;
mNodeCounter = 0;
}

void Queue::addItem(char *pData)
{
//create and initialize new QueueItem dynamically
QueueItem *pQI = new QueueItem(pData, ++mNodeCounter);

if ( mpHead == 0 ){ //check for empty queue
mpHead = mpTail = pQI;}

else{
// link new item onto tail of list using mpTail pointer

mpTail->setNext(pQI);
mpTail = pQI;

}

}//end addItem function

//function removeItem
void Queue::removeItem()
{
if(mpHead == NULL){
mpHead = mpTail;}
else{
delete mpHead;
mpHead = mpHead->getNext();}



}//end removeItem function

//Erase List
void Queue::eraseList()
{
while (mpHead != 0)
removeItem();
mpHead = mpTail = 0;
}//end eraseList function

//prints contents of queue
void Queue::printList()
{
while (mpHead != 0){
cout << mpHead->getData() << endl;
mpHead = mpHead->getNext();
cout << mNodeCounter << endl;}
}//end printList function

//destructor
Queue::~Queue()
{
eraseList();
}
---------------------------------------

What is wrong with my program??? it only prints 00000s. can somebody help me?
|
Last edited by LuciWiz : 02-Apr-2009 at 02:35. Reason: Please insert your C++ code between [cpp] & [/cpp] tags
  #2  
Old 02-Apr-2009, 08:22
fakepoo fakepoo is offline
Regular Member
 
Join Date: Oct 2007
Posts: 713
fakepoo is a jewel in the roughfakepoo is a jewel in the roughfakepoo is a jewel in the rough

Re: Help with FIFO QUEUE


The first thing I saw that stood out to me was:
CPP / C++ / C Code:
//QueueItem constructor
QueueItem::QueueItem(char *pData, int id)
{
// set the internal variables to the parameters, not vice versa
//pData = mData; 
//id = mNodeID;
mData = pData;
mNodeID = id;
mpNext = NULL;

}// end constructor
  #3  
Old 02-Apr-2009, 16:15
ghost305 ghost305 is offline
New Member
 
Join Date: Apr 2009
Posts: 3
ghost305 is on a distinguished road

Re: Help with FIFO QUEUE


Quote:
Originally Posted by fakepoo
The first thing I saw that stood out to me was:
CPP / C++ / C Code:
//QueueItem constructor
QueueItem::QueueItem(char *pData, int id)
{
// set the internal variables to the parameters, not vice versa
//pData = mData; 
//id = mNodeID;
mData = pData;
mNodeID = id;
mpNext = NULL;

}// end constructor
I did that but got an error because mData is fixed size and not a pointer. So i changed it to
Code:
strncpy(mData, pData, 30); mNodeId = id; mpNext = NULL

can you tell me how to fix the printlist() and the removeItem() functions?
  #4  
Old 03-Apr-2009, 00:57
Kimmo Kimmo is offline
Member
 
Join Date: Mar 2007
Location: Finland
Posts: 285
Kimmo is a jewel in the roughKimmo is a jewel in the roughKimmo is a jewel in the rough

Re: Help with FIFO QUEUE


Why don't you post a complete working program which clearly demonstrates the behavior you have described? Arrange your code inside [c++] tags as you have arranged your code in files so we can just easily copy-paste and compile (well, at least I like to compile stuff I see here). That is, if you have main.cpp, then post the code from main.cpp inside one pair of [c++] tags, if you have queue.h, then post that inside another pair etc.

After all, you are the one wanting answers, so it makes sense to make giving answers as easy as possible, right.
  #5  
Old 03-Apr-2009, 18:56
ghost305 ghost305 is offline
New Member
 
Join Date: Apr 2009
Posts: 3
ghost305 is on a distinguished road

Re: Help with FIFO QUEUE


Quote:
Originally Posted by Kimmo
Why don't you post a complete working program which clearly demonstrates the behavior you have described? Arrange your code inside [c++] tags as you have arranged your code in files so we can just easily copy-paste and compile (well, at least I like to compile stuff I see here). That is, if you have main.cpp, then post the code from main.cpp inside one pair of [c++] tags, if you have queue.h, then post that inside another pair etc.

After all, you are the one wanting answers, so it makes sense to make giving answers as easy as possible, right.
I got it work, my problem was with the print list. And that i was focusing the mpHead when that was the pointer that was going to be deleted. I should of used a temporary pointer.
 
 

Recent GIDBlogProblems with the Navy (Chiefs) by crystalattice

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Circular Linked Queue Copy Constructor and Assignment Operator Not Working? wc3promet C++ Forum 1 06-Oct-2008 04:00
sorting krazykrisi C++ Forum 10 26-Jan-2007 16:07
External queue struct from queue.c micmac700 C++ Forum 0 22-Sep-2006 07:53
Template Queue File using link list reliops14 C++ Forum 3 03-May-2005 20:39
Question about linked list and queue Kay Chan C++ Forum 7 02-Sep-2004 10:27

Network Sites: GIDNetwork · GIDWebHosts · GIDSearch · Learning Journal by J de Silva, The

All times are GMT -6. The time now is 14:17.


vBulletin, Copyright © 2000 - 2009, Jelsoft Enterprises Ltd.