vb.net - 在不使用面向对象编程的情况下创建有序列表的链表
问题描述
当从 main 函数传递时,以下代码应该将 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 rem 中取出以下内容
'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
推荐阅读
- google-app-maker - 如何使用 onBeforeSave 事件跟踪记录的关系值何时发生变化?
- unit-testing - Flutter:单元测试
- jenkins - Jenkins - 从节点查看实时 html 文件
- jquery - TypeError i 在 jquery.min.js 中为空
- android - 如何以编程方式从另一个应用程序 android 打开 Google 设置的下载语言
- reactjs - React Leaflet onClick outside
- apache-flink - 使用 StreamingFileSink 将 Avro 记录写入 HDFS
- python - 如何使用 Python 使用 pynput 以管理员身份打开 Windows PowerShell
- php - MySql PHP中的多次插入
- android - 资源“XX”(7f07005e)不是可绘制对象(颜色或路径):TypedValue{t=0x1/d=0x7f07005e a=-1 r=0x7f07005e}