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
问题分析
- 查找待删除节点逻辑错误:
ReturnVal存储的是待删除节点的指针而非节点索引,导致后续查找前驱节点时匹配逻辑完全错误。 - 死循环问题:查找前驱节点的
Do Loop没有终止条件,一旦进入就会无限循环,后续的成功提示永远无法执行。 - 未处理头节点删除场景:如果待删除的是链表的头节点(
StartPointer指向的节点),原代码没有对应的处理逻辑,会直接跳过删除操作。 - 链表遍历逻辑缺失:查找待删除节点的循环中,未在每次迭代后移动到下一个节点,导致只能检查头节点,无法遍历整个链表。
- 输出函数起始点错误:
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
修复说明
- 修正节点查找逻辑:
ReturnVal改为存储待删除节点的索引,确保后续能正确定位节点。 - 添加循环终止条件:查找前驱节点的循环增加
Until Counter = -1,避免死循环。 - 处理头节点删除:判断待删除节点是否为头节点,直接更新
StartPointer指向头节点的下一个节点。 - 完善链表遍历:查找节点时每次迭代后移动
Counter到下一个节点,确保遍历整个链表。 - 修复输出函数:从
StartPointer开始遍历,且增加空链表判断,避免输出无效数据。 - 节点回收:将删除的节点重新加入空闲链表,实现数组空间的复用。
- 输入校验:在主函数中添加输入格式校验,避免非数字输入导致的错误。
内容的提问来源于stack exchange,提问作者Borkode
相关产品推荐
相关产品推荐

