十四行124 2021-07-02 09:58 采纳率: 75%
浏览 25
已采纳

用c语言链表形式表示这个学生管理系统

用c语言链表的形式表示这个学生管理系统

img

img

  • 写回答

2条回答 默认 最新

  • qfl_sdu 2021-07-02 10:03
    关注

    代码如下:如有帮助,请帮忙采纳一下,谢谢。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define NMBSCORE 3
    struct StNode
    {
        int num;        //学号
        char name[20];  //姓名 
        char sex;       //性别
        int age;        //年龄
        int grade;      //班级
        int score[NMBSCORE]; //成绩
        StNode* next;
    };
    
    
    //读取文件
    struct StNode* ReadFile(const char* filename,struct StNode* head)
    {
        struct StNode* node,*tmp;
        FILE* fp;
        int i;
        if ((fp = fopen(filename,"r")) == 0)
        {
            printf("文件打开失败\n");
            return 0;
        }
        while(!feof(fp))
        {
            node = (struct StNode*)malloc(sizeof(struct StNode));
            fscanf(fp,"%d%20s %c%4d%4d",&node->num,node->name,&node->sex,&node->age,&node->grade);
            for(i=0;i<NMBSCORE;i++)
                fscanf(fp,"%4d",&node->score[i]);
            fscanf(fp,"\n");
            node->next = 0;
            if (head == 0)
            {
                head = node;
                tmp = head;
            }else
            {
                tmp->next = node;
                tmp = node;
            }
        }
        fclose(fp);
        return head;
    }
    
    //录入信息
    struct StNode* Input(struct StNode* head)
    {
        struct StNode* p,*node;
        int i;
        system("cls");
        node = (struct StNode*)malloc(sizeof(struct StNode));
        //录入信息
        printf("请输入学号:");
        scanf("%d",&node->num);
        printf("请输入姓名:"); 
        scanf("%s",node->name);
        printf("请输入性别:");
        scanf(" %c",&node->sex);
        printf("请输入年龄:");
        scanf(" %d",&node->age);
        printf("请输入班级:");
        scanf(" %d",&node->grade);
        printf("请输入%d门课程的成绩:",NMBSCORE);
        for(i=0;i<NMBSCORE;i++)
            scanf("%d",&node->score[i]);
        node->next = 0;
    
        if (head == 0)
        {
            head = node;
            //
        }else
        {
            p = head;
            while(p->next)
                p = p->next;
            //新建节点
            p->next = node;
        }
        system("pause");
        return head;
    }
    //显示所有学生信息
    void showAll(struct StNode* head)
    {
        struct StNode* p;
        int i=1,j;
        system("cls");
        p = head;
        while(p)
        {
            printf("学生%d学号:%d\n",i,p->num);
            printf("学生%d姓名:%s\n",i,p->name); 
            printf("学生%d性别:%c\n",i,p->sex);
            printf("学生%d年龄:%d\n",i,p->age);
            printf("学生%d班级:%d\n",i,p->grade);
            printf("学生%d的成绩:",i);
            for(j=0;j<NMBSCORE;j++)
                printf("%d ",p->score[j]);
            printf("\n");
            i++;
            p = p->next;
        }
        system("pause");
    }
    
    //查询信息
    void Find(struct StNode* head)
    {
        int opt;
        struct StNode* p = head;
        int id,j;
        char name[20]={0};
        system("cls");
        printf("1.按学号查询\n");
        printf("2.按姓名查询\n"); 
        scanf("%d",&opt);
        switch(opt)
        {
        case 1:
            printf("请输入学号:");
            scanf("%d",&id);
            while(p)
            {
                if(p->num == id)
                {
                    printf("学生学号:%d\n",p->num);
                    printf("学生姓名:%s\n",p->name); 
                    printf("学生性别:%c\n",p->sex);
                    printf("学生年龄:%d\n",p->age);
                    printf("学生班级:%d\n",p->grade);
                    printf("学生成绩:");
                    for(j=0;j<NMBSCORE;j++)
                        printf("%d ",p->score[j]);
                    printf("\n");
                    break;
                }
                p = p->next;
            }
            if(p==0)
                printf("查无此人\n");
            break;
        case 2:
            printf("请输入姓名:");
            scanf("%s",name);
            while(p)
            {
                if(strcmp(p->name,name) ==0)
                {
                    printf("学生学号:%d\n",p->num);
                    printf("学生姓名:%s\n",p->name); 
                    printf("学生性别:%c\n",p->sex);
                    printf("学生年龄:%d\n",p->age);
                    printf("学生班级:%d\n",p->grade);
                    printf("学生成绩:");
                    for(j=0;j<NMBSCORE;j++)
                        printf("%d ",p->score[j]);
                    printf("\n");
                    break;
                }
                p = p->next;
            }
            if(p==0)
                printf("查无此人\n");
            break;
        }
        system("pause");
    }
    
    
    
    
    //修改学生信息
    void ModInfo(struct StNode* head)
    {
        struct StNode* node = 0;
        int id,i;
        system("cls");
        printf("请输入需要修改信息的学生学号:");
        scanf("%d",&id);
        node = head;
        while(node)
        {
            if(node->num == id)
                break;
            else
                node = node->next;
        }
        if(node == 0)
            printf("查无此人\n");
        else
        {
            memset(node->name,0,20);
            printf("请输入姓名:"); 
            scanf("%s",node->name);
            printf("请输入性别:");
            scanf(" %c",&node->sex);
            printf("请输入年龄:");
            scanf(" %d",&node->age);
            printf("请输入班级:");
            scanf(" %d",&node->grade);
            printf("请输入%d门课程的成绩:",NMBSCORE);
            for(i=0;i<NMBSCORE;i++)
                scanf("%d",&node->score[i]);
        }
        system("pause");
    }
    
    //删除学生信息
    void DeleteInfo(struct StNode* head)
    {
        struct StNode* node,*pre;
        int id,i;
        system("cls");
        printf("请输入需要删除信息的学生学号:");
        scanf("%d",&id);
        
        if (head->num == id)
        {
            node = head->next;
            free(head);
            head = node;
            printf("该学生信息已经删除\n");
            system("cls");
            return;
        }else
        {
            pre = head;
            node = head->next;
            while(node)
            {
                if (node->num == id)
                {
                    pre->next = node->next;
                    free(node);
                    node = 0;
                    printf("该学生信息已经删除\n");
                    system("pause");
                    return;
                }else
                {
                    pre = node;
                    node = node->next;
                }
            }
            printf("查无此人\n");
            system("pause");
        }
    }
    
    //学生信息统计
    void Tongji(struct StNode* head)
    {
        struct StNode* node;
        int opt = 0;
        int count = 0;
        char ch;
        int grade;
        system("cls");
        printf("1.按照性别统计\n");
        printf("2.按照年级统计\n");
        scanf("%d",&opt);
        switch(opt)
        {
        case 1:
            printf("请输入性别:");
            scanf(" %c",&ch);
            node = head;
            count = 0;
            while(node)
            {
                if(node->sex == ch)
                    count++;
                node = node->next;
            }
            printf("数量:%d\n",count);
            break;
        case 2:
            printf("请输入年级:");
            scanf("%d",&grade);
            node = head;
            count = 0;
            while(node)
            {
                if(node->grade == grade)
                    count++;
                node = node->next;
            }
            printf("数量:%d\n",count);
            break;
        }
        system("pause");
    }
    
    //学生信息保存
    void Save(const char* name,struct StNode* head)
    {
        struct StNode* node;
        FILE* fp;
        int i;
        system("cls");
        if ((fp = fopen(name,"w")) == 0)
        {
            printf("文件打开失败\n");
            system("pause");
            return;
        }
        node = head;
        while(node)
        {
            fprintf(fp,"%d%20s %c%4d%4d",node->num,node->name,node->sex,node->age,node->grade);
            for(i=0;i<NMBSCORE;i++)
                fprintf(fp,"%4d",node->score[i]);
            fprintf(fp,"\n");
            node = node->next;
        }
        fclose(fp);
        printf("文件保存成功!\n");
        system("pause");
    }
    
    int main()
    {
        struct StNode* head = 0;
        int opt = 0;
        int bgo = 1;
        char* filename = "students.txt";
    
        head = ReadFile(filename,head); //读取文件
        while(bgo)
        {
            system("cls");
            printf("--------------学生信息管理系统---------------|\n");
            printf("|   1.录入学生信息                           |\n");
            printf("|   2.显示所有学生信息                       |\n");
            printf("|   3.学生信息查询                           |\n");
            printf("|   4.学生信息修改                           |\n");
            printf("|   5.学生信息删除                           |\n");
            printf("|   6.学生信息统计                           |\n");
            printf("|   7.学生信息保存                           |\n");
            printf("|   0.退出系统                               |\n");
            printf("----------------------------------------------\n");
            scanf("%d",&opt);
            switch(opt)
            {
            case 0:
                bgo = 0;
                break;
            case 1:
                head = Input(head);
                break;
            case 2:
                showAll(head);
                break;
            case 3:
                Find(head);
                break;
            case 4:
                ModInfo(head);
                break;
            case 5:
                DeleteInfo(head);
                break;
            case 6:
                Tongji(head);
                break;
            case 7:
                Save(filename,head);
                break;
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥15 stable diffusion
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误