Have a sample program using my LinkedList class (LList) found in the User Offering section.
The list uses a user define UDT consisting of an int and a double.
It reads in 11 sets of values into a list and then sorts with the 2nd list by the integer value.
That part works great.
Then tries to sort 1st list into 2nd list using the double value; using the same subroutine.
3 of the 11 sets disappear from the 2nd list
If you run the program in debug mode you will see that the 3 missing values get added to the 2nd list but during subsequent operations magically disappear.
I've gone through the code and can't see what's wrong.
Basically it works right sorting with an INT and not with a DOUBLE.
Could really use some smart eyeballs to look it over.
This is the test program:$use "LList.lib"
$include "LList.inc"
$main
AUTODEFINE "off"
OPENCONSOLE
TYPE HUDT
INT ATab
double WinSort
ENDTYPE
LList OrgList, NewList
PRINT "Add Runners..."
AddRunner()
PRINT "Sort By TAB..."
SortBy(0)
PRINT "Print New List TAB Order..."
PrintNewList()
PRINT "Sort By Odds..."
SortBy(1)
PRINT "Print New List Odds Order..."
PrintNewList()
PRINT
print " Any key to end"
do:until inkey$<>""
CLOSECONSOLE
end
SUB SortBy(typ:int)
INT EOLL, x
int count = 0
int newcount = 0
NewList.ClearAll()
NewList.Create()
' get the data from the OrgList original linked list
OrgList.GetFirst()
count = OrgList.Count()
'iterate through the OrgList
For x = 1 to count
' find out the count in the NewList
newcount = NewList.Count()
IF newcount > 0 THEN NewList.GetFirst()
EOLL = 1
' while EOLL > 0 means we still have items to process
WHILE EOLL > 0
' IF newcount > 0 means there are items in the NewList
IF(newcount > 0)
NewList.ReadData()
' Check if the OrgList (Org LList) ATab value is > than the current NewList.ATab value
int comp=0
if typ = 0
if (OrgList.#<HUDT>m_pCurData.ATab > NewList.#<HUDT>m_pCurData.ATab) then comp=1
else
if (OrgList.#<HUDT>m_pCurData.WinSort > NewList.#<HUDT>m_pCurData.WinSort) then comp=1
endif
IF comp=1
' orgList ATab is Greater - test for next to see if it is also greater
IF EOLL < newcount
NewList.GetNext()
EOLL++
ELSE
' no more items in the NewList - so add here
If NewList.AddAfter(NEW(HUDT,1))=0
NewList.#<HUDT>m_pCurData = OrgList.#<HUDT>m_pCurData
ENDIF
EOLL = 0
ENDIF
ELSE
' OrgList NOT greater so need to AddBefore here
If NewList.AddBefore(NEW(HUDT,1))=0
NewList.#<HUDT>m_pCurData = OrgList.#<HUDT>m_pCurData
ENDIF
EOLL = 0
ENDIF
ELSE
' no items in the NewList - so add here
If NewList.AddEnd(NEW(HUDT,1))=0
NewList.#<HUDT>m_pCurData = OrgList.#<HUDT>m_pCurData
ENDIF
EOLL = 0
ENDIF
ENDWHILE
' move to next (OrgList) OrgList
OrgList.GetNext()
NEXT x
ENDSUB
SUB AddRunner()
int x = 0
double adbl = 0.00
RESTORE TWinSort
'clear out the entire list
OrgList.ClearAll(TRUE)
' create new list for original input
OrgList.Create()
for x = 1 to 11
OrgList.AddEnd(NEW(HUDT,1))
OrgList.#<HUDT>m_pCurData.ATab = 12-x
GETDATA TWinSort, adbl
OrgList.#<HUDT>m_pCurData.WinSort = adbl
next x
ENDSUB
SUB PrintNewList
int x = 1
int count
count = NewList.Count()
NewList.GetFirst()
FOR x = 1 TO count
PRINT NewList.#<HUDT>m_pCurData.ATab
PRINT LTRIM$(STR$(NewList.#<HUDT>m_pCurData.WinSort))
PRINT "-----------------------------------"
NewList.GetNext()
NEXT x
PRINT
ENDSUB
SUB ShowNewList
int x = 1
int count
count = NewList.Count()
NewList.GetFirst()
FOR x = 1 TO count
PRINT NewList.#<HUDT>m_pCurData.ATab, STR$(NewList.#<HUDT>m_pCurData.WinSort)
PRINT "-----------------------------------"
NewList.GetNext()
NEXT x
PRINT
ENDSUB
DATABEGIN TWinSort
DATA 6.00, 13.20, 1.90, 5.90, 999.00, 19.20, 12.20, 50.20, 24.50, 999.00, 17.60
DATAEND
The following are the salient methods from my LList class:
sub LList::LList() :'the class constructor
ErrMsgs[0]= "OK"
ErrMsgs[1]= "list already created"
ErrMsgs[2]= "could not allocate memory for new list"
ErrMsgs[3]= "could not remove; no list exists"
ErrMsgs[4]= "list is empty; nothing to delete"
ErrMsgs[5]= "list is empty"
ErrMsgs[6]= "already at beginning of list"
ErrMsgs[7]= "already at end of list"
ErrMsgs[8]= "list does not exist; create list first"
m_pStart = NULL
m_pCurPos = NULL
m_pCurData = null
m_error_msg=""
m_iErrCode=0
return
endsub
sub LList::_LList() :'the class destructor
ClearAll(TRUE)
return
endsub
SUB LList::Create(),INT
m_iErrCode=0
m_pCurData = 0
if m_pStart <> NULL
m_iErrCode = 1
return m_iErrCode
endif
m_pStart = NEW(LINKEDLIST,1)
if m_pStart = NULL
m_iErrCode = 2
return m_iErrCode
endif
#<LINKEDLIST>m_pStart.pNext = 0
return m_iErrCode
ENDSUB
SUB LList::ClearAll(OPT DeleteData=0 as INT),INT
pointer temp
m_iErrCode=0
m_pCurData = 0
if(m_pStart <> 0)
while #<LINKEDLIST>m_pStart.pNext <> 0
temp = m_pStart
m_pStart = #<LINKEDLIST>m_pStart.pNext
IF DeleteData & (#<LINKEDLIST>temp.pData <> NULL)
delete #<LINKEDLIST>temp.pData
ENDIF
delete temp
endwhile
IF DeleteData & (#<LINKEDLIST>m_pStart.pData <> NULL)
delete #<LINKEDLIST>m_pStart.pData
ENDIF
delete m_pStart
m_pStart = NULL /* added in v1.2 */
m_pCurPos = NULL /* added in v1.2 */
else
m_iErrCode = 8
endif
RETURN m_iErrCode
ENDSUB
SUB LList::AddEnd(pData as POINTER),INT
m_iErrCode=0
m_pCurData = 0
POINTER pTemp
IF m_pStart <> 0
pTemp = m_pStart
WHILE #<LINKEDLIST>pTemp.pNext <> 0
pTemp = #<LINKEDLIST>pTemp.pNext
ENDWHILE
#<LINKEDLIST>pTemp.pNext = NEW(LINKEDLIST,1)
m_pCurPos = #<LINKEDLIST>pTemp.pNext
#<LINKEDLIST>pTemp.#<LINKEDLIST>pNext.pPrev = pTemp
pTemp = #<LINKEDLIST>pTemp.pNext
#<LINKEDLIST>pTemp.pNext=0
#<LINKEDLIST>pTemp.pData = pData
m_pCurData = pData
else
m_iErrCode = 8
ENDIF
return m_iErrCode
ENDSUB
SUB LList::AddHead(pData as POINTER),INT
m_iErrCode=0
m_pCurData = 0
POINTER pTemp
IF m_pStart <> 0
pTemp = #<LINKEDLIST>m_pStart.pNext
#<LINKEDLIST>m_pStart.pNext = NEW(LINKEDLIST,1)
m_pCurPos = #<LINKEDLIST>m_pStart.pNext
IF pTemp <> NULL
#<LINKEDLIST>m_pStart.#<LINKEDLIST>pNext.pNext = pTemp
#<LINKEDLIST>pTemp.pPrev = #<LINKEDLIST>m_pStart.pNext
ENDIF
#<LINKEDLIST>m_pStart.#<LINKEDLIST>pNext.pPrev = m_pStart
#<LINKEDLIST>m_pStart.#<LINKEDLIST>pNext.pData = pData
m_pCurData = pData
else
m_iErrCode = 8
ENDIF
RETURN m_iErrCode
ENDSUB
SUB LList::AddAfter(pData as POINTER),INT
POINTER pNext, pTemp, pReturn
pReturn = NULL
m_iErrCode=0
m_pCurData = 0
if m_pStart <> 0
if m_pCurPos <> 0
if #<LINKEDLIST>m_pCurPos.pNext = 0
m_iErrCode = AddEnd(pData)
#<LINKEDLIST>m_pCurPos.pData = m_pCurData
m_pCurData = m_pCurData
else
pNext = #<LINKEDLIST>m_pCurPos.pNext
pTemp = NEW(LINKEDLIST,1)
#<LINKEDLIST>pTemp.pNext = pNext
#<LINKEDLIST>m_pCurPos.pNext = pTemp
#<LINKEDLIST>m_pCurPos.#<LINKEDLIST>pNext.pPrev = pTemp
#<LINKEDLIST>pTemp.pPrev = m_pCurPos
m_pCurPos = pTemp
#<LINKEDLIST>m_pCurPos.pData = pData
m_pCurData = pData
endif
else
m_iErrCode = AddEnd(pData)
#<LINKEDLIST>m_pCurPos.pData = m_pCurData
m_pCurData = m_pCurData
endif
else
m_iErrCode = 8
endif
return m_iErrCode
endsub
SUB LList::AddBefore(pData as POINTER),INT
POINTER pPrev, pTemp, pReturn
pReturn = NULL
m_iErrCode=0
m_pCurData = 0
if m_pStart <> 0
if m_pCurPos=0
m_iErrCode = AddHead(pData)
#<LINKEDLIST>m_pCurPos.pData = m_pCurData
m_pCurData = m_pCurData
else
if #<LINKEDLIST>m_pCurPos.pPrev = m_pStart
m_iErrCode = AddHead(pData)
#<LINKEDLIST>m_pCurPos.pData = m_pCurData
m_pCurData = m_pCurData
else
pPrev = #<LINKEDLIST>m_pCurPos.pPrev
pTemp = NEW(LINKEDLIST,1)
#<LINKEDLIST>pTemp.pPrev = pPrev
#<LINKEDLIST>m_pCurPos.#<LINKEDLIST>pPrev.pNext = pTemp
#<LINKEDLIST>pTemp.pNext = m_pCurPos
m_pCurPos = pTemp
#<LINKEDLIST>m_pCurPos.pData = pData
m_pCurData = pData
endif
endif
else
m_iErrCode = 8
endif
RETURN m_iErrCode
ENDSUB
Larry
I believe I've found my problem.
I've got some testing to do and if successful I will be posting an updated .lib.
Larry
Problem was totally within AddBefore method.
This line of code was missing: #<LINKEDLIST>m_pCurPos.pPrev = pTemp
download latest version of LList class with fix at:
http://www.ionicwind.com/forums/index.php/topic,2613.msg22185.html#msg22185
Larry