Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / 03

.cpp
Скачиваний:
24
Добавлен:
30.04.2013
Размер:
4.09 Кб
Скачать
#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();
}
Соседние файлы в папке Лабы