Original Post
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
template<class TYPE> class TDoubleLinkedList;
template<class TYPE> class TDoubleLinkedListMember;
template<class TYPE> class TDoubleLinkedListItterator;
template<class TYPE>
class TDoubleLinkedListMember
{
template<class TYPE>
friend class TDoubleLinkedList;
template<class TYPE>
friend class TDoubleLinkedListItterator;
TDoubleLinkedList<TYPE> *m_pList;
TYPE *m_pPrevMember;
TYPE *m_pNextMember;
public:
TDoubleLinkedListMember()
: m_pList(NULL), m_pPrevMember(NULL), m_pNextMember(NULL)
{}
~TDoubleLinkedListMember()
{
if(m_pList)
m_pList->Unlink(this);
}
};
template<class TYPE>
class TDoubleLinkedListItterator
{
template<class TYPE>
friend class TDoubleLinkedList;
TDoubleLinkedList<TYPE> *m_pList;
TYPE *m_pCurrentMember;
TDoubleLinkedListItterator(TDoubleLinkedList<TYPE> *_pList)
: m_pList(_pList), m_pCurrentMember(_pList->m_pFirstMember)
{}
public:
TYPE* operator ->() { return m_pCurrentMember; }
operator TYPE*() { return m_pCurrentMember; }
TYPE* operator++() { m_pCurrentMember = m_pCurrentMember->m_pNextMember; return m_pCurrentMember; }
TYPE* operator--() { m_pCurrentMember = m_pCurrentMember->m_pPrevMember; return m_pCurrentMember; }
void Rewind()
{
m_pCurrentMember = m_pList->m_pFirstMember;
}
int Valid()
{
return m_pCurrentMember->m_pNextMember
!=m_pList->m_pFirstMember;
}
};
template<class TYPE>
class TDoubleLinkedList
{
template<class TYPE>
friend class TDoubleLinkedListItterator;
TYPE *m_pFirstMember;
TYPE *m_pLastMember;
int m_size;
public:
TDoubleLinkedList()
:m_pFirstMember(NULL), m_pLastMember(NULL), m_size(0)
{}
int Size()
{
return m_size;
}
// Lägger till i början av listan
void Add(TYPE *_pObject)
{
LinkLast(_pObject);
m_size++;
}
void LinkLast(TYPE *_pObject)
{
if(!_pObject)
return;
if(m_pFirstMember)
{
m_pLastMember->m_pNextMember = _pObject;
_pObject->m_pPrevMember = m_pLastMember;
m_pLastMember = _pObject;
_pObject->m_pNextMember = m_pFirstMember;
m_pFirstMember->m_pPrevMember = m_pLastMember;
}
else // ingen nod
{
m_pLastMember = _pObject;
m_pFirstMember = _pObject;
// Ny nod, därför cirkulär med sig själv.
_pObject->m_pNextMember = _pObject;
_pObject->m_pPrevMember = _pObject;
}
_pObject->m_pList = this;
}
void Unlink(TDoubleLinkedListMember<TYPE> *_pObject)
{
if(!_pObject)
return;
if(!_pObject->m_pList)
return;
if(_pObject->m_pPrevMember)
_pObject->m_pPrevMember->m_pNextMember = _pObject->m_pNextMember;
else
m_pFirstMember = _pObject->m_pNextMember;
if(_pObject->m_pNextMember)
_pObject->m_pNextMember->m_pPrevMember = _pObject->m_pPrevMember;
_pObject->m_pList = NULL;
_pObject->m_pPrevMember = NULL;
_pObject->m_pNextMember = NULL;
}
void DeleteAll()
{
while(m_pFirstMember)
delete m_pFirstMember;
}
void Swap(TYPE *_pObject1, TYPE *_pObject2)
{
if(!_pObject1 || !_pObject2 || _pObject1 == _pObject2)
return;
// Swapa pekare så det underlättar.
if(_pObject1->m_pPrevMember == _pObject2)
{
TYPE *pTempPtr = _pObject1;
_pObject1 = _pObject2;
_pObject2 = pTempPtr;
}
// byt next och prev pekarna
if(_pObject1->m_pNextMember == _pObject2)
{
TYPE *pTempPtr = _pObject1->m_pPrevMember;
_pObject1->m_pPrevMember = _pObject2;
_pObject1->m_pNextMember = _pObject2->m_pNextMember;
_pObject2->m_pNextMember = _pObject1;
_pObject2->m_pPrevMember = pTempPtr;
}
else
{
TYPE *pTempPtr = _pObject2->m_pNextMember;
_pObject2->m_pNextMember = _pObject1->m_pNextMember;
_pObject1->m_pNextMember = pTempPtr;
pTempPtr = _pObject2->m_pPrevMember;
_pObject2->m_pPrevMember = _pObject1->m_pPrevMember;
_pObject1->m_pPrevMember = pTempPtr;
}
if(_pObject1->m_pPrevMember)
_pObject1->m_pPrevMember->m_pNextMember = _pObject1;
else
m_pFirstMember = _pObject1;
if(_pObject1->m_pNextMember) _pObject1->m_pNextMember->m_pPrevMember = _pObject1;
if(_pObject2->m_pPrevMember)
_pObject2->m_pPrevMember->m_pNextMember = _pObject2;
else
m_pFirstMember = _pObject2;
if(_pObject2->m_pNextMember) _pObject2->m_pNextMember->m_pPrevMember = _pObject2;
}
TDoubleLinkedListItterator<TYPE> GetItterator() { return TDoubleLinkedListItterator<TYPE>(this); }
void BubbleSort(int (*_pfnCompare)(TYPE*,TYPE*), int Order=1)
{
if(Order != -1 && Order != 1) // check for correct order parameter
return;
int Done = 0;
while(!Done)
{
Done = 1;
for(CIntStorageIttr Ittr = g_List.GetItterator(); Ittr->m_pNextMember; ++Ittr)
{
if(_pfnCompare(Ittr, Ittr->m_pNextMember) == Order)
{
Swap(Ittr, Ittr->m_pNextMember);
Done = 0;
}
}
}
}
};
class CIntStorage : public TDoubleLinkedListMember<CIntStorage>
{
public:
int m_Value;
CIntStorage(int _Value)
:m_Value(_Value)
{}
static int NormalCompare(CIntStorage *_pObject1, CIntStorage *_pObject2)
{
if(_pObject1->m_Value < _pObject2->m_Value)
return 1;
if(_pObject1->m_Value > _pObject2->m_Value)
return -1;
return 0;
}
};
typedef TDoubleLinkedListItterator<CIntStorage> CIntStorageIttr;
int main()
{
TDoubleLinkedList<CIntStorage> list;
for(int i = 1; i < 6; i++)
list.Add(new CIntStorage(rand()));
for(CIntStorageIttr Ittr = list.GetItterator(); Ittr.Valid(); ++Ittr)
printf(">> %d\n", Ittr->m_Value);
list.BubbleSort(CIntStorage::NormalCompare);
CIntStorageIttr Ittr = list.GetItterator();
for(int i=0; i<list.Size(); i++)
{
std::cout << Ittr->m_Value << std::endl;
++Ittr;
}
}
Okey. The first problem is the Valid function. I use it to check if I should stop when I itterate through the list. Just want to go from the first node to the last one. But I just get from the first node to the one BEFORE the last node. So if there is 3 nodes, i will just get 2 nodes. The second problem is the BubbleSort algorithm. I have no ide why it doesn't work, I have tryed to just doing a for-loop and a fixed size of what it will sort. But it can't sort anything more then 3 nodes correctly. Please help me, it feels like I have tried forever.