LMEH262 2018-10-19 14:11 采纳率: 75%
浏览 523
已采纳

关于链表函数中存在的bug

函数代码如下,在代码运行后,每次输入到第二个学生后就会自动跳出,只会记录一个学生,运行的效果如下他截图。

 score *creatlink()
{
    score *head;
    score *p1, *p2, *p3, *max;
    int i, j;
    float fen;
    char t[10];
    n = 0;
    p1 = p2 = p3 = (score *)malloc(LEN); 
    head = p3; //开辟新单元
    printf("请输入学生资料,输入0退出!\n");
repeat1: printf("请输入学生学号(学号应该大于0):");
    scanf("%d", &p1->number);
    //判断学生输入的学号是否小于0
    while (p1->number < 0)
    {
        getchar();
        printf("输入错误,请重新输入学生学号:");
        scanf("%d", &p1->number);
    }
    //学号为0时直接转到结尾,链表结束
    if (p1->number == 0)
        goto end;
    else
    {
        p3 = head;
        if (n > 0)
        {
            for (i = 0; i < n; i++)
            {
                if (p1->number != p3->number)
                    p3 = p3->next;
                else
                {
                    //学号如果已经存在,程序报错,返回前面,重新输入
                    printf("学号重复,请重新输入!\n");
                    goto repeat1;
                }
            }
        }
    }
    //输入学生姓名
    printf("请输入学生姓名:");
    scanf("%s", p1->name);
    //输入学生语文成绩及作出判断
    printf("请输入学生的语文成绩(0~100):");
    scanf("%f", &p1->chinese);
    while (p1->chinese <0 || p1->chinese >100)
    {
        getchar();
        printf("输入错误,请重新输入语文成绩:");
        scanf("%f", &p1->chinese);
    }
    //输入学生数学成绩及作出判断
    printf("请输入学生的数学成绩(0~100)");
    scanf("%f", &p1->mathmatic);
    while (p1->mathmatic < 0 || p1->mathmatic > 100)
    {
        getchar();
        printf("输入错误,请重新输入数学成绩:");
        scanf("%f", &p1->mathmatic);
    }
    //输入英语成绩并作出判断
    printf("请输入学生的英语成绩(0~100):");
    scanf("%f", &p1->english);
    while (p1->english < 0 || p1->english > 100)
    {
        getchar();
        printf("输入错误,请重新输入英语的成绩:");
        scanf("%f", p1->english);
    }
    head = NULL;
    while (p1->number != 0)
    {
        n += 1;
        if (n == 1)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
        p1 = (score *)malloc(LEN);
        printf("请输入学生资料,输入0退出!\n");
    repeat2:printf("请输入学生学号(学号应该大于0):");
        scanf("%d", &p1->number);
        //判断学生输入的学号是否小于0
        while (p1->number < 0)
        {
            getchar();
            printf("输入错误,请重新输入学生学号:");
            scanf("%d", &p1->number);
        }
        //学号为0时直接转到结尾,链表结束
        if (p1->number == 0)
            goto end;
        else
        {
            p3 = head;
            if (n > 0)
            {
                for (i = 0; i < n; i++)
                {
                    if (p1->number != p3->number)
                        p3 = p3->next;
                    else
                    {
                        //学号如果已经存在,程序报错,返回前面,重新输入
                        printf("学号重复,请重新输入!\n");
                        goto repeat2;
                    }
                }
            }
        }
        //输入学生姓名
        printf("请输入学生姓名:");
        scanf("%s", p1->name);
        //输入学生语文成绩及作出判断
        printf("请输入学生的语文成绩(0~100):");
        scanf("%f", &p1->chinese);
        while (p1->chinese <0 || p1->chinese >100)
        {
            getchar();
            printf("输入错误,请重新输入语文成绩:");
            scanf("%f", &p1->chinese);
        }
        //输入学生数学成绩及作出判断
        printf("请输入学生的数学成绩(0~100)");
        scanf("%f", &p1->mathmatic);
        while (p1->mathmatic < 0 || p1->mathmatic > 100)
        {
            getchar();
            printf("输入错误,请重新输入数学成绩:");
            scanf("%f", &p1->mathmatic);
        }
        //输入英语成绩并作出判断
        printf("请输入学生的英语成绩(0~100):");
        scanf("%f", &p1->english);
        while (p1->english < 0 || p1->english > 100)
        {
            getchar();
            printf("输入错误,请重新输入英语的成绩:");
            scanf("%f", p1->english);
        }
    end: p1 = head;
        p3 = p1;
        for (i = 1; i < n; i++)
        {
            for (j = i + 1; j <= n; j++)
            {
                max = p1;
                p1 = p1->next;
                if (max->number > p1->number)
                {
                    k = max->number;
                    max->number = p1->number;
                    p1->number = k;
                    strcpy(t, max->name);
                    strcpy(max->name, p1->name);
                    strcpy(p1->name, t);
                    fen = max->chinese;
                    max->chinese = p1->chinese;
                    p1->chinese = fen;
                    fen = max->mathmatic;
                    max->mathmatic = p1->mathmatic;
                    p1->mathmatic = fen;
                    fen = max->english;
                    max->english = p1->english;
                    p1->english = fen;
                }
            }
            max = head;
            p1 = head;
        }
        p2->next = NULL;
        printf("输入学生的个数为:%d个!\n", n);
        return (head);
    }
}

图片说明

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-10-19 18:18
    关注
    // Q703209.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    struct score
    {
        int number;
        char name[10];
        float chinese;
        float english;
        float mathmatic;
        score * next;
    };
    
    score *creatlink()
    {
        int n = 0;
        char choice = '1';
        int LEN = sizeof(score);
        score *head, *p1 /*input*/ , *p2 /*current*/, *p3 /*found*/;
        int i, j;
        head = p2 = (score *)malloc(LEN);
        head->next = NULL;
        while (true)
        {
            printf("请输入学生资料,输入0退出!");
            fflush(stdin);
            scanf("%c", &choice);
            if (choice == '0') break;
            printf("请输入学生学号(学号应该大于0):");
            p1 = (score *)malloc(LEN);
            p1->next = NULL;
            scanf("%d", &p1->number);
            //判断学生输入的学号是否小于0
            while (p1->number < 0)
            {
                getchar();
                printf("输入错误,请重新输入学生学号:");
                scanf("%d", &p1->number);
            }
            //学号为0时直接转到结尾,链表结束
            if (p1->number == 0)
                break;
            else
            {
                p3 = head->next;
                int found = 0;
                while (p3 != NULL)
                {
                        if (p1->number == p3->number)
                        {
                            printf("学号重复,请重新输入!\n");
                            found = 1;
                            break;
                        }
                        p3 = p3->next;
                }
                if (found) continue;
            }
            //输入学生姓名
            printf("请输入学生姓名:");
            scanf("%s", p1->name);
            //输入学生语文成绩及作出判断
            printf("请输入学生的语文成绩(0~100):");
            scanf("%f", &p1->chinese);
            while (p1->chinese <0 || p1->chinese >100)
            {
                getchar();
                printf("输入错误,请重新输入语文成绩:");
                scanf("%f", &p1->chinese);
            }
            //输入学生数学成绩及作出判断
            printf("请输入学生的数学成绩(0~100):");
            scanf("%f", &p1->mathmatic);
            while (p1->mathmatic < 0 || p1->mathmatic > 100)
            {
                getchar();
                printf("输入错误,请重新输入数学成绩:");
                scanf("%f", &p1->mathmatic);
            }
            //输入英语成绩并作出判断
            printf("请输入学生的英语成绩(0~100):");
            scanf("%f", &p1->english);
            while (p1->english < 0 || p1->english > 100)
            {
                getchar();
                printf("输入错误,请重新输入英语的成绩:");
                scanf("%f", &p1->english);
            }
    
            p2->next = p1;
            p2 = p2->next;
            n += 1;
        }
        printf("输入学生的个数为:%d个!\n", n);
        score *maxc , *maxe , *maxm;
        maxc = maxe = maxm = p3 = head->next;
        while (p3 != NULL)
        {
            if (maxc->chinese < p3->chinese) maxc = p3;
            if (maxe->english < p3->english) maxe = p3;
            if (maxm->mathmatic < p3->mathmatic) maxm = p3;
            p3 = p3->next;
        }
        printf("语文最高分,姓名%s,成绩%f\n", maxc->name, maxc->chinese);
        printf("数学最高分,姓名%s,成绩%f\n", maxm->name, maxm->mathmatic);
        printf("英语最高分,姓名%s,成绩%f\n", maxe->name, maxc->english);
        return (head);
    }
    int main()
    {
        creatlink();
    }
    

    图片说明

    问题如果解决,请点下我回答右边的采纳,谢谢

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

报告相同问题?

悬赏问题

  • ¥30 关于#opencv#的问题:使用大疆无人机拍摄水稻田间图像,拼接成tif图片,用什么方法可以识别并框选出水稻作物行
  • ¥15 Python卡尔曼滤波融合
  • ¥20 iOS绕地区网络检测
  • ¥15 python验证码滑块图像识别
  • ¥15 根据背景及设计要求撰写设计报告
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1