库里斯托 2023-03-01 16:57 采纳率: 91.1%
浏览 14
已结题

关于“链表”的问题,如何解决?

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 4        //修改 课程数目 
typedef struct stu
{
    long  stuID;     //学号
    char  stuname[10]; //名字
    char  stusex;  //性别
    int   score[N]; //分数
    int   total;   //总分
    float aver;    //平均分  int
    int   line;    //排名
}STU;
typedef struct node   //创建结点类型
{
    STU stu;                //数据域
    struct node* next;   //指向下一个节点的指针
}NODE;
NODE* head = NULL;  //定义头指针

//NODE* creatlist();
void IDtoscoreandline();
void start();
void inputstudent();
void savestudent(); 
void readstudent();
void printfstudent();
void rank();         //排名次函数

int main()
{
    //int arr[100] = { 1 };//存每名学生的名次   修改
    int m = 4;
    while (1)
    {
        start();
        char ch = _getch();
        switch (ch)
        {
        case '1': //录入学生信息
            inputstudent();  //inputstudent(stu);  修改
            rank();
            break;
        case '2':  //保存学生信息
            savestudent();
            break;
        case '3'://读取学生信息
            readstudent();
            break;
        case '4':  //打印学生信息
            printfstudent();
            break;
        case'5':  //根据学号查询学生的分数及名次
            IDtoscoreandline();
            break;
        case'6':  //根据姓名查询学生的分数及名次
            break;
        case '7':  //按学号由小到大排出成绩表
            break;
        case '8':  //按姓名字典顺序排序排出成绩表
            break;
        }
    }
    return 0;
}

void start()
{
    printf("*****************************************\n");
    printf("欢迎使用学生成绩管理系统                *\n");
    printf("*1.录入学生信息                         *\n");
    printf("*2.保存学生信息                         *\n");
    printf("*3.读取学生信息                         *\n");
    printf("*4.打印学生信息                         *\n");
    printf("*5.按总分由高到低排出名次               *\n");
    printf("*6.按总分由低到高排出名次               *\n");
    printf("*7.按学号由小到大排出成绩表             *\n");
    printf("*8.按姓名字典顺序排序排出成绩表         *\n");
    printf("*9.根据学号查询学生成绩及排名           *\n");
    printf("*0.根据姓名查询学生成绩及排名           *\n");
    printf("*****************************************\n");
}

NODE* creatlist()    //创建表头表示整个链表即创建链表(表头可以是头结点,也可以是数据结点,通常是头结点)
{
    NODE* headNode = (NODE*)malloc(sizeof(NODE));
    headNode->next = NULL;
    return headNode;
}

void inputstudent()
{
    int  i;
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->next = NULL;
    printf("学号:");
    scanf_s("%ld", &newnode->stu.stuID);
    printf("姓名:");
    scanf_s("%s", newnode->stu.stuname, 10);
    printf("性别:");
    scanf_s(" %c", &newnode->stu.stusex, 1);
    printf("%d门课程成绩:", N);
    for (i = 0, newnode->stu.total = 0; i < N; i++) {     //输入4科成绩并计算总分
        scanf_s("%d", &newnode->stu.score[i]);
        newnode->stu.total += newnode->stu.score[i];
    }
    newnode->stu.aver = (float)(newnode->stu.total / N);     //计算平均数

    if (head == NULL)//以下代码,实现输入每个学生信息后,按总分从高到低链入链表
        head = newnode;
    else 
    {
        NODE* p = head;
        while (p->next && p->next->stu.total > newnode->stu.total)  
          p = p->next;
        if (p == head && p->stu.total < newnode->stu.total) 
        {
            newnode->next = head;
            head = newnode;
        }
        else 
        {
            newnode->next = p->next;
            p->next = newnode;
        }
    }
}

void savestudent()    //保存学生信息
{
    FILE* pf = fopen("pph.txt", "w"); //创建并打开文件
    if (pf == NULL) //判断打开文件是否失败
    {
        printf("打开文件失败\n");
        return;
    }
    NODE* p = head;
    while (p != NULL)
    {
        fwrite(&p->stu, sizeof(STU), 1, pf);
        p = p->next;
    }
    fclose(pf);
    printf("数据保存成功\n");
}


void readstudent()   //读取学生信息
{
    FILE* pf = fopen("pph.txt", "r");  //打开文件
    if (pf == NULL) //判断打开文件是否失败
    {
        printf("err!\n");
        return;
    }
    NODE* pt = NULL;
    while (1)
    {
        NODE* newnode = (NODE*)malloc(sizeof(NODE));
        newnode->next = NULL;
        if (fread(&newnode->stu, sizeof(STU), 1, pf) != 1) {
            free(newnode);
            break;
        }
        if (head == NULL)
            head = newnode;
        else
        {
            if (!pt) {
                pt = head;
                while (pt->next) pt = pt->next;
            }
            pt->next = newnode;
            pt = newnode;
        }
    }
    fclose(pf);
    printf("加载数据成功\n");
}
void printfstudent()
{
    int i;
    NODE* P = head;
    while (P != NULL)
    {
        printf("%ld %s %c", P->stu.stuID, P->stu.stuname, P->stu.stusex);
        for (i = 0; i < N; i++)
            printf(" %d", P->stu.score[i]);
        printf(" %d %.2f %d\n", P->stu.total, P->stu.aver, P->stu.line);
        P = P->next;
    }
    system("pause");
}

void rank()   // 排名次函数
{
    int k = 0;
    NODE* P = head, * pre = NULL;
    while (P != NULL)
    {
        if (P == head)
            k++;
        else if (pre->stu.total != P->stu.total){
            k++;
        }
        P->stu.line = k;
        pre = P;
        P = P->next;
    }
}
void IDtoscoreandline()
{
    printf("输入学生学号:");
        long ID = 0;
        scanf_s("%ld", ID);
        int i;
        NODE* k = (NODE*)malloc(sizeof(NODE*));
        k = head->next;
        while (1)
        {
            if (k->stu.stuID == ID);
            {
                printf("%d %d", k->stu.total, k->stu.line);
                break;
            }
                k = k->next;
        }
}

调用IDtoscoreandline();的时候运行错误了

img


应该是IDtoscoreandline()函数写的有问题,如何修改?

  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2023-03-01 17:09
    关注
        scanf_s("%ld", ID);
    

    改为

        scanf_s("%ld",&ID);
    

    NODE* k = (NODE*)malloc(sizeof(NODE));
    223行最后的分号删掉

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月9日
  • 已采纳回答 3月1日
  • 创建了问题 3月1日

悬赏问题

  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan