学生管理系统,C语言

学生管理系统是现在比较普遍的一个项目,如果用顺序表来进行存储,容易造成空间的浪费,如果用链表比较节省空间,而且增删便于操作
下面学生管理系统单链表的代码

头文件head.h

#ifndef _HEAD_H_
#define _HEAD_H_

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

#define N 32
typedef struct Data
{
    int id;
    char name[N];
    int china;
    int math;
    int english;
    float sore;
} Datatype;

typedef struct student
{
    Datatype *data;
    struct student *next;
} stu;

void menu();

void playgame();
//初始化
stu *Stucreat();

//插入数据初始化
void Stunum(stu *student);

//长度
int LLen(stu *student);

//数据的插入
void StuInsert(stu *student, int post);

//打印
void Stuprint(stu *student);

//删除
void Sdel(stu *student);

//修改
void Stualter(stu *student);

//查找按照姓名
void StuFindName(stu *student);

//位置查找
void StuFindPost(stu* student);

//avg计算平均分
void StuAvg(stu* student);

//order排序
void StuOrder(stu* student);//不足


float avg(stu* student);

//退出时清空链表,避免占用内存
void StuQuit(stu * student);

#endif

函数实现模块

#include "head.h"

//play
void playgame()
{
    int play;
    printf("1:play  2:exit\n");
    scanf("%d", &play);
    if (play != 1)
        return;
    //初始化
    stu *student = Stucreat();
    int flag = 1;
    menu();
    while (flag)
    {

        int choice;
        printf("请输入你的选择:");
        scanf("%d", &choice);
        getchar();
        switch (choice)
        {
        case 1:
            Stunum(student);
            break;
        case 2:
            Stuprint(student);
            break;
        case 3:
            Stualter(student);
            break;
        case 4:
            Sdel(student);
            break;
        case 5:
            StuFindName(student);
            break;
        case 6:
            StuFindPost(student);
            break;
        case 7:
            StuAvg(student);
            break;
        case 8:
            StuOrder(student);
            break;
        case 9:
            flag = 0;
            StuQuit(student);
            break;
        case 10:
            printf("len:%d\n", LLen(student));
            break;
        case 11:
            menu();
            break;
        default:
            break;
        }
    }
    free(student);
    student = NULL;
}
//menu
void menu()
{
    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("10:人数\n");
    printf("11:帮助菜单\n");
}
//初始化
stu *Stucreat()
{
    stu *student = (stu *)malloc(sizeof(stu));
    if (NULL == student)
    {
        printf("Stucreat err\n");
        return NULL;
    }
    student->next = NULL;
    return student;
}

//
//数据插入的初始化
void Stunum(stu *student)
{
    int num, post;
    printf("input student num:");
    scanf("%d", &num);
    for (int i = 0; i < num; i++)
    {
        printf("添加:post 的位置:");
        scanf("%d", &post);
        StuInsert(student, post);
    }
}

//数据的插入
void StuInsert(stu *student, int post)
{
    if (post < 0 || post > LLen(student))
    {
        printf("post err\n");
        return;
    }
    stu *Pnew = (stu *)malloc(sizeof(stu));
    if (NULL == Pnew)
    {
        printf("insert err\n");
        return;
    }
    Pnew->data = (Datatype *)malloc(sizeof(Datatype));
    if (NULL == Pnew->data)
    {
        printf("insert data err\n");
        return;
    }
    printf("学号:  姓名:   语文成绩:  数学成绩:  英语成绩:\n");
    scanf("%d    %s    %d    %d    %d", &(Pnew->data->id), Pnew->data->name, &(Pnew->data->china), &(Pnew->data->math), &(Pnew->data->english));
    for (int i = 0; i < post; i++)
        student = student->next;
    Pnew->next = student->next;
    student->next = Pnew;
}

//长度
int LLen(stu *student)
{
    int len = 0;
    while (student->next != NULL)
    {
        len++;
        student = student->next;
    }
    return len;
}

//打印
void Stuprint(stu *student)
{
    if (LLen(student) == 0)
    {
        printf("student table empty ,err\n");
        return;
    }
    printf("学号:姓名:语文成绩:数学成绩:英语成绩:平均分\n");
    while (student->next != NULL)
    {
        student = student->next;

        printf("%d\t%s\t%d\t%d\t%d\t%f\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english, student->data->sore);
    }
    putchar(10);
}

//删除
void Sdel(stu *student)
{
    int post;
    printf("del: post:");
    scanf("%d", &post);
    if (post < 0 || post >= LLen(student))
    {
        printf("Del post err\n");
        return;
    }
    for (int i = 0; i < post; i++)
        student = student->next;
    stu *Pdel = student->next;
    student->next = Pdel->next;
    free(Pdel);
    Pdel = NULL;
}

//修改
void Stualter(stu *student)
{
    int post;
    printf("alter: post:");
    scanf("%d", &post);
    if (post < 0 || post >= LLen(student))
    {
        printf("alter post err\n");
        return;
    }
    for (int i = 0; i <= post; i++)
        student = student->next;
    int num;
    printf("1:学号  2:姓名   3:语文成绩  4:数学成绩  5:英语成绩\n");
    scanf("%d", &num);
    if (num == 1)
    {
        int id;
        printf("input alter id:");
        scanf("%d", &id);
        student->data->id = id;
    }
    else if (num == 2)
    {
        char name[N];
        printf("aler name");
        scanf("%s", name);
        strcpy(student->data->name, name);
    }
    else
    {
        int sore = 0;
        printf("alter sore ");
        scanf("%d", &sore);
        if (num == 3)
            student->data->china = sore;
        else if (num == 4)
            student->data->math = sore;
        else
            student->data->english = sore;
    }
}

//查找按照姓名
void StuFindName(stu *student)
{
    char name[32] = {0};
    printf("input find name: ");
    scanf("%s", name);
    while (student->next != NULL)
    {
        student = student->next;
        if (strcmp(name, student->data->name) == 0)
        {
            printf("%d\t%s\t%d\t%d\t%d\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english);
            return;
        }
    }
    printf("no name\n");
}

//位置查找
void StuFindPost(stu *student)
{
    int post;
    printf("Find: post:");
    scanf("%d", &post);
    if (post < 0 || post >= LLen(student))
    {
        printf("Find post err\n");
        return;
    }
    for (int i = 0; i < post; i++)
        student = student->next;
    printf("1:学号  2:姓名   3:语文成绩  4:数学成绩  5:英语成绩\n");
    printf("%d\t%s\t%d\t%d\t%d\n", student->data->id, student->data->name, student->data->china, student->data->math, student->data->english);
}

//avg
void StuAvg(stu *student)
{
    if (LLen(student) == 0)
    {
        printf("student table empty ,err\n");
        return;
    }
    while (student->next != NULL)
    {
        student = student->next;
        student->data->sore = avg(student);
    }
}

float avg(stu *student)
{
    float sore = ((student->data->china) + (student->data->math) + (student->data->english)) / 3;
    return sore;
}

//order
void StuOrder(stu *student)
{
    if (LLen(student) == 0)
    {
        printf("student table empty ,err\n");
        return;
    }
    int len = LLen(student);
    stu *Ptmp = NULL;
    stu *pretmp = NULL;
    stu *H = NULL;
    int w = 0;
    for (int i = 0; i < len - 1; i++)
    {
        H = student;
        while (H->next->next != NULL)
        {
            pretmp = H->next;           //0
            Ptmp = H->next->next; //1
            if (pretmp->data->sore < Ptmp->data->sore)
            {
                H->next = Ptmp;
                pretmp->next = Ptmp->next;
                Ptmp->next = pretmp;
            }
            H = H->next;
        }
    }
}

void StuQuit(stu *student)
{
    stu *Pdel = NULL;
    while (student->next != NULL)
    {
        Pdel = student->next;
        student->next = Pdel->next;
        free(Pdel);
        Pdel = NULL;
    }
}

主函数的代码

#include "head.h"

int main(int argc, char const *argv[])
{
    playgame();
    return 0;
}

希望以上内容对大家有所帮助,不解的可以留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值