Лабораторная работа №4
Востропятов Н. А.
Вар №9
Очередь на основе линейного однонаправленного списка с указателями на начало и конец очереди.
#include <stdio.h>
#include <conio.h>
#include <math.h>
class Object
{
public:
Object(void) { m_pNext = NULL; data = 0; }
Object(int value) { m_pNext = NULL; data = value; }
Object(Object &src) { m_pNext = NULL; data = src.data; }
~Object(void) { m_pNext = NULL; data = 0; }
int GetData(void) { return data; }
void SetData(int value) { data = value; }
inline Object operator=(const Object &a) { data = a.data; return data; }
Object *m_pNext;
private:
int data;
};
class Queue
{
public:
Queue() { m_pFirstObject = NULL; m_pLastObject = NULL; }
~Queue() { RemoveAllObjects(); };
void AddObject(Object *pObject);
void RemoveObject(Object *pObject);
void RemoveAllObjects(void);
void PrintObjects(void);
Object *FindObjectByValue(int value);
private:
Object *m_pFirstObject;
Object *m_pLastObject;
};
void Queue::AddObject(Object *pObject)
{
if (pObject)
{
printf("Queue: adding object: %d\n", pObject->GetData());
if (m_pFirstObject)
{
if (m_pLastObject)
m_pLastObject->m_pNext = pObject;
m_pLastObject = pObject;
if (!m_pFirstObject->m_pNext)
m_pFirstObject->m_pNext = m_pLastObject;
}
else
m_pFirstObject = pObject;
}
}
void Queue::RemoveObject(Object *pObject)
{
Object *pObj = m_pFirstObject;
Object *pLast = NULL;
while (pObj)
{
if (pObj == pObject)
{
if (pLast)
{
pLast->m_pNext = pObj->m_pNext;
delete pObj;
pObj = pLast->m_pNext;
}
else
{
m_pFirstObject = pObj->m_pNext;
delete pObj;
pObj = m_pFirstObject;
}
}
else
{
pLast = pObj;
pObj = pObj->m_pNext;
}
}
}
void Queue::RemoveAllObjects(void)
{
printf("Queue: removing all objects\n");
Object *pObj = m_pFirstObject;
Object *pNext = NULL;
while (pObj)
{
pNext = pObj->m_pNext;
printf("Queue: deleting object: %d\n", pObj->GetData());
delete pObj;
pObj = pNext;
}
m_pFirstObject = NULL;
}
void Queue::PrintObjects(void)
{
Object *pObj = m_pFirstObject;
int i=0;
while (pObj)
{
printf("Object %d: value %d\n", i, pObj->GetData());
pObj = pObj->m_pNext;
i++;
}
}
Object *Queue::FindObjectByValue(int value)
{
Object *pObj = m_pFirstObject;
while (pObj)
{
if (pObj->GetData() == value)
return pObj;
pObj = pObj->m_pNext;
}
return NULL;
}
void main()
{
Object *pObj = NULL;
Queue q;
for (int i=1; i < 10; i++)
{
pObj = new Object(20*i);
q.AddObject(pObj);
pObj = NULL;
}
q.PrintObjects();
int a = 0;
printf("Enter search value: ");
scanf("%d", &a);
pObj = q.FindObjectByValue(a);
if (pObj)
printf("Found!\n");
getch();
}
