美文网首页
C问题一记

C问题一记

作者: Trump丶 | 来源:发表于2019-06-02 09:50 被阅读0次

正文

今天写作业代码,遇到一些小问题,记录一下解决过程。

先贴出最早的问题代码

// linklist.c
#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int          data;
    struct node* next;
} node, *Node;

int main() {
    Node head = NULL, tail = NULL, p_new = NULL;
    int temp;
    while((scanf("%d", &temp) != EOF) && getchar() != '\n') {
        p_new = (Node)malloc(sizeof(node));
        p_new->data = temp;
        if(head == NULL)
        {
            head = p_new;
            tail = p_new;
        }
        tail->next = p_new;
        tail = p_new;
    }

    Node max = head, p = head;
    while(p != NULL) {
        if(p->data > max->data) {
            max = p;
        }
        p = p->next;
    }
    p = head;
    while(p != NULL && p->next != max) {
        p = p->next;
    }
    p->next = max->next;
    max->next = NULL;
    tail->next = max;
    p = head;
    while(p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

从控制台输入一组数据(不定量),每输入一个就插入链表尾部,输入完成后找到最大节点并将最大节点移动到链表尾部

但是在测试的时候发现不对劲,出现了无限循环

经过一系列排查,发现是因为出现了野指针

在第15行,只给p_new->data赋值,没有给p_new->next赋值,p_new->next成为野指针,而在后面第26行等判断指针不为NULL的语句始终为真,导致无限循环

所以修改方案就是在第15行后面添加一行p_new->next = NULL;

这一点修改之后,做测试,发现始终都不会打印出链表最后一个值

可以看到2没有了

这就让我思考,难道是链表操作有误?

在经过一系列排查之后,再次找到问题所在

第13行输入判断条件有误,getchar() != '\n' ,前面的字符后都是空格' ',但最后一个数后面的字符是'\n',于是表达式为假,于是就没有后面的循环了,最后一个数也自然没加进链表

改进方法就是将循环改成下面这样

while(scanf("%d", &temp)) {
    p_new = (Node)malloc(sizeof(node));
    p_new->data = temp;
    p_new->next = NULL;
    if(head == NULL)
    {
        head = p_new;
        tail = p_new;
    }
    tail->next = p_new;
    tail = p_new;
    if(getchar() == '\n') {
        break;
    }
}

这样就不会有问题啦


一切正常

所以这次问题小记就到这里啦

相关文章

  • C问题一记

    正文 今天写作业代码,遇到一些小问题,记录一下解决过程。 先贴出最早的问题代码 从控制台输入一组数据(不定量),每...

  • 故事一则又来了👏👏👏家教😜😱😎😎

    李女士家里有三个小孩? A and B and C 这天天气不错 C是小妹妹 她说想买只玩具熊 李女士扇了她一记耳...

  • 可可狮遇见更好的你

    可可狮常见问题的解决办法 2017年12月的每日一记

  • 关于 C# DateTime.Now.Ticks

    学习 C# 的过程中时间方法的使用值得一记,尤其是已经熟悉 Java。 先看看文档摘要: DateTime.Tic...

  • 并发:C10K 问题 & C10M 问题

    1. C10K 问题 1.1. 什么是 C10K 问题 C10K 问题,即单机 10000 个并发连接问题; 1....

  • 2019-03-19

    每日一记 今天开始了前端的学习生活。 软件构架主要分为两种:b\s 和 c\s ,前者是 b browsers 浏...

  • Rails C问题

    如果在进入rails c后,输入指令,又跳出来了,还出现上面一眼望不到头的错误,那就是spring的问题,需要这样...

  • C语言问题

    把一个字符串赋值给字符数组是出现“error: assignment to expression with arr...

  • APP上传未出现构建版本问题解决

    记性不好,出现问题既然解决了,那就记一记吧。。。 例如: Missing Info.plist key- This...

  • 雾起

    一眼朦胧, 一眼迷惘, 一眼痴情, 一眼痴迷。 一记心跳, 一记潦草, 一记困顿, 一记回忆。 我在小雾起床, 我...

网友评论

      本文标题:C问题一记

      本文链接:https://www.haomeiwen.com/subject/ssgzfqtx.html