c语言有关链表的题,望指正代码的错误


#include<stdio.h>
#include<stdlib.h>
struct Student
{
    long num;
    char name[10];
    int age;
    float score[7];
    float sum;
    float aver;
    struct Student* next;
}*stu;
void create()
{
    struct Student *p;
    int n;
    stu=(struct Student*)malloc(sizeof(struct Student));
    p=stu;
    n=0;
    scanf("%s",p->name);
    scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]);
    while(n<9)
    {
        n++;
        p=(struct Student*)malloc(sizeof(struct Student));
        scanf("%s",p->name);
        scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]);
        p=p->next;
    }
    p->next=NULL;
}
void average()
{
    struct Student* ins;
    ins=stu;
    while(ins!=NULL)
    {
        ins->sum=ins->score[0]+ins->score[1]+ins->score[2]+ins->score[3]+ins->score[4]+ins->score[5]+ins->score[6];
        ins->aver=(ins->sum)/7.0;
        ins=ins->next;
    }
}
void search()
{
    struct Student *ins;
    struct Student *q;
    int big=0;
    ins=stu;
    q=stu;
    while(ins!=NULL)
    {
        if((ins->sum)>big)
        {
            q=ins;
            big=ins->sum;
        }
        ins=ins->next;
    }
    printf("成绩总分最高的学生的名字是%s",q->name);
}
int main()
{
    create();
    average();
    search();
    return 0;
}

题目是图片关于动态链表的,哪位能帮我指正一下代码哪里有错误?

img

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

在你的代码中,存在一些问题,如下:

1、在 create() 函数中,你使用 scanf 函数输入学生信息时,输入的方式不正确。你应该分别输入学生的姓名、年龄和各科成绩,而不是将它们混合在一起输入。
2、在 create() 函数中,你重复使用了 malloc 来为新学生分配内存,这是不必要的。你可以将分配内存的代码移到函数外部,只执行一次。
3、在 create() 函数中,你未正确连接各个学生节点,导致链表断开。你需要将新学生的 next 指针指向先前已存在的链表。
4、在 average() 函数中,你没有遍历链表计算总分和平均分,而是直接使用了输入的总分和平均分。
5、在 search() 函数中,你使用了 big 变量来存储当前最大的总分,但没有初始化为0。


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

struct Student
{
    long num;
    char name[10];
    int age;
    float score[7];
    float sum;
    float aver;
    struct Student* next;
}*stu;

void create()
{
    struct Student *p;
    int n = 0; // 将n的初始值设置为0
    stu = NULL; // 初始化链表为空
    while (n < 10)
    {
        n++;
        p = (struct Student*)malloc(sizeof(struct Student));
        printf("请输入第%d个学生的姓名:", n);
        scanf("%s", p->name);
        printf("请输入第%d个学生的年龄:", n);
        scanf("%d", &(p->age));
        printf("请输入第%d个学生的英语、数学、语文、政治、物理、化学、计算机成绩:", n);
        scanf("%f%f%f%f%f%f%f", &(p->score[0]), &(p->score[1]), &(p->score[2]), &(p->score[3]), &(p->score[4]), &(p->score[5]), &(p->score[6]));
        p->sum = p->score[0] + p->score[1] + p->score[2] + p->score[3] + p->score[4] + p->score[5] + p->score[6];
        p->aver = p->sum / 7.0;
        p->next = NULL;
        
        if (stu == NULL) {
            stu = p; // 链表为空,将stu指向第一个节点
        } else {
            struct Student* last = stu;
            while (last->next != NULL) {
                last = last->next; // 找到链表最后一个节点
            }
            last->next = p; // 将新节点连接到链表最后
        }
    }
}

void search()
{
    if (stu == NULL) {
        printf("链表为空,无法搜索最高总分的学生姓名。\n");
        return;
    }
    
    struct Student *ins = stu;
    struct Student *q = stu;
    float big = 0; // 将big的初始值设置为一个较小的数
    while (ins != NULL)
    {
        if (ins->sum > big)
        {
            q = ins;
            big = ins->sum;
        }
        ins = ins->next;
    }
    printf("成绩总分最高的学生的名字是%s\n", q->name);
}

int main()
{
    create();
    search();
    return 0;
}

如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

有如下几个错误, 先把下面几个问题改了再试试, 以 ==== 标记出来了

void create()
{
    struct Student *p, *q; //====增加一个q指针
    int n;
    stu=(struct Student*)malloc(sizeof(struct Student));
    p=stu;
    n=0;
    scanf("%s",p->name); //==== p->name 已经读入了,下面就不用读入了,并且是8个,后面有9个参数了
    scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]);
    while(n<9)
    {
        n++;
        //==== p改成q,后面的结构体指向也改一下,比如下面 p->name 改成 q->name
        q=(struct Student*)malloc(sizeof(struct Student));
        scanf("%s",p->name);
        scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]);
        //==== 链表指向顺序错了,p=p->next 改成下面这样
        p->next = q;
        p=q;
    }
    p->next=NULL;
}

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

题主代码修改如下,改动处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
struct Student
{
    long  num;
    char  name[10];
    int   age;
    float score[7];
    float sum;
    float aver;
    struct Student* next;
}*stu;
void create()
{
    struct Student *p, *pt; // 修改
    int n;
    stu=(struct Student*)malloc(sizeof(struct Student));
    stu->next = NULL;   // 修改
    p=stu;
    n=0;
    scanf("%ld %s", &p->num, p->name); // 修改
    scanf("%d%f%f%f%f%f%f%f", &p->age, &p->score[0],&p->score[1],&p->score[2],&p->score[3],&p->score[4],&p->score[5],&p->score[6]);
    //scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]); 修改
    while(n < 9)
    {
        n++;
        pt=(struct Student*)malloc(sizeof(struct Student)); // 修改
        pt->next = NULL;       // 修改
        scanf("%ld %s",&pt->num ,pt->name); // 修改
        scanf("%d%f%f%f%f%f%f%f", &pt->age, &pt->score[0],&pt->score[1],&pt->score[2],&pt->score[3],&pt->score[4],&pt->score[5],&pt->score[6]);
        //scanf("%d%d%d%d%d%d%d%d",p->name,p->age,p->score[0],p->score[1],p->score[2],p->score[3],p->score[4],p->score[5],p->score[6]); 修改
        //p=p->next;  // 修改
        p->next = pt; // 修改
        p = pt;       // 修改
    }
    //p->next=NULL;  // 修改
}
void average()
{
    struct Student* ins;
    ins = stu;
    while(ins!=NULL)
    {
        ins->sum=ins->score[0]+ins->score[1]+ins->score[2]+ins->score[3]+ins->score[4]+ins->score[5]+ins->score[6];
        ins->aver=(ins->sum)/7.0;
        ins=ins->next;
    }
}
void search()
{
    struct Student *ins;
    struct Student *q;
    int big=0;
    ins=stu;
    q=stu;
    while(ins!=NULL)
    {
        if((ins->sum)>big)
        {
            q=ins;
            big=ins->sum;
        }
        ins=ins->next;
    }
    printf("成绩总分最高的学生的名字是%s",q->name);
}
int main()
{
    create();
    average();
    search();
    return 0;
}

引用 皆我百晓生 小程序回复内容作答:
有几处代码错误需要指正:

  1. 在create()函数中,scanf函数中参数传递错误。对于整型和浮点型数据,应该使用"%d"和"%f"作为格式化字符串,而不是"%s";

  2. 在create()函数中,输入链表节点的代码有重复部分。可以将重复的代码部分放在while循环内,这样就可以避免代码重复;

  3. 在create()函数中,p指针指向了新分配的内存空间,但是在while循环内,p指针又被重新赋值,这会导致链表断链,使得最后一个节点与其他节点无法连接起来;

  4. 在average()函数中,应该将ins指针移动到下一个节点之前计算sum和aver,否则会导致最后一个节点的sum和aver计算错误;

  5. 在search()函数中,应该将big初始化为一个较小的值,比如负无穷,以便确保能正确找到成绩总分最高的学生。

按照上述指正,对代码进行修正如下:

#include<stdio.h>
#include<stdlib.h>
struct Student
{
    long num;
    char name[10];
    int age;
    float score[7];
    float sum;
    float aver;
    struct Student* next;
}*stu;
void create()
{
    struct Student *p, *q;
    int n;
    stu=(struct Student*)malloc(sizeof(struct Student));
    p=stu;
    n=0;
    scanf("%s",p->name);
    scanf("%d%d%f%f%f%f%f%f%f", &p->age, &p->score[0], &p->score[1], &p->score[2], &p->score[3], &p->score[4], &p->score[5], &p->score[6]);
    while(n<9)
    {
        n++;
        q=(struct Student*)malloc(sizeof(struct Student));
        scanf("%s",q->name);
        scanf("%d%d%f%f%f%f%f%f%f", &q->age, &q->score[0], &q->score[1], &q->score[2], &q->score[3], &q->score[4], &q->score[5], &q->score[6]);
        p->next = q;
        p=q;
    }
    p->next=NULL;
}
void average()
{
    struct Student* ins;
    ins=stu;
    while(ins!=NULL)
    {
        ins->sum=ins->score[0]+ins->score[1]+ins->score[2]+ins->score[3]+ins->score[4]+ins->score[5]+ins->score[6];
        ins->aver=(ins->sum)/7.0;
        ins=ins->next;
    }
}
void search()
{
    struct Student *ins;
    struct Student *q;
    float big=-INFINITY;
    ins=stu;
    q=stu;
    while(ins!=NULL)
    {
        if((ins->sum)>big)
        {
            q=ins;
            big=ins->sum;
        }
        ins=ins->next;
    }
    printf("成绩总分最高的学生的名字是%s",q->name);
}
int main()
{
    create();
    average();
    search();
    return 0;
}

结合GPT给出回答如下请题主参考
在你提供的代码中,结构体 Student 中的定义似乎不完整,缺少了结构体中的结束符号 },应该在最后加上一个 }

除此之外,如果你的链表需要支持插入和删除操作,你可能需要使用指向结构体的指针来构建链表。

以下是一个完整的链表示例代码,可以供你参考:

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

struct Student {
    long num;
    char name[10];
    struct Student *next;
};

typedef struct Student NODE;
typedef struct Student *NODEPTR;

void insert(NODEPTR *head, NODEPTR p);
void delete(NODEPTR *head, long num);
void printList(NODEPTR head);

int main() {
    NODEPTR head = NULL;
    NODEPTR p;
    long num;
    char name[10];

    while (1) {
        printf("Enter student number (0 to end): ");
        scanf("%ld", &num);

        if (num == 0) {
            break;
        }

        p = (NODEPTR) malloc(sizeof(NODE));
        if (p == NULL) {
            printf("Out of memory!\n");
            exit(1);
        }

        p->num = num;

        printf("Enter student name: ");
        scanf("%s", name);
        strcpy(p->name, name);

        insert(&head, p);
    }

    printList(head);

    printf("Enter student number to delete: ");
    scanf("%ld", &num);
    delete(&head, num);

    printList(head);

    return 0;
}

void insert(NODEPTR *head, NODEPTR p) {
    NODEPTR curr = *head;
    NODEPTR prev = NULL;

    while (curr != NULL && curr->num < p->num) {
        prev = curr;
        curr = curr->next;
    }

    if (prev == NULL) {
        *head = p;
    } else {
        prev->next = p;
    }

    p->next = curr;
}

void delete(NODEPTR *head, long num) {
    NODEPTR curr = *head;
    NODEPTR prev = NULL;

    while (curr != NULL && curr->num != num) {
        prev = curr;
        curr = curr->next;
    }

    if (curr == NULL) {
        printf("Student not found.\n");
        return;
    }

    if (prev == NULL) {
        *head = curr->next;
    } else {
        prev->next = curr->next;
    }

    printf("Deleted student %ld %s\n", curr->num, curr->name);

    free(curr);
}

void printList(NODEPTR head) {
    NODEPTR curr = head;

    printf("Student list:\n");

    while (curr != NULL) {
        printf("%ld %s\n", curr->num, curr->name);
        curr = curr->next;
    }
}

这个示例代码实现了一个简单的输入学生信息,构建链表,删除指定学生的功能。你可以根据自己的需求对其进行修改和拓展。

在您的代码中,存在几个错误和可能的改进。我将为您一一列出:

1、结构体定义中,年龄(age)和分数(score)的类型应该是int,而不是double。如果您想要保留小数点后的值,可以使用float或double。
2、在函数create()中,您需要为每个学生的分数分配内存。您可以在输入每个学生的信息后,将下一个学生的指针指向新分配的内存。
3、在函数create()中,您的输入方式存在问题。您应该先输入名字,再输入年龄和分数。此外,您的输入语句似乎没有正确结束。
4、在函数average()中,您需要将求和和平均值的计算放在循环内部,以确保每个学生的总分和平均分都被正确计算。
5、在函数search()中,您应该初始化变量big为0。否则,如果学生列表为空,那么big将没有定义,这可能会导致错误。

下面是修改后的代码:

#include<stdio.h>  
#include<stdlib.h>  
  
struct Student {  
    long num;  
    char name[10];  
    int age;  
    float score[7];  
    float sum;  
    float aver;  
    struct Student* next;  
}*stu;  
  
void create() {  
    struct Student *p, *temp;  
    int n = 0;  
    temp = (struct Student*)malloc(sizeof(struct Student));  
    temp->next = NULL;  
    scanf("%s",temp->name);  
    scanf("%d%d%d%d%d%d%d%d",&temp->age, &temp->score[0], &temp->score[1], &temp->score[2], &temp->score[3], &temp->score[4], &temp->score[5], &temp->score[6]);  
    stu = temp;  
    while(n < 8) {  
        n++;  
        p = (struct Student*)malloc(sizeof(struct Student));  
        scanf("%s",p->name);  
        scanf("%d%d%d%d%d%d%d%d",&p->age, &p->score[0], &p->score[1], &p->score[2], &p->score[3], &p->score[4], &p->score[5], &p->score[6]);  
        p->next = NULL;  
        stu->next = p;  
        stu = p;  
    }  
    stu->next = NULL;  
}  
  
void average() {  
    struct Student* ins;  
    ins = stu;  
    while(ins != NULL) {  
        ins->sum = ins->score[0] + ins->score[1] + ins->score[2] + ins->score[3] + ins->score[4] + ins->score[5] + ins->score[6];  
        ins->aver = ins->sum / 7.0;  
        ins = ins->next;  
    }  
}  
  
void search() {  
    struct Student *ins, *q;  
    int big = 0;  
    float max_avg = 0.0;  
    ins = stu;  
    q = stu;  
    while(ins != NULL) {  
        if(ins->sum > big) {  
            q = ins;  
            big = ins->sum;  
        } else if(ins->sum == big && ins->aver > max_avg) {  
            q = ins;  
            max_avg = ins->aver;  
        }  
        ins = ins->next;  
    }  
    printf("成绩总分最高的学生的名字是%s", q->name);  
}  
  
int main() {  
    create();  
    average();  
    search();  
    return 0;  
}