May 02, 2024, 04:31:09 PM

News:

Own IWBasic 2.x ? -----> Get your free upgrade to 3.x now.........


UDT / Custom Linked List Problem

Started by LarryMc, May 26, 2009, 07:01:40 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

LarryMc

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
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

LarryMc

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
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library

LarryMc

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
LarryMc
Larry McCaughn :)
Author of IWB+, Custom Button Designer library, Custom Chart Designer library, Snippet Manager, IWGrid control library, LM_Image control library