J.Y.Block Tesla 2024-08-02 15:41 采纳率: 100%
浏览 4
已结题

C++链表-删除指定值的节点

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); // 打印链表
}

请问有人能帮我解决这个问题吗?谢谢。

  • 写回答

1条回答 默认 最新

  • 浪客 2024-08-02 16:08
    关注

    58行
    headPtr = dummyHead->next;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月2日
  • 已采纳回答 8月2日
  • 创建了问题 8月2日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?