首页 > 解决方案 > 在不使用面向对象编程的情况下创建有序列表的链表

问题描述

当从 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

标签: vb.netlinked-listrecord

解决方案


我想如果你修复你的无限循环,一切都会好起来的。

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

推荐阅读