Добавил:
Diryabuh
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 03
.cpp#include <stdio.h>
#include <conio.h>
#include <math.h>
class Object
{
public:
Object(void) { m_pPrev = NULL; m_pNext = NULL; data = 0; }
Object(int value) { m_pPrev = NULL; m_pNext = NULL; data = value; }
Object(Object &src) { m_pPrev = NULL; m_pNext = NULL; data = src.data; }
~Object(void) { m_pPrev = NULL; 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_pPrev;
Object *m_pNext;
private:
int data;
};
class ObjectManager
{
public:
ObjectManager() { m_pFirstObject = NULL; }
~ObjectManager() { RemoveAllObjects(); };
void AddObject(Object *pObject);
void RemoveObject(Object *pObject);
void RemoveAllObjects(void);
void PrintObjects(void);
void SortObjects(void);
Object *FindObjectByValue(int value);
private:
Object *m_pFirstObject;
};
void ObjectManager::AddObject(Object *pObject)
{
if (pObject)
{
printf("ObjectManager: adding object: %d\n", pObject->GetData());
if (m_pFirstObject)
{
m_pFirstObject->m_pPrev = pObject;// mark this new object as a previous for current first object
pObject->m_pNext = m_pFirstObject;// connect current first object to this object
pObject->m_pPrev = NULL;
}
m_pFirstObject = pObject;
}
}
void ObjectManager::RemoveObject(Object *pObject)
{
Object *pObj = m_pFirstObject;
while (pObj)
{
if (pObj == pObject)// found
{
if (pObj->m_pPrev)
{
pObj->m_pPrev->m_pNext = pObj->m_pNext;
pObj->m_pNext->m_pPrev = pObj->m_pPrev;
}
else// pObj have no m_pPrev, so this is the first object in chain
{
m_pFirstObject = pObj->m_pNext;
}
delete pObj;
pObj = NULL;
return;
}
else
pObj = pObj->m_pNext;
}
}
void ObjectManager::RemoveAllObjects(void)
{
printf("ObjectManager: removing all objects\n");
Object *pObj = m_pFirstObject;
Object *pNext = NULL;
while (pObj)
{
pNext = pObj->m_pNext;
printf("ObjectManager: deleting object: %d\n", pObj->GetData());
delete pObj;
pObj = pNext;
}
m_pFirstObject = NULL;
}
void ObjectManager::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++;
}
}
void ObjectManager::SortObjects(void)
{
if (!m_pFirstObject || !m_pFirstObject->m_pNext)
return;
Object *pObj = m_pFirstObject;//->m_pNext;
while (pObj)
{
if (pObj->m_pPrev && (pObj->GetData() < pObj->m_pPrev->GetData()))
{
/* int tmp = pObj->m_pPrev->GetData();
pObj->m_pPrev->SetData(pObj->GetData());
pObj->SetData(tmp);
*/
// swap start
Object *o1 = pObj->m_pPrev->m_pPrev;
Object *o2 = pObj->m_pPrev;
Object *n = pObj->m_pNext;
if (o1)
o1->m_pNext = pObj;
pObj->m_pPrev = o1;
pObj->m_pNext = o2;
o2->m_pPrev = pObj;
o2->m_pNext = n;
n->m_pPrev = o2;
// swap end
// swap start
/* Object *o1 = pObj->m_pPrev->m_pPrev;
Object *o2 = pObj->m_pPrev;
if (o1)
o1->m_pNext = pObj;
o2->m_pPrev = pObj;
o2->m_pNext = pObj->m_pNext;
if (pObj->m_pNext)
pObj->m_pNext->m_pPrev = o2;
pObj->m_pPrev = o1;
pObj->m_pNext = o2;*/
// swap end
pObj = pObj->m_pPrev;// move back
}
else
pObj = pObj->m_pNext;
}
}
Object *ObjectManager::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;
ObjectManager mgr;
for (int i=8; i > 0; i--)
{
pObj = new Object(10*i);
mgr.AddObject(pObj);
pObj = NULL;
}
mgr.PrintObjects();
int a = 0;
printf("Enter value to search: ");
scanf("%d", &a);
pObj = mgr.FindObjectByValue(a);
if (pObj)
printf("Found!\n");
mgr.SortObjects();
printf("Sorted:\n");
mgr.PrintObjects();
getch();
}
Соседние файлы в папке Лабы
