【实用博文】关于力扣牛客上面的接口型题目出bug时在VS上的调试问题

在这里插入图片描述

大家好,我是安然无虞。

文章目录

  • 每篇前言

每篇前言


博客主页:安然无虞

作者认证:2021年博客新星Top2

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。

火爆专栏:蓝桥杯基础算法剖析

在这里插入图片描述


直接进入今天的主题,有这么一道链表题:
在这里插入图片描述
力扣上面是以接口的形式给出,不需要我们写IO函数,是这样的:
在这里插入图片描述
那么经常会有同学问如果代码出错了,图也一步步画了,也仔细查看代码了,但是就是找不出哪里出错了,比如上面这道题,我们一开始没有考虑全面,很容易写成这样:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while(cur)//cur为空时结束循环
    {
        if(cur->val != val)
        {
            prev = cur;
            cur = cur->next;
        }
        else
        {
            struct ListNode* next = cur->next;
            free(cur);
            cur = next;
            prev->next = cur;
        }
    }
    return head;
}

上面代码是有错误的,原因是我们只考虑了常规情况,所以在执行程序之后会曝出这样的错误:
在这里插入图片描述
系统也自动给出了一个测试用例,这个时候我们第一方应不是想着调试,而是想有这么一个单链表,它有4个节点,且每个节点里的值都是7,而题目中也要求val为7,所以这里我们应该先画出图,然后再一步步考虑。

所以思路是这样的:
在这里插入图片描述
在这里插入图片描述
这个时候就很简单了,正确的代码是这样的:

struct ListNode* removeElements(struct ListNode* head, int val){
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while(cur)//cur为空时结束循环
    {
        if(cur->val != val)
        {
            prev = cur;
            cur = cur->next;
        }
        else
        {
            struct ListNode* next = cur->next;
            if(prev == NULL)
            {
                free(cur);
                cur = next;
                head = next;
            }
            else
            {
                free(cur);
                cur = next;
                prev->next = cur;
            }
        }
    }
    return head;
}

如果我们实在想不出也看不出错误所在,那么就只能选择调试了,那么该如何进行调试这类题目呢?

好,下面详细跟大家说说关于力扣牛客上面的接口型题目出bug时在自己的编译器上的调试问题:

首先根据程序给出的错误和测试用例创建一个单链表,这里的话就创建有4个节点,每个节点里的值为7,val也为7的单链表,正确的创建方法是这样的(主函数内容):

int main()
{
    struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));

    node1->val = 7;
    node2->val = 7;
    node3->val = 7;
    node4->val = 7;

    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = NULL;

    removeElements(node1, 7);

    return 0;
}

然后开始调试即可。

完整的代码如下:

//画图分析不出来问题所在,只有一种办法,调试!

#include<stdio.h>
#include<stdlib.h>


struct ListNode {     
    int val;
    struct ListNode *next;
};

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* prev = NULL;
    struct ListNode* cur = head;
    while (cur)
    {
        if (cur->val != val)
        {
            prev = cur;
            cur = cur->next;
        }
        else
        {
            struct ListNode* next = cur->next;
            free(cur);
            cur = next;
        }
    }
    return head;
}

int main()
{
    struct ListNode* node1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node3 = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* node4 = (struct ListNode*)malloc(sizeof(struct ListNode));

    node1->val = 7;
    node2->val = 7;
    node3->val = 7;
    node4->val = 7;

    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = NULL;

    removeElements(node1, 7);

    return 0;
}

在这里插入图片描述

  • 43
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安然无虞

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值