不使用面向对象的程序创建有序列表的链表

问题描述 投票:0回答:1

以下代码从主函数传递时应该输出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

vb.net linked-list record
1个回答
1
投票

我认为,如果您解决了无休止的循环,一切都会好起来的。

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
© www.soinside.com 2019 - 2024. All rights reserved.