zoukankan      html  css  js  c++  java
  • c语言 文件链表实现最简单的学生管理系统


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

    typedef struct student
    {
    int st_id;
    char st_name[20];
    double st_score;
    struct student* st_next;
    }stu_t,*pstu_t;

    typedef struct user
    {
    int us_id;
    char us_password[20];
    int us_permission; //注意只能输入0或者1
    struct user* us_next;
    }use_t,*puse_t;

    void backtofun1(); //返回管理员查询学生信息的主界面
    /*-------------------------------------将文件中信息保存到链表--------------------------------------------------*/
    void file_to_user_link(puse_t* head) //从文件中读取数据存到链表中,建立链表。
    {
    FILE *fp_src;
    char line[128];
    puse_t pnew; //即将插入的节点
    puse_t ptail; //当前链表的最后一个节点

    char *path = "E:\user.txt";

    fp_src = fopen(path,"r");
    if(fp_src == NULL)
    {
    fprintf(stderr,"fopen fail");
    return 1;
    }
    while(memset(line,0,sizeof(line)),fgets(line,sizeof(line),fp_src)!=NULL)
    {
    pnew = (puse_t)calloc(1,sizeof(use_t));//为新节点分配一个结构体,初始为空
    sscanf(line,"%d%s%d",&pnew->us_id,pnew->us_password,&pnew->us_permission);

    if(*head == NULL)
    *head = pnew;
    else
    ptail->us_next = pnew;
    ptail = pnew;
    }
    fclose(fp_src);
    }

    void file_to_link_student(pstu_t* head) //从文件中读取数据存到链表中,建立链表。
    {
    FILE *fp_config;
    FILE *fp_src;
    char line[128];
    pstu_t pnew;//即将插入的节点
    pstu_t ptail;//当前链表的最后一个节点

    char *path = "E:\stu.txt";

    fp_src = fopen(path,"r");
    if(fp_src == NULL)
    {
    fprintf(stderr,"fopen fail");
    return 1;
    }
    while(memset(line,0,sizeof(line)),fgets(line,sizeof(line),fp_src)!=NULL)
    {
    pnew = (pstu_t)calloc(1,sizeof(stu_t));//为新节点分配一个结构体,初始为空
    sscanf(line,"%d%s%lf",&pnew->st_id,pnew->st_name,&pnew->st_score);

    if(*head == NULL)
    *head = pnew;
    else
    ptail->st_next = pnew;
    ptail = pnew;
    }
    fclose(fp_src);
    }

    /*----------------------------------------------登陆系统---------------------------------------------------*/

    void login() //普通用户登陆后显示自己的成绩,管理员登陆后进入管理员界面
    {
    pstu_t stu = NULL;
    puse_t head = NULL;
    puse_t pcur,ppre;
    char password[20];
    int ID;
    int wrongtime = 0;

    //读取用户文件中的信息到用户链表中
    file_to_user_link(&head);
    file_to_link_student(&stu);

    pcur = head;
    ppre = NULL;
    //没有找到符合条件的指针时候将指针依次向后挪
    //如果找到用户名且密码匹配
    while(wrongtime != 3)
    {
    printf(" 欢迎使用wyt的学生管理系统 请输入用户名: ");
    scanf("%d",&ID);

    printf("请输入密码:");
    fflush(stdout);
    fflush(stdin);
    scanf("%s",password);
    while(pcur != NULL)
    {
    if(pcur->us_id == ID )//如果用户名找到
    {
    if(strcmp(pcur->us_password,password)== 0)//判断密码输入是不是正确
    {
    if(pcur->us_permission == 2)//如果密码输入正确,根据用户ID判断权限进入不同界面
    {
    manager();
    break;
    }
    else
    {
    common_user(stu,ID);
    break;
    }
    }
    else
    {
    printf("密码输入错误。您还有%d次输入机会",2-wrongtime);
    wrongtime++;
    if(wrongtime == 3 )
    printf("对不起,您已经连续三次输入错误密码。");
    break;

    }
    }
    else //没有找到输入的用户名匹配的用户ID,继续向下寻找。
    {
    ppre = pcur;
    pcur = pcur->us_next;
    }
    }
    if(pcur == NULL)
    printf("没有找到用户.");

    }

    }

    /*---------------------------------------------普通用户登陆成功后的界面------------------------------------------------------------*/
    void common_user(pstu_t head,int search_id) //普通用户登陆成功后的界面,可以查询自己的成绩。
    {
    pstu_t pcur,ppre;
    system("cls");
    pcur = head;
    ppre = NULL;

    printf("hello,欢迎使用本系统查询您的成绩 ");
    //没有找到符合条件的指针时候将指针依次向后挪
    while(pcur != NULL && pcur->st_id != search_id)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }
    if(pcur != NULL)
    fprintf(stdout,"%5d%10s%7.2f",pcur->st_id,pcur->st_name,pcur->st_score);
    else
    printf("没有找到该学生。");

    }
    /*---------------------------------------------管理员登陆成功后界面--------------------------------------------------------*/
    void manager() //管理员登陆成功后的界面。
    {
    int i;

    pstu_t stu = NULL;

    puse_t user = NULL;
    system("cls");
    //读取用户文件中的信息到用户链表中
    file_to_user_link(&user);

    //读取学生文件中的信息到学生链表中
    file_to_link_student(&stu);

    printf("欢迎进入学生管理系统 ");
    printf("1.查询学生信息 ");
    printf("2.增加学生信息 ");
    printf("3.更新学生信息 ");
    printf("4.删除学生信息 ");
    printf("5.查询用户信息 ");
    printf("6.增加用户信息 ");
    printf("7.更新用户信息 ");
    printf("8.删除用户信息 ");
    printf("9.退出 ");
    printf("请输入您的选择: ");
    scanf("%d",&i);
    switch(i)
    {
    case 1:fun1();
    break;
    case 2:fun2(); //增加学生信息。
    break;
    case 3:fun3();
    break;
    case 4:fun4();
    break;
    case 5:fun5();
    break;
    case 6:fun6();
    break;
    case 7:fun7();
    break;
    case 8:fun8();
    break;
    case 9:exit(0);
    break;
    }

    }
    void backtofun()
    {
    for(;;)
    {
    printf(" 还需要操作么?如果需要操作请输入:yes,否则请输入:no ");
    char flag[20];
    scanf("%s",flag);
    if(strcmp(flag,"yes")==0)
    manager();
    else if(strcmp(flag,"no")==0)
    exit(0);
    printf("输入错误,请重新输入 ");
    }
    }
    /*--------------------------------------------管理员查询学生信息界面--------------------------------------------------------------*/

    void search_student(pstu_t head) //查询所有学生的信息
    {
    pstu_t pcur;
    pcur = head;
    while(pcur != NULL)
    {
    printf("%-5d%-10s%5.2f ",pcur->st_id,pcur->st_name,pcur->st_score);
    pcur = pcur->st_next;
    }
    backtofun1();
    }
    void search_by_id(pstu_t head) //按学号搜索。
    {
    pstu_t pcur,ppre;
    pcur = head;
    ppre = NULL;

    int search_id;
    printf(" 按学号查找 请输入学号");
    scanf("%d",&search_id);

    //没有找到符合条件的指针时候将指针依次向后挪
    while(pcur != NULL && pcur->st_id != search_id)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }
    if(pcur != NULL)
    fprintf(stdout,"%5d%10s%7.2f",pcur->st_id,pcur->st_name,pcur->st_score);
    else
    printf("没有找到该学生。");

    backtofun1();
    }
    void search_by_name(pstu_t head) //按姓名搜索。
    {
    pstu_t pcur,ppre;
    pcur = head;
    ppre = NULL;

    char search_name[100];
    printf(" 按姓名查找 请输入姓名");
    fflush(stdout);
    fflush(stdin);
    fgets(search_name,sizeof(search_name),stdin);

    //没有找到符合条件的指针时候将指针依次向后挪
    while(pcur != NULL && memcmp(pcur->st_name,search_name,strlen(pcur->st_name)) != 0)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }
    if(pcur != NULL)
    fprintf(stdout,"%5d%10s%7.2f",pcur->st_id,pcur->st_name,pcur->st_score);
    else
    printf("没有找到该学生。");

    backtofun1();

    }
    void fun1() //管理员查询学生信息界面。
    {
    pstu_t stu = NULL;
    int i;

    system("cls");
    file_to_link_student(&stu);
    printf("学生管理系统查询信息界面 ");
    printf("1.查询所有学生信息 ");
    printf("2.按学号查询学生信息 ");
    printf("3.按姓名查询学生信息 ");
    printf("4.返回上一级");
    printf("请输入您的选择: ");
    scanf("%d",&i);

    switch(i)
    {
    case 1:search_student(stu);
    break;
    case 2:search_by_id(stu);
    break;
    case 3:search_by_name(stu);
    break;
    case 4:manager();
    break;
    }
    }

    void backtofun1() //返回管理员查询学生信息的主界面
    {
    for(;;)
    {
    printf(" 还需要操作么?如果需要操作请输入:yes,否则请输入:no ");
    char flag[20];
    scanf("%s",flag);
    if(strcmp(flag,"yes")==0)
    fun1();
    else if(strcmp(flag,"no")==0)
    exit(0);
    printf("输入错误,请重新输入 ");
    }
    }

    /*--------------------------------------------学生增加---------------------------------------------------------------------------------*/

    void link_to_file_student(pstu_t head) //将学生链表中的数据保存到学生文件中。
    {
    FILE *fp;
    pstu_t pcur;
    char *path = "E:\stu.txt";
    pcur = head;

    if((fp=fopen(path,"w"))==NULL) //如果用a的话会重复写入,因为是用指针写入的,
    {
    printf("cannot open file");
    exit(0);
    }
    while(pcur != NULL)
    {
    fprintf(fp,"%5d%10s%7.2f ",pcur->st_id,pcur->st_name,pcur->st_score);
    pcur = pcur->st_next;
    }
    fclose(fp);
    }

    void search_all_student(pstu_t head) //打印所有学生的信息
    {
    pstu_t pcur;
    pcur = head;
    while(pcur != NULL)
    {
    printf("%-5d%-10s%5.2f ",pcur->st_id,pcur->st_name,pcur->st_score);
    pcur = pcur->st_next;
    }
    }

    void add_stu(pstu_t *head) //增加学生信息
    {

    int i;
    pstu_t pcur,ppre;
    pstu_t pnew;
    char line[128];

    system("cls");
    printf("学生管理系统录入学生信息界面 ");
    printf("请输入要录入的学生的信息: ");
    printf("学号 姓名 成绩 ");
    fflush(stdout); //要加这几句,否则缓冲区中会有东西导致程序出错

    fflush(stdin);

    memset(line,0,sizeof(line));
    fgets(line,sizeof(line),stdin);

    pnew=(pstu_t)calloc(1,sizeof(stu_t));
    sscanf(line,"%d%s%lf",&pnew->st_id,pnew->st_name,&pnew->st_score);

    pcur = *head;
    ppre = NULL;

    while(pcur !=NULL && pcur->st_id<=pnew->st_id)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }
    if(ppre == NULL)
    {
    pnew->st_next = *head;
    *head = pnew;
    }
    else
    {
    ppre->st_next = pnew;
    pnew->st_next = pcur;
    }
    }

    void fun2() //增加学生信息的主函数
    {
    pstu_t stu = NULL;
    file_to_link_student(&stu);
    add_stu(&stu);

    link_to_file_student(stu);
    search_all_student(stu);
    backtofun();

    }
    /*------------------------------------------修改学生信息---------------------------------------------------------------*/

    void student_change(pstu_t *head,int val) //更改学生的函数
    {
    //找到要修改的节点,把原来的数据置为空,然后输入新的数据
    pstu_t ppre,pcur;
    ppre = NULL;
    pcur = *head;
    pstu_t ptem;

    char line[128];

    while(pcur!=NULL && pcur->st_id != val)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }

    if(pcur->st_id == val)
    {
    memset(line,0,sizeof(line));
    printf("输入要修改的值 学号 姓名 成绩 ");
    fflush(stdout);

    fflush(stdin);

    fgets(line,sizeof(line),stdin);
    ptem = (pstu_t)calloc(1,sizeof(stu_t));
    sscanf(line,"%d%s%lf",&ptem->st_id,ptem->st_name,&ptem->st_score);
    pcur->st_id = ptem->st_id;
    memcpy(pcur->st_name,ptem->st_name,sizeof(ptem->st_name));
    pcur->st_score = ptem->st_score;
    }
    }

    void fun3() //修改学生信息的主函数
    {
    int n;
    pstu_t stu = NULL;
    file_to_link_student(&stu);
    search_all_student(stu);

    printf("输入要修改的学号: ");
    scanf("%d",&n);
    student_change(&stu,n);
    search_all_student(stu);
    link_to_file_student(stu);

    backtofun();
    }

    /*------------------------------------------删除学生---------------------------------------------------------------*/

    void student_delete(pstu_t *head,int val) //删除学生
    {
    pstu_t pcur,ppre;
    pcur = *head;
    ppre = NULL;
    //没有找到符合条件的指针时候将指针依次向后挪
    while(pcur != NULL && pcur->st_id != val)
    {
    ppre = pcur;
    pcur = pcur->st_next;
    }

    //上述退出循环时候的指针要么是要找的指针,要么是尾部指针没有找到要删除的节点
    if(pcur != NULL)
    {
    if(ppre == NULL)//如果要删除的节点就是头指针
    {
    *head = pcur->st_next;
    free(pcur);
    pcur = NULL;
    }
    else //要删除的节点不是头指针
    {
    ppre->st_next = pcur->st_next;
    free(pcur);
    pcur = NULL;
    }

    }

    }

    void fun4() //删除学生的主函数
    {
    int n;
    pstu_t stu = NULL;
    file_to_link_student(&stu);
    search_all_student(stu);

    printf("输入要删除的学号: ");
    scanf("%d",&n);
    student_delete(&stu,n);
    search_all_student(stu);
    link_to_file_student(stu);

    backtofun();
    }

    /*------------------------------------------查询用户信息------------------------------------------------------------*/
    void search_user(puse_t head) //查询所有用户的信息
    {
    puse_t pcur;
    system("cls");
    pcur = head;
    printf("欢迎进入用户信息查询界面 ");
    printf("用户ID 密码 权限(2代表管理员,1代表普通用户) ");
    while(pcur != NULL)
    {
    printf("%-5d%-10s%-5d ",pcur->us_id,pcur->us_password,pcur->us_permission);
    pcur = pcur->us_next;
    }
    }

    void fun5() //查询用户信息主函数
    {
    printf("查询用户信息");
    puse_t head = NULL;
    file_to_user_link(&head);
    search_user(head);

    backtofun();
    }

    /*------------------------------------------增加用户信息-----------------------------------------------------------------*/
    void link_to_file_user(puse_t head) //将链表中的数据保存到用户文件中。
    {
    FILE *fp;
    puse_t pcur;
    char *path = "E:\user.txt";
    pcur = head;

    if((fp=fopen(path,"w"))==NULL)//如果用a的话会重复写入,因为是用指针写入的,
    {
    printf("cannot open file");
    exit(0);
    }
    while(pcur != NULL)
    {
    fprintf(fp,"%-5d%-10s%-5d ",pcur->us_id,pcur->us_password,pcur->us_permission);
    pcur = pcur->us_next;
    }
    fclose(fp);
    }


    void add_user(puse_t *head) //增加用户信息
    {

    int i;
    puse_t pcur,ppre;
    puse_t pnew;
    char line[128];

    system("cls");
    printf("学生管理系统录入用户信息界面 ");
    printf("请输入要录入的用户的信息: ");
    printf("用户ID 密码 权限(2代表管理员,1代表普通用户) ");
    fflush(stdout);
    fflush(stdin);
    memset(line,0,sizeof(line));
    fgets(line,sizeof(line),stdin);

    pnew = (puse_t)calloc(1,sizeof(use_t));//为新节点分配一个结构体,初始为空
    sscanf(line,"%d%s%d",&pnew->us_id,pnew->us_password,&pnew->us_permission);

    pcur = *head;
    ppre = NULL;

    while(pcur !=NULL && pcur->us_id<=pnew->us_id)
    {
    ppre = pcur;
    pcur = pcur->us_next;
    }
    if(ppre == NULL)
    {
    pnew->us_next = *head;
    *head = pnew;
    }
    else
    {
    ppre->us_next = pnew;
    pnew->us_next = pcur;
    }

    }

    void fun6() //增加用户信息主函数
    {
    printf("增加用户信息");
    puse_t head = NULL;
    file_to_user_link(&head);
    search_user(head);
    add_user(&head);
    link_to_file_user(head);
    search_user(head);
    backtofun();
    }


    /*------------------------------------------修改用户信息-----------------------------------------------------------------*/
    void user_change(puse_t *head,int val) //修改用户信息
    {
    //找到要修改的节点,把原来的数据置为空,然后输入新的数据
    puse_t ppre,pcur;
    ppre = NULL;
    pcur = *head;
    puse_t ptem;

    char line[128];

    while(pcur!=NULL && pcur->us_id != val)
    {
    ppre = pcur;
    pcur = pcur->us_next;
    }

    if(pcur->us_id == val)
    {
    memset(line,0,sizeof(line));
    printf("输入要修改的值 用户ID 密码 权限(2代表管理员,1代表普通用户) ");
    fflush(stdout);

    fflush(stdin);
    fgets(line,sizeof(line),stdin);
    ptem = (puse_t)calloc(1,sizeof(use_t));//为新节点分配一个结构体,初始为空
    sscanf(line,"%d%s%d",&ptem->us_id,ptem->us_password,&ptem->us_permission);

    pcur->us_id = ptem->us_id;
    memcpy(pcur->us_password,ptem->us_password,sizeof(ptem->us_password));
    pcur->us_permission = ptem->us_permission;
    }
    }

    void fun7() //修改用户信息主函数
    {
    printf("更新用户信息");
    int n;
    puse_t head = NULL;
    file_to_user_link(&head);
    search_user(head);

    printf("输入要修改的用户ID: ");
    scanf("%d",&n);
    user_change(&head,n);
    search_user(head);
    link_to_file_user(head);
    backtofun();
    }

    /*------------------------------------------删除用户信息-----------------------------------------------------------------*/
    void user_delete(puse_t *head,int val) //s删除用户信息
    {
    puse_t pcur,ppre;
    pcur = *head;
    ppre = NULL;
    //没有找到符合条件的指针时候将指针依次向后挪
    while(pcur != NULL && pcur->us_id != val)
    {
    ppre = pcur;
    pcur = pcur->us_next;
    }

    //上述退出循环时候的指针要么是要找的指针,要么是尾部指针没有找到要删除的节点
    if(pcur != NULL)
    {
    if(ppre == NULL)//如果要删除的节点就是头指针
    {
    *head = pcur->us_next;
    free(pcur);
    pcur = NULL;
    }
    else //要删除的节点不是头指针
    {
    ppre->us_next = pcur->us_next;
    free(pcur);
    pcur = NULL;
    }

    }

    }
    void fun8() //修改用户信息主函数
    {
    printf("删除用户信息");
    int n;
    puse_t head = NULL;
    file_to_user_link(&head);
    search_user(head);

    printf("输入要删除的用户ID: ");
    scanf("%d",&n);
    user_delete(&head,n);
    search_user(head);
    link_to_file_user(head);
    backtofun();
    }

    /*-------------------------------------------主函数————————————————————————————————————————————————*/
    void main()
    {
    login();
    }

  • 相关阅读:
    轻量级微服务架构【读书笔记3】
    轻量级微服务架构【读书笔记2】
    轻量级微服务架构【读书笔记1】
    mvn package 和 mvn install
    SpringBoot 使用MultipartFile上传文件相关问题解决方案
    Docker学习笔记【三】安装Redis
    RESTful 最佳实战
    HTTP Status Codes 查询表
    扎实基础总述
    文本挖掘2相似度计算
  • 原文地址:https://www.cnblogs.com/lovely7/p/4491819.html
Copyright © 2011-2022 走看看