班级管理系统 链表实现

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

typedef struct score {
    int score;
}score;

typedef struct student {
    char id[20];
    char name[20];
    char sex[10];
    score sco[5];
    char ocu[10];          //职务
    int isTeacher;
    struct student *next;  //指向下一个学生的指针
}student, *List;

#define MAXSIZE 100

typedef struct SCHOOL {
    student* s;
    char classname[20];
}SCHOOL;

SCHOOL S[MAXSIZE];                  //存放所有班级的头结点和班级名
List L = NULL;                      //一个指向student类型的头指针
List p = NULL, r = NULL;            //游动指针
int i, j;
int classnum = 0;                   //现有班级数量
FILE* fp;

void welcome();                     //欢迎界面
void menu();                        //功能选择菜单
void login();
void newclass();                    //新建班级
void display();                     //显示全部班级成员信息
void printC();                      //打印现有的班级编号和年龄
List input();                       //输入班级成员信息
void numListDelete(char str[20]);   //按照学号删除学生信息
void nameListDelete(char str[20]);  //按照姓名删除学生信息
void searchnum();                   //按照学号查询学生信息
void searchname();                  //按照姓名查询学生信息
void mergeList();                   //合并班级
List Init_list_L();                 //创建一个空表
void DestroyL();                    //删除一个班级
void save();

int main() {
    welcome();
    login();
    p = (student*)malloc(sizeof(student));
    p->next = NULL;
    menu();
    return 0;
}

void welcome() {
    printf("                           * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           *                  欢迎使用班级信息管理系统                  *\n");
    printf("                           *                                                            *\n");
    printf("                           *                       *  *                                 *\n");
    printf("                           *                       *  *                                 *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           *                                                            *\n");
    printf("                           * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
    printf("Loading....\n");
    getchar();
    system("cls");
}
void login() {

    printf("\t\t\t*****************登陆******************\n\n");      //显示欢迎界面
    char psword[20] = "0000";  //设置原始密码为0000
    char inpsw[20];
    int q = 0;

    printf("\t\t\t*************请输入登录密码************\n");
    scanf("%s", inpsw);
    if (strcmp(psword, inpsw) != 0) {      //验证密码是否正确
        q = 1;
        printf("密码错误,请重新输入\n");

        while (q = 1) {
            scanf("%s", inpsw);
            if (strcmp(psword, inpsw) == 0)break;
            else printf("密码错误,请重新输入\n");
        }
    }
    printf("密码正确,进入班级信息管理系统\n");//若密码正确则进入学生信息系统
    printf("请按任意键继续...\n");
    getchar();
    system("cls");
}
void menu() {
start:printf("********************\n");
    system("cls");

    //以下为功能选择部分
    do {
        printf("\t\t\t********请选择你要进行的操作:***********\n");
        printf("\t\t\t*           1、新建班级                 *\n");
        printf("\t\t\t*           2、删除成员信息             *\n");
        printf("\t\t\t*           3、查询成员信息             *\n");
        printf("\t\t\t*           4、合并两个班级             *\n");
        printf("\t\t\t*           5、新建成员信息             *\n");
        printf("\t\t\t*           6、查看班级成员信息         *\n");
        printf("\t\t\t*           7、保存所有班级信息         *\n");
        printf("\t\t\t*           8、销毁班级                 *\n");
        printf("\t\t\t*           9、退出                     *\n");
        printf("\t\t\t*****************************************\n");
        int n;
        scanf("%d", &n);
        switch (n) {
        case 1:
            system("cls");
            newclass();
            break;
        case 2:
            system("cls");
            printf("按什么方式删除:1.姓名 2.学号(职工号)");
            int x;
            char str[20];
            scanf("%d", &x);
            if (x == 1)
            {
                printf("输入姓名:");
                scanf("%s", str);
                nameListDelete(str);
                break;
            }
            else if (x == 2) {
                printf("输入学号(职工号):");
                scanf("%s", str);
                numListDelete(str);
                break;
            }
            else printf("输入错误!请重新输入");
            break;
        case 3: system("cls");
            printf("输入按什么查询 \n1.姓名 2.学号(职工号)\n");
            int d;
            scanf("%d", &d);
            if (d == 1)
            {
                searchname(); break;
            }
            else if (d == 2) {
                searchnum(); break;
            }
            else printf("出错!请重新输入");
            break;
        case 4:
            system("cls");
            mergeList();
            break;
        case 5:
            system("cls");
            input();
            break;
        case 6:
            system("cls");
            display();
            break;
        case 7:
            system("cls");
            save();
            break;
        case 8:
            system("cls");
            DestroyL();
            break;
        case 9:
            system("exit");
            exit(0);
        default:
            system("cls");
            printf("您输入的信息有误\n");
            goto start;
        }
        getchar();
    } while (1);
}

List Init_list_L()
{
    L = (student*)malloc(sizeof(student));
    if (!L) {
        printf("创建空表失败!");
        exit(0);
    }
    L->next = NULL;
    return L;
}
void DestroyL() {
    if (classnum == 0) {
        printf("当前无可删除的班级!\n");
        return;
    }
    printC();
    printf("请选择你要销毁的班级编号\n");
    int k;
    scanf("%d", &k);
    L = S[k].s;
    for (i = k; i < classnum; i++)
        S[i] = S[i + 1];
    classnum--;
    printf("删除成功!\n");

}
void newclass() {
    S[classnum].s = Init_list_L();
    printf("\t\t\t请输入班级名\n");
    scanf("%s", S[classnum].classname);
    classnum++;
    printf("%s班级创建成功!\n\n\n\n\n", S[classnum].classname);

}
List input() {
    if (classnum == 0) {
        printf("\t\t\t当前无可插入的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("请选择你要插入的班级编号\n");
    scanf("%d", &i);
    L = S[i].s;

    while (1) {
        int a;
        p = (student*)malloc(sizeof(student));
        p->next = NULL;
        printf("1 录入成员信息\n2 退出功能\n");
        scanf("%d", &a); if (a == 1) {

            printf("请输入学生(老师)信息:\n\n");
            printf("是否是老师?是为1,不是为0(只能输入1或0)\n");
            scanf("%d", &p->isTeacher);
            printf("学号(职工号):\n");
            scanf("%s", p->id);
            printf("姓名:\n");
            scanf("%s", p->name);

            printf("性别(‘男’或‘女’):\n");
            scanf("%s", p->sex);

            if (p->isTeacher == 0)
            {
                for (i = 0; i < 5; i++) {
                    printf("成绩%d:\n", i + 1);
                    scanf("%d", &p->sco[i].score);
                }
            }
            else {
                for (i = 0; i < 5; i++)
                    p->sco[i].score = 0;
            }
            printf("职务:\n");
            scanf("%s", p->ocu);

            p->next = L->next;
            L->next = p;
        }
        else break;
    }
    printf("请按任意键继续....\n");
    getchar();
    system("cls");
    return L;
}
void display() {
    if (classnum == 0) {
        printf("当前无可显示的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("选择你要查看的班级编号:\n");
    scanf("%d", &i);
    p = S[i].s->next;
    if (p == NULL)
    {
        printf("error!");
        return;
    }
    printf("\t\t\t%s班级学生信息列表\n\n", S[i].classname);
    printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\n\n");

    while (p != NULL) {
        printf("\t\t%s\t\t%s\t%s\t", p->id, p->name, p->sex);
        if (p->isTeacher == 0)
        {
            for (int j = 0; j < 5; j++)
                printf(" %d\t", p->sco[j].score);
        }
        else
        {
            for (int h = 0; h < 5; h++)
                printf("\t");
        }
        printf("%s\t%d\t", p->ocu, p->isTeacher);
        printf("\n");
        p = p->next;
    }
}
void printC() {
    printf("现有的班级:\n");
    for (i = 0; i < classnum; i++) {
        printf("%d--%s\n", i, S[i].classname);
    }
}

void numListDelete(char str[20]) {
    if (classnum == 0) {
        printf("\t\t\t当前无可删除的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("请选择你要删除哪个班级的学生(老师),请选择编号\n");
    scanf("%d", &i);
    L = S[i].s;

    List q, p = L;
    if (L->next == NULL) {
        printf("班级内无学生\n");
        return;
    }

    int j = 0;
    while ((p->next) && strcmp(p->next->id, str) != 0)
    {
        p = p->next;
    }
    if (p->next == NULL) {
        printf("删除失败!此人不存在!\n");
        return;
    }
    else
    {
        q = p->next;
        p->next = q->next;
        free(q);
        printf("删除成功\n");
    }
    return;
}
void nameListDelete(char str[20]) {
    if (classnum == 0) {
        printf("\t\t\t当前无可删除的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("请选择你要删除哪个班级的学生(老师),请选择编号\n");
    scanf("%d", &i);
    L = S[i].s;
    List q, p = L;
    if (L->next == NULL)
        printf("班级内无学生\n");
    int j = 0;
    while (p->next &&strcmp(p->next->name, str) != 0)
    {
        p = p->next;
    }
    if (p == NULL)
    {
        printf("删除失败!此人不存在!\n");
        return;
    }
    else {
        q = p->next;
        p->next = q->next;
        free(q);
        printf("删除成功!\n");
    }
    return;
}
void searchnum()
{
    char str[20];
    if (classnum == 0) {
        printf("\t\t\t当前无可查询的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("请选择你要查询哪个班级的学生(老师),请选择编号\n");
    scanf("%d", &i);
    L = S[i].s;
    printf("输入你要查询的学生(老师)学号(职工号):\n");
    scanf("%s", str);
    List p, q = NULL;
    p = (student*)malloc(sizeof(student));
    p = L->next;
    int i = 0;
    while (p != NULL)
    {
        if (strcmp(p->id, str) == 0)
        {
            q = p;
        }
        p = p->next;
        i++;
    }
    if (q == NULL) {
        printf("查无此人!\n");
    }
    else {
        printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");

        printf("\t\t%s\t\t%s\t%s\t", q->id, q->name, q->sex);
        if (q->isTeacher == 0)
        {
            for (int j = 0; j < 5; j++)
                printf(" %d\t", q->sco[j].score);
        }
        else {
            printf("\t\t\t\t\t");
        }
        printf("\t\t%s\t%d\t", q->ocu, q->isTeacher);
        printf("\n\n");
    }
    return;
}
void searchname()
{
    char str[20];
    if (classnum == 0)
    {
        printf("\t\t\t当前无可查询的班级,返回主菜单新建一个吧!\n");
        return;
    }
    printC();
    printf("请选择你要查询哪个班级的学生(老师),请选择编号\n");
    scanf("%d", &i);
    L = S[i].s;
    printf("输入你要查询的学生(老师)姓名:\n");
    scanf("%s", str);
    List p, q = NULL;
    q = (student*)malloc(sizeof(student));
    p = L->next;
    int i = 0;
    while (p != NULL)
    {
        if (strcmp(p->name, str) == 0)
        {
            q = p;
        }
        p = p->next;
        i++;
    }
    if (q == NULL) {
        printf("查无此人!");
    }
    else
    {
        printf("\t\t学号\t\t姓名\t性别\t科目一\t科目二\t科目三\t科目四\t科目五\t职务\t是否是老师\t班级号\n\n");

        printf("\t\t%s\t\t%s\t%s\t", q->id, q->name, q->sex);
        if (q->isTeacher == 0)
        {
            for (int j = 0; j < 5; j++)
                printf("%d\t", q->sco[j].score);
        }
        else {
            printf(" \t\t\t\t\t");
        }
        printf("\t\t%s\t%d\t", q->ocu, q->isTeacher);
        printf("\n\n");
    }
    return;
}
void mergeList() {
    if (classnum < 2) {
        printf("当前班级数目少于两个,无法合并\n");
        printf("按任意键返回上级目录\n");
        getchar();
        return;
    }
    int a;
    printf("1 选择合并班级\n2 退出功能\n");
    scanf("%d", &a);
    if (a == 1) {
        printC();
        int t1, t2;
        printf("请输入你要合并的班级a,b(效果为将b合并到a班级)\n");
        scanf("%d %d", &t1, &t2);
        if (t1 >= 0 && t1 < classnum && t2 >= 0 && t2 < classnum) {
            List pa, pb;

            pa = S[t1].s;
            pb = S[t2].s;

            while (pa->next)
                pa = pa->next;
            pa->next = pb->next;

            for (i = t2; i < classnum; i++)
                S[i] = S[i + 1];
            classnum--;
            free(S[t2].s);
            printf("班级合并成功\n");
        }
        else
            printf("输入错误\n");
    }
    else return;
}
void save() {
    List p;
    int k;
    fp = fopen("studata.txt", "wb");
    fprintf(fp, "%d\n\n", classnum);
    for (i = 0; i < classnum; i++)
    {
        p = S[i].s->next;
        while (p != NULL) {
            fprintf(fp, "%s\t%s\t%s\t", p->id, p->name, p->sex);

            for (k = 0; k < 5; k++)
                fprintf(fp, "%d\t", p->sco[k].score);
            fprintf(fp, "%s\t%d\t\n\n", p->ocu, p->isTeacher);

            p = p->next;
        }
    }
    fclose(fp);
    printf("\n保存成功!\n");
    getchar();

}

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值