以下代码从主函数传递时应该输出6 4 3作为3 4 6。我需要使用以下标识符的解决方案。我找到了替代的面向对象的解决方案,但我不能使用null。当我尝试提出这些概念时,我无法使用以下所有标识符。我之所以专注于以下代码,是因为在A级计算机科学书籍中以伪代码形式提供了此解决方案。我不了解标识符的必要性,例如startpointer
Dim nullPointer As Integer = -1
'nullpointer should be set to -1 if using array element with index 0
Public Structure ListNode
Public Data As Integer
Public Pointer As Integer
End Structure
'declare record type to store data and pointer
Dim StartPointer As Integer
Dim FreeListPtr As Integer
Dim List(6) As ListNode
Dim newItem As Integer
Dim NewNodePtr As Integer
Dim ThisNodePtr As Integer
Dim previousNodePtr As Integer
Sub InitialiseList()
StartPointer = nullPointer 'set start pointer
FreeListPtr = 1 'set starting position of free list
For index As Integer = 0 To 5 'link all nodes to make free list
List(index).Pointer = index + 1
Next
List(6).Pointer = nullPointer 'last node of free list
End Sub
Sub InsertNode(ByVal newItem)
StartPointer = 0
If FreeListPtr <> nullPointer Then 'there is space in the array
'take node from free list and store data item
NewNodePtr = FreeListPtr
List(NewNodePtr).Data = newItem
FreeListPtr = List(FreeListPtr).Pointer 'find insertion point
ThisNodePtr = StartPointer 'start at beginning of list
While ThisNodePtr <> nullPointer And List(ThisNodePtr).Data < newItem
'while not end ofl list
previousNodePtr = ThisNodePtr 'remember this node follow the pointer to the next node
ThisNodePtr = List(ThisNodePtr).Pointer
End While
If previousNodePtr = StartPointer Then 'insert new node at start of list
List(NewNodePtr).Pointer = StartPointer
StartPointer = NewNodePtr
Else 'insert new node between previous node and this node
List(NewNodePtr).Pointer = List(previousNodePtr).Pointer
List(previousNodePtr).Pointer = NewNodePtr
End If
End If
End Sub
我执行代码后,在while语句上借助断点查看代码如何运行。在函数的第三次执行时循环无限循环。
Dim currentnodeptr As Integer
Sub OutputAllNodes()
StartPointer = 0
currentnodeptr = StartPointer
While currentnodeptr <> nullPointer
console.writeline(list(currentnodeptr).data)
currentnodeptr = List(currentnodeptr).Pointer
currentnodeptr = currentnodeptr + 1
End While
End Sub
startpointer必须为0,否则由于nullpointer为-1而出现问题,它将触发indexoutofbound的错误
Sub Main()
InitialiseList()
InsertNode(6)
InsertNode(4)
InsertNode(3)
OutputAllNodes()
End Sub
我在无限时间内获得的输出为0和6
我认为,如果您解决了无休止的循环,一切都会好起来的。
Sub OutputAllNodes()
StartPointer = 0
currentnodeptr = StartPointer
'While currentnodeptr <> nullPointer
' Console.WriteLine(List(currentnodeptr).Data)
' currentnodeptr = List(currentnodeptr).Pointer
' currentnodeptr = currentnodeptr + 1
'End While
For Each item In List
Console.WriteLine($"Data {item.Data}, Pointer {item.Pointer}")
Next
End Sub
在InsertNode Sub中,删除以下内容
'If previousNodePtr = StartPointer Then 'insert new node at start of list
' 'List(NewNodePtr).Pointer = StartPointer 'Don't reset the pointer
' StartPointer = NewNodePtr
'Else 'insert new node between previous node and this node
' List(NewNodePtr).Pointer = List(previousNodePtr).Pointer
' List(previousNodePtr).Pointer = NewNodePtr
'End If
我的输出
Data 0, Pointer 1
Data 6, Pointer 2
Data 4, Pointer 3
Data 3, Pointer 4
Data 0, Pointer 5
Data 0, Pointer 6
Data 0, Pointer -1
编辑
Public Structure ListNode
Public Data As Integer
Public Pointer As Integer
End Structure
Private CurrentIndex As Integer
Private NodeList(6) As ListNode 'Seven elements in the array
Sub Main()
InitialiseList()
InsertNode(6)
InsertNode(4)
InsertNode(3)
OutputAllNodes()
End Sub
Private Sub InsertNode(input As Integer)
NodeList(CurrentIndex).Data = input
CurrentIndex += 1
End Sub
Sub InitialiseList()
For index As Integer = 0 To 5 'link all nodes to make free list
NodeList(index).Pointer = index + 1
Next
NodeList(6).Pointer = -1 'last node of free list
End Sub
Sub OutputAllNodes()
For Each item In NodeList
Console.WriteLine($"Data {item.Data}, Pointer {item.Pointer}")
Next
End Sub
输出
Data 6, Pointer 1
Data 4, Pointer 2
Data 3, Pointer 3
Data 0, Pointer 4
Data 0, Pointer 5
Data 0, Pointer 6
Data 0, Pointer -1