You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET链表删除功能失效求助:无成功提示输出

VB.NET链表删除函数故障排查与修复

问题描述

我正在尝试创建一个链表,但删除数据的函数无法正常工作,执行删除操作后没有输出成功提示。当我向链表填充数据并尝试删除元素时,代码毫无反应,多次检查代码仍未找到问题,怀疑查找待删除节点指针的代码存在问题,因为始终无法看到删除成功的提示,期望删除函数能正常删除数据。

原代码

Imports System

Module Program
    Public Resp, Counter1, CurrentPointer, NextPointer, StartPointer, Counter, ReturnVal, PrevP As Integer
    Public SearchQ As String
    Structure DP
        Dim Data As String
        Dim Pointer As Integer
    End Structure
    Public LinkedL(10) As DP
    Sub Main(args As String())
        Call Initialise()

        Do
            Console.WriteLine("Select 1 to enter data")
            Console.WriteLine("Select 2 to delete data")
            Console.WriteLine("Select 3 to output data")
            Console.WriteLine("Select -1 to exit")
            Resp = Console.ReadLine
            If Resp = 1 Then
                Call EnterD()
            ElseIf Resp = 2 Then
                Call DeleteD()
            ElseIf Resp = 3 Then
                Call OutputD()
            ElseIf Resp = -1 Then
                Console.WriteLine("Goodbye")
                Exit Do
            End If
        Loop

    End Sub

    Sub Initialise()
        StartPointer = 0
        NextPointer = 0
        Counter1 = 1
        For Counter = 0 To 9
            LinkedL(Counter).Pointer = Counter1
            Counter1 = Counter1 + 1
        Next
        LinkedL(10).Pointer = -1
    End Sub

    Sub EnterD()
        If NextPointer = -1 Then
            Console.WriteLine("Linked list is full")
        Else
            CurrentPointer = NextPointer
            Console.WriteLine("Enter data")
            LinkedL(CurrentPointer).Data = Console.ReadLine()
            NextPointer = LinkedL(CurrentPointer).Pointer
            Console.WriteLine("Done")
        End If
    End Sub

    Sub DeleteD()
        Console.WriteLine("Enter data to delete")
        SearchQ = Console.ReadLine
        Counter = StartPointer
        ReturnVal = -1
        Do
            If LinkedL(Counter).Data = SearchQ Then
                ReturnVal = LinkedL(Counter).Pointer
                Exit Do
            End If
        Loop Until LinkedL(Counter).Pointer = -1
        If LinkedL(Counter).Pointer = -1 Then
            Console.WriteLine("Data to be deleted is not found")
        End If
        If ReturnVal <> -1 Then
            Counter = StartPointer
            Do
                If LinkedL(Counter).Pointer = ReturnVal Then
                    PrevP = Counter
                    LinkedL(PrevP).Pointer = LinkedL(ReturnVal).Pointer
                    LinkedL(ReturnVal).Pointer = -1
                End If
            Loop
            Console.WriteLine("Successfully deleted")
        End If
    End Sub

    Sub OutputD()
        Counter = 0
        Do
            Console.WriteLine(LinkedL(Counter).Data)
            Counter = LinkedL(Counter).Pointer
        Loop Until Counter = -1
    End Sub
End Module

问题分析

  1. 查找待删除节点逻辑错误:ReturnVal存储的是待删除节点的指针而非节点索引,导致后续查找前驱节点时匹配逻辑完全错误。
  2. 死循环问题:查找前驱节点的Do Loop没有终止条件,一旦进入就会无限循环,后续的成功提示永远无法执行。
  3. 未处理头节点删除场景:如果待删除的是链表的头节点(StartPointer指向的节点),原代码没有对应的处理逻辑,会直接跳过删除操作。
  4. 链表遍历逻辑缺失:查找待删除节点的循环中,未在每次迭代后移动到下一个节点,导致只能检查头节点,无法遍历整个链表。
  5. 输出函数起始点错误:OutputD固定从索引0开始遍历,会输出未被使用的空节点,且当头节点被删除后无法正确遍历有效链表。

修复后的代码

Imports System

Module Program
    Public Resp, Counter1, CurrentPointer, NextPointer, StartPointer, Counter, ReturnVal, PrevP As Integer
    Public SearchQ As String
    Structure DP
        Dim Data As String
        Dim Pointer As Integer
    End Structure
    Public LinkedL(10) As DP
    Sub Main(args As String())
        Call Initialise()

        Do
            Console.WriteLine("Select 1 to enter data")
            Console.WriteLine("Select 2 to delete data")
            Console.WriteLine("Select 3 to output data")
            Console.WriteLine("Select -1 to exit")
            ' 转换输入为整数,避免格式错误
            If Not Integer.TryParse(Console.ReadLine(), Resp) Then
                Console.WriteLine("请输入有效数字")
                Continue Do
            End If
            If Resp = 1 Then
                Call EnterD()
            ElseIf Resp = 2 Then
                Call DeleteD()
            ElseIf Resp = 3 Then
                Call OutputD()
            ElseIf Resp = -1 Then
                Console.WriteLine("Goodbye")
                Exit Do
            Else
                Console.WriteLine("无效选项,请重新输入")
            End If
        Loop

    End Sub

    Sub Initialise()
        StartPointer = 0
        NextPointer = 0
        Counter1 = 1
        For Counter = 0 To 9
            LinkedL(Counter).Pointer = Counter1
            Counter1 = Counter1 + 1
        Next
        LinkedL(10).Pointer = -1
        ' 初始化所有数据为空字符串
        For Counter = 0 To 10
            LinkedL(Counter).Data = ""
        Next
    End Sub

    Sub EnterD()
        If NextPointer = -1 Then
            Console.WriteLine("Linked list is full")
        Else
            CurrentPointer = NextPointer
            Console.WriteLine("Enter data")
            LinkedL(CurrentPointer).Data = Console.ReadLine()
            NextPointer = LinkedL(CurrentPointer).Pointer
            Console.WriteLine("Done")
        End If
    End Sub

    Sub DeleteD()
        Console.WriteLine("Enter data to delete")
        SearchQ = Console.ReadLine()
        Counter = StartPointer
        ReturnVal = -1

        ' 遍历链表查找待删除节点的索引
        Do
            If LinkedL(Counter).Data = SearchQ Then
                ReturnVal = Counter ' 存储待删除节点的索引
                Exit Do
            End If
            ' 移动到下一个节点
            Counter = LinkedL(Counter).Pointer
        Loop Until Counter = -1

        ' 未找到节点的情况
        If ReturnVal = -1 Then
            Console.WriteLine("Data to be deleted is not found")
            Return
        End If

        ' 处理头节点删除的情况
        If ReturnVal = StartPointer Then
            StartPointer = LinkedL(ReturnVal).Pointer
        Else
            ' 查找前驱节点
            Counter = StartPointer
            Do
                If LinkedL(Counter).Pointer = ReturnVal Then
                    PrevP = Counter
                    ' 更新前驱节点的指针,跳过待删除节点
                    LinkedL(PrevP).Pointer = LinkedL(ReturnVal).Pointer
                    Exit Do
                End If
                Counter = LinkedL(Counter).Pointer
            Loop Until Counter = -1
        End If

        ' 将删除的节点回收至空闲链表
        LinkedL(ReturnVal).Pointer = NextPointer
        NextPointer = ReturnVal
        ' 清空节点数据
        LinkedL(ReturnVal).Data = ""

        Console.WriteLine("Successfully deleted")
    End Sub

    Sub OutputD()
        Counter = StartPointer
        If Counter = -1 Then
            Console.WriteLine("链表为空")
            Return
        End If
        Do
            Console.WriteLine(LinkedL(Counter).Data)
            Counter = LinkedL(Counter).Pointer
        Loop Until Counter = -1
    End Sub
End Module

修复说明

  1. 修正节点查找逻辑:ReturnVal改为存储待删除节点的索引,确保后续能正确定位节点。
  2. 添加循环终止条件:查找前驱节点的循环增加Until Counter = -1,避免死循环。
  3. 处理头节点删除:判断待删除节点是否为头节点,直接更新StartPointer指向头节点的下一个节点。
  4. 完善链表遍历:查找节点时每次迭代后移动Counter到下一个节点,确保遍历整个链表。
  5. 修复输出函数:从StartPointer开始遍历,且增加空链表判断,避免输出无效数据。
  6. 节点回收:将删除的节点重新加入空闲链表,实现数组空间的复用。
  7. 输入校验:在主函数中添加输入格式校验,避免非数字输入导致的错误。

内容的提问来源于stack exchange,提问作者Borkode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:05:27