C++链表-删除指定值的节点
输出结果:
D:\Huawei Share\CPP\FirstProject>./main.exe
-1779622112
调试结果:
Thread 1 received signal SIGTRAP, Trace/breakpoint trap.
0x00007ff94e5bc883 in ntdll!RtlIsZeroMemory () from C:\WINDOWS\SYSTEM32\ntdll.dll
Single stepping until exit from function ntdll!RtlIsZeroMemory,
which has no line number information.
Single stepping until exit from function ntdll!RtlRaiseException,
which has no line number information.
Single stepping until exit from function ntdll!memmove,
which has no line number information.
Single stepping until exit from function ntdll!RtlRaiseException,
which has no line number information.
Single stepping until exit from function ntdll!memmove,
which has no line number information.
Thread 1 received signal ?, Unknown signal.
0x00007ff94e5bc8f9 in ntdll!RtlIsZeroMemory () from C:\WINDOWS\SYSTEM32\ntdll.dll
Single stepping until exit from function ntdll!RtlIsZeroMemory,
which has no line number information.
[Thread 2280.0x4110 exited with code 3221226356]
[Thread 2280.0x2390 exited with code 3221226356]
[Thread 2280.0x3ba4 exited with code 3221226356]
[Inferior 1 (process 2280) exited with code 030000001564]
The program 'D:\Huawei Share\CPP\FirstProject\.vscode\.target\7.exe' has exited with code -1 (0xffffffff).
源代码:
#include <iostream>
// 定义链表节点结构体
struct listNode
{
int value; // 节点存储的值
listNode *next; // 指向下一个节点的指针
};
listNode *headPtr = nullptr; // 链表头指针,初始值为nullptr
listNode *lastPtr = nullptr; // 链表尾指针,初始值为nullptr
/**
* 创建新节点并添加到链表中
* @param initValue 新节点的初始值
*/
void creatNeoNode(int initValue)
{
listNode *neoNode = new listNode(); // 动态分配新节点
neoNode->value = initValue; // 设置新节点的值
if (lastPtr != nullptr)
{
lastPtr->next = neoNode; // 如果链表不为空,则将新节点添加到链表末尾
lastPtr = neoNode; // 更新尾指针
}
else
{
headPtr = neoNode; // 如果链表为空,则将新节点设置为链表头
lastPtr = neoNode; // 更新尾指针
}
}
/**
* 删除链表中指定值的节点
* @param startPtr 链表的头指针
* @param deleteValue 待删除的节点值
*/
void deleteNode(listNode *startPtr, int deleteValue)
{
listNode *dummyHead = new listNode(); // 创建一个虚拟头节点,用于简化删除操作
dummyHead->next = startPtr; // 虚拟头节点指向原链表头
listNode *prev = dummyHead; // prev指针指向当前节点的前一个节点
listNode *current = startPtr; // current指针用于遍历链表
while (current != nullptr)
{
if (current->value == deleteValue)
{
prev->next = current->next; // 删除当前节点,通过修改指针实现
delete current; // 释放当前节点的内存
current = prev->next; // 更新current指针
}
else
{
prev = current; // 更新prev指针
current = current->next; // 更新current指针
}
}
startPtr = dummyHead->next; // 更新链表头指针,排除可能被删除的头节点
delete dummyHead; // 释放虚拟头节点的内存
}
/**
* 打印并释放链表节点
* @param startPtr 链表的头指针
*/
void printNode(listNode *startPtr)
{
while (startPtr != nullptr)
{
listNode *del = startPtr; // 临时指针用于释放节点
std::cout << startPtr->value << std::endl; // 打印节点值
startPtr = startPtr->next; // 更新指针
delete del; // 释放节点内存
}
}
int main(int argc, char *argv[])
{
creatNeoNode(1); // 创建并添加节点,值为1
creatNeoNode(2); // 创建并添加节点,值为2
creatNeoNode(3); // 创建并添加节点,值为3
creatNeoNode(2); // 创建并添加节点,值为2
creatNeoNode(1); // 创建并添加节点,值为1
deleteNode(headPtr, 1); // 删除链表中值为1的节点
printNode(headPtr); // 打印链表
}
请问有人能帮我解决这个问题吗?谢谢。