C语言链表实现班级管理系统

     上次用结构体数组做了一个图书管理系统,这次决定用链表实现一个简单的班级管理系统,还是先用create()函数第一次输入内容,之后使用可以直接从文件中读取。
#include<stdio.h>
#include<stdlib.h>
#define M 20


//定义学生的结构体
 typedef struct noab
 {
    int id;
    char name[M];
    char classroom[M];
    float score;
    struct node *next;
 }student;
student *init()
{
    student *p,*q,*head;
    int i,a;
    int n=0;
    printf("输入学生信息的个数\n");
    scanf("%d",&a);

    head=NULL;
    for(i=0;i<a;i++)
    {
        p=(student *)malloc(sizeof(student));
        printf("输入第%d个学生的信息\n",i+1);
        printf("学号:");
        scanf("%d",&p->id);
        printf("姓名:");
        getchar();
        gets(p->name);
        printf("班级:");
        gets(p->classroom);
        printf("成绩:");
        scanf("%f",&p->score);
        n=n+1;
        if(n==1)
        {
            head=p;
            q=p;
            q->next=NULL;

        }else
        {
            q->next=p;
            q=p;
            p->next=NULL;
        }
    }
    return head;
}
void display (student *head)
{
    student *p=head;
    while(p)
    {
        printf("学生的学号为%d,姓名为%s,班级为%s,分数为%f\n",p->id,p->name,p->classroom,p->score);
        p=p->next;
    }
}

student *addStudent(student *head)
{
    student *p,*q;
    q=head;
    while(q->next) q=q->next;
     p=(student *)malloc(sizeof(student));
        printf("学号:");
        scanf("%d",&p->id);
        printf("姓名:");
        getchar();
        gets(p->name);
        printf("班级:");
        gets(p->classroom);
        printf("成绩:");
        scanf("%f",&p->score);
        p->next=NULL;
        q->next=p;
        return head;
}

student *deleteStudent(student *head)
{
    int a;
    student *pre=NULL,*p;
    printf("请输入要删除的id");
    scanf("%d",&a);
    if(!head) {printf("系统中已经没有数据可以删除\n");return head;}
    p=head;
    while(p&&p->id!=a)
    {
        pre=p;
        p=p->next;
    }
    if(p)
    {
        if(!pre) head =head->next;
        else pre->next=p->next;
        free(p);
    }
    return head;

}

student *correctStudent(student *head)
{
    int a;
    student *p;
    printf("请输入要修改的学生的id");
    scanf("%d",&a);
    if(!head) {printf("系统中已经没有数据可以修改\n");return head;}
    p=head;
    while(p&&p->id!=a)
    {
        p=p->next;
    }
    if(p==NULL){printf("没有查到要修改的学生的id\n");return head;}
    else
    {
        printf("学号:");
        scanf("%d",&p->id);
        printf("姓名:");
        getchar();
        gets(p->name);
        printf("班级:");
        gets(p->classroom);
        printf("成绩:");
        scanf("%f",&p->score);
    }
    return head;
}
void writeFile(student *head)
{
    FILE *outf;
    student *p=head;
    if((outf = fopen("data.txt","wb")) == NULL) {
        printf("不能打开数据文件。\n");
        exit(1);
    }
    while(p) {
        fwrite(p,sizeof(student),1,outf);
        p = p->next;
    }
    fclose(outf);
}

student *readFile(student *head)
{
    int n=0;
    student temp;
    FILE *inf;
    student *p=NULL,*q;
    if((inf = fopen("data.txt","rb")) == NULL) {
        printf("不能打开数据文件。\n");
        exit(1);
    }
    while(fread(&temp,sizeof(student),1,inf)!=0)
    {
        p=(student *)malloc(sizeof(student));
        p->id=temp.id;
        p->score=temp.score;
        strcpy(p->name,temp.name);
        strcpy(p->classroom,temp.classroom);
        n++;
        if(n==1){head=p;q=p;}
        else
        {
            q->next=p;
            q=q->next;
        }

    }
    q->next=NULL;
    fclose(inf);
    return head;
}

void main()
{
    int a;
    student *head,*p;
    //head=init();
    head=readFile(head);

    do
    {
       printf("欢迎使用学生管理系统\n");
       printf("1:增加学生\n2:删除学生\n3:修改信息\n4:显示所有信息\n5:退出系统\n");
       printf("请输入您想进行的操作是:\n");
       scanf("%d",&a);
       switch(a)
       {
           case 1:head=addStudent(head);break;
           case 2:head=deleteStudent(head);break;
           case 3:head=correctStudent(head);break;
           case 4:display(head);break;

       }

   }while(a != 5);
   writeFile(head);

}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、软件开发目的 该软件主要是使用C语言设计开发一个简单的班级同学信息管理系统实现班级同学信息录入和管理功能。 二、数据结构 程序采用结构体数组存储班级同学的信息。结构体成员包括:姓名,学号,宿舍,QQ号码和电话号码等。数组的长度不超过70。 三、软件功能说明 1.学生信息的录入和保存 首先提示输入学生人数,接着是分别输入每个学生的信息包括:姓名,学号,宿舍,QQ号码和电话号码等。在录入数据的同时,系统将对信息的合法性进行检验(学号范围为1~70),若用户录入了不合法的数据系统应作出提示,并且要求重新输入。录入完毕后系统保存全部学生相关信息。 2.显示学生信息 将学生信息在屏幕上列表输出。要求先显示提示信息“姓名 学号 宿舍 QQ号码 电话号码”,然后再显示学生信息,每行显示一名学生的信息。 3.查询学生信息 按学号查询,输出学生姓名 学号 宿舍 QQ号码 电话号码。 按姓名查询,输出学生姓名 学号 宿舍 QQ号码 电话号码。 4.修改信息 按学号或姓名修改, 只能修改学生的“宿舍、QQ号码、电话号码”。(要求输入密码) 5.删除学生信息 通过学生的学号对某个学生全部信息进行删除,并将删除后的学生信息列表输出,以方便用户确认。 6.追加学生信息 输入新学生的相关信息,将新的信息插入原学生信息清单,并将新的学生信息列表输出,以方便用户确认。 7.排序 (1)按照学号排序显示所有同学的纪录 (2)按照姓名排序显示所有同学的纪录 8.退出系统,结束任务。
学生成绩管理系统可以使用链表法来进行设计,链表是一种常用的数据结构,可以方便地实现插入、删除、查找等操作。下面是使用链表实现学生成绩管理系统的思路: 1. 定义链表节点结构体,包括学生信息和成绩等数据成员,同时定义指向下一个节点的指针。 ``` struct Node { char no[10]; // 学号 char name[20]; // 姓名 char sex[10]; // 性别 char class[20]; // 班级 float chinese; // 语文成绩 float math; // 数学成绩 float english; // 英语成绩 float physics; // 物理成绩 float chemistry; // 化学成绩 float biology; // 生物成绩 float total; // 总分 float average; // 平均分 int rank; // 排名 struct Node *next; // 指向下一个节点的指针 }; ``` 2. 创建链表,包括初始化链表头节点、添加节点等操作。 ``` struct Node *head = NULL; // 链表头节点 // 初始化链表头节点 head = (struct Node*)malloc(sizeof(struct Node)); strcpy(head->no, ""); strcpy(head->name, ""); strcpy(head->sex, ""); strcpy(head->class, ""); head->chinese = 0; head->math = 0; head->english = 0; head->physics = 0; head->chemistry = 0; head->biology = 0; head->total = 0; head->average = 0; head->rank = 0; head->next = NULL; // 添加节点 struct Node *p = NULL; // 新节点 p = (struct Node*)malloc(sizeof(struct Node)); strcpy(p->no, "20210101"); strcpy(p->name, "张三"); strcpy(p->sex, "男"); strcpy(p->class, "2021"); p->chinese = 90; p->math = 80; p->english = 85; p->physics = 75; p->chemistry = 80; p->biology = 70; p->total = p->chinese + p->math + p->english + p->physics + p->chemistry + p->biology; p->average = p->total / 6.0; p->rank = 1; p->next = head->next; head->next = p; ``` 3. 实现学生成绩管理系统的各个功能模块,包括录入学生信息和成绩、计算学生成绩、查询学生成绩、修改学生成绩、删除学生成绩、统计学生成绩等。 ``` // 录入学生信息和成绩 void add_student() { struct Node *p = NULL; // 新节点 p = (struct Node*)malloc(sizeof(struct Node)); printf("请输入学号:"); scanf("%s", p->no); printf("请输入姓名:"); scanf("%s", p->name); printf("请输入性别:"); scanf("%s", p->sex); printf("请输入班级:"); scanf("%s", p->class); printf("请输入语文成绩:"); scanf("%f", &p->chinese); printf("请输入数学成绩:"); scanf("%f", &p->math); printf("请输入英语成绩:"); scanf("%f", &p->english); printf("请输入物理成绩:"); scanf("%f", &p->physics); printf("请输入化学成绩:"); scanf("%f", &p->chemistry); printf("请输入生物成绩:"); scanf("%f", &p->biology); p->total = p->chinese + p->math + p->english + p->physics + p->chemistry + p->biology; p->average = p->total / 6.0; p->rank = 1; p->next = head->next; head->next = p; } // 计算学生成绩 void calculate_score() { struct Node *p = head->next; while(p != NULL) { p->total = p->chinese + p->math + p->english + p->physics + p->chemistry + p->biology; p->average = p->total / 6.0; p = p->next; } } // 查询学生成绩 void search_score() { char no[10]; printf("请输入要查询的学生学号:"); scanf("%s", no); struct Node *p = head->next; while(p != NULL) { if(strcmp(p->no, no) == 0) { printf("学号:%s\t姓名:%s\t性别:%s\t班级:%s\n", p->no, p->name, p->sex, p->class); printf("语文:%5.1f\t数学:%5.1f\t英语:%5.1f\t物理:%5.1f\t化学:%5.1f\t生物:%5.1f\n", p->chinese, p->math, p->english, p->physics, p->chemistry, p->biology); printf("总分:%5.1f\t平均分:%5.1f\t排名:%d\n", p->total, p->average, p->rank); return; } p = p->next; } printf("未找到该学生!\n"); } // 修改学生成绩 void modify_score() { char no[10]; printf("请输入要修改的学生学号:"); scanf("%s", no); struct Node *p = head->next; while(p != NULL) { if(strcmp(p->no, no) == 0) { printf("请输入修改后的语文成绩:"); scanf("%f", &p->chinese); printf("请输入修改后的数学成绩:"); scanf("%f", &p->math); printf("请输入修改后的英语成绩:"); scanf("%f", &p->english); printf("请输入修改后的物理成绩:"); scanf("%f", &p->physics); printf("请输入修改后的化学成绩:"); scanf("%f", &p->chemistry); printf("请输入修改后的生物成绩:"); scanf("%f", &p->biology); p->total = p->chinese + p->math + p->english + p->physics + p->chemistry + p->biology; p->average = p->total / 6.0; return; } p = p->next; } printf("未找到该学生!\n"); } // 删除学生成绩 void delete_score() { char no[10]; printf("请输入要删除的学生学号:"); scanf("%s", no); struct Node *p1 = head->next; struct Node *p2 = head; while(p1 != NULL) { if(strcmp(p1->no, no) == 0) { p2->next = p1->next; free(p1); printf("删除成功!\n"); return; } p2 = p1; p1 = p1->next; } printf("未找到该学生!\n"); } // 统计学生成绩 void statistics_score() { float chinese_sum = 0, math_sum = 0, english_sum = 0, physics_sum = 0, chemistry_sum = 0, biology_sum = 0; int count = 0, pass_count = 0, excellent_count = 0; struct Node *p = head->next; while(p != NULL) { chinese_sum += p->chinese; math_sum += p->math; english_sum += p->english; physics_sum += p->physics; chemistry_sum += p->chemistry; biology_sum += p->biology; count++; if(p->total >= 60) { pass_count++; } if(p->total >= 90) { excellent_count++; } p = p->next; } printf("班级语文平均分:%5.1f\t数学平均分:%5.1f\t英语平均分:%5.1f\t物理平均分:%5.1f\t化学平均分:%5.1f\t生物平均分:%5.1f\n", chinese_sum/count, math_sum/count, english_sum/count, physics_sum/count, chemistry_sum/count, biology_sum/count); printf("班级及格率:%5.1f%%\t班级优秀率:%5.1f%%\n", pass_count*100.0/count, excellent_count*100.0/count); } ``` 以上是使用链表实现学生成绩管理系统的思路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值