zoukankan      html  css  js  c++  java
  • 学生管理系统(list)

    学生管理系统:学习了一点文件指针的操作和链表操作,以前总想搞下子,刚好碰到同学要做这个,自己瞎搞了一通。

    实现功能:数据添加,查找,删除,插入,修改只是在查找加几句就没写。

    #include <cstdio>
    #include <iostream>
    #include <cstdlib>
    #include <algorithm>
    #include <ctime>
    #include <cmath>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <list>
    #include <vector>
    #include <map>
    #include <set>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    const double eps=1e-10;
    const double PI=acos(-1.0);
    #define maxn 500
    #define LEN sizeof(struct student)
    
    struct student
    {
        char number[20]; //学号
        char name[20];   //姓名
        char sex[5];    //性别
        char classn[20]; //班级
        int score1;     //数学分数
        int score2;     //英语分数
        int score3;     //计算机分数
        struct student *next;    //结构体指针
    };
    FILE *r;
    FILE *w;
    void Menu()//主菜单
    {
        system("cls");
        printf("************学生成绩管理系统****************
    ");
        printf("            1-文件读出学生信息
    ");
        printf("            2-手动输入学生信息读入到文件
    ");
        printf("            3-按学号查询学生信息
    ");
        printf("            4-按学号删除学生信息
    ");
        printf("            5-按学号从小到大插入学生信息
    ");
        printf("            6-浏览显示全部学生成绩
    ");
        printf("            0-退出
    ");
        printf("输入功能编号
    ");
    }
    struct student *tail;
    struct student *input()
    {
        struct student *head,*p1,*p2;
        //开辟一个LEN大小的空间,并让p1,p2指针指向它
        p2=p1=(struct student *)malloc(LEN);
        //将头指针置为NULL
        head=NULL;
        //创建链表节点并给节点的元素赋值
        //printf("请输入学生的学号和姓名:");
        //while(~scanf("%ld %s",&p1->num,p1->name);
        while(~fscanf(r,"%s%s%s%s%d%d%d",p1->number, p1->name, p1->sex, p1->classn, &p1->score1, &p1->score2, &p1->score3))
        {
            //n=n+1;
            if(NULL==head)
            {
                head=p1;
            }
            else
            {
                p2->next=p1;
            }
            p2=p1;
            p1=(struct student *)malloc(LEN);
    //        printf("请输入学生的学号和姓名:");
    //        scanf("%ld %s",&p1->num,p1->name);
        }
        //将尾节点的指针置为NULL
        p2->next=NULL;
        tail = p2;
        printf("从文件读出信息完毕
    ");
        printf("可以继续输入功能编号
    ");
        return head;
    }
    struct student * Add(struct student * head)
    {
        struct student *p1,*p2;
        //开辟一个LEN大小的空间,并让p1,p2指针指向它
        p2=p1=(struct student *)malloc(LEN);
    
        //创建链表节点并给节点的元素赋值
        printf("添加学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数
    ");
        printf("输入:2333 代表添加结束
    ");
        p2 = head;
    
        while(1)
        {
    
            scanf("%s",p1->number);
            if(strcmp(p1->number,"2333") == 0)
                break;
            scanf("%s%s%s%d%d%d",p1->name,p1->sex,p1->classn,&p1->score1,&p1->score2,&p1->score3);
            struct student *pp = p1;
            if(NULL==head)
            {
                head=p1;
            }
            else
            {
                p2->next=p1;
            }
            p2=p1;
            p1=(struct student *)malloc(LEN);
            fprintf(w,"%s %s %s %s %d %d %d
    ",pp->number, pp->name, pp->sex, pp->classn, pp->score1, pp->score2, pp->score3);
        }
        //将尾节点的指针置为NULL
        printf("添加信息到文件完毕
    ");
        printf("可以继续输入功能编号
    ");
        p2->next=NULL;
        return head;
    }
    
    void Serach(struct student * head)
    {
        struct student *p1,*p2;
        p1=head;
        printf("输入需要查询的学号");
        char number[20];
        scanf("%s",number);
        if(NULL==head)
        {
            printf("链表为空!
    ");
            return ;
        }
        //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
        //如果找到相应节点,或者已经遍历到尾节点就跳出循环
        while(strcmp(p1->number,number) != 0&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        if(strcmp(p1->number,number) == 0)
        printf("%s%9s%5s%6s%9d%9d%9d
    ",p1->number,p1->name,p1->sex, p1->classn, p1->score1, p1->score2, p1->score3);
        else
        printf("链表中没有要查询的元素.
    ");
        printf("可以继续输入功能编号
    ");
    }
    
    struct student * Delete(struct student * head)
    {
        struct student *p1;
        struct student *p2;
        p1=head;
        //判断链表是否为空
        printf("输入需要删除的学号");
        char number[20];
        scanf("%s",number);
        if(NULL==head)
        {
            printf("链表为空!
    ");
            return head;
        }
        //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
        //如果找到相应节点,或者已经遍历到尾节点就跳出循环
        while(strcmp(p1->number,number)!=0&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        //判断是否找到相应节点
        if(strcmp(p1->number,number) == 0)
        {
            //要删除的节点是不是链表的第一个节点
            //如果是,就将头指针指向该节点的后一个节点
            //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点
            if(head==p1)
            {
                head=p1->next;
            }
            else
            {
                p2->next=p1->next;
            }
            //n=n-1;
            printf("%s 节点已删除.
    ",number);
        }
        else
        {
            printf("链表中没有要删除的元素.
    ");
        }
        printf("可以继续输入功能编号
    ");
        return head;
    }
    
    struct student *Insert(struct student * head)
    {
        struct student *p0;
        struct student *p1;
        struct student *p2;
    
        p1=head;
        //判断链表是否为空,如果是空链表,就将新节点作为第一个节点
        printf("插入学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数
    ");
        printf("输入:1333 代表插入结束
    ");
        while(1)
        {
            p0=(struct student *)malloc(LEN);
            scanf("%s",p0->number);
            if(strcmp(p0->number,"1333") == 0)
                break;
            scanf("%s%s%s%d%d%d",p0->name,p0->sex,p0->classn,&p0->score1,&p0->score2,&p0->score3);
            if(NULL==head)
            {
                head=p0;
                p0->next=NULL;
            }
            else
            {
                //遍历每一个节点中的学号,与新学号比较大小
                //如果找到一个学号比新学号大,就将新学号的节点插入它之前
                //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部
                while(strcmp(p0->number,p1->number) > 0&&(p1->next!=NULL))
                {
                    p2=p1;
                    p1=p1->next;
                }
                //找到一个比新学号大的节点
                if(strcmp(p0->number, p1->number) <= 0)
                {
                    //判断该节点是否为头节点,如果是,则将新节点设置为头节点
                    if(p1==head)
                    {
                        head=p0;
                    }
                    else
                    {
                        p2->next=p0;
                    }
                      p0->next=p1;
                }
                else
                {
                    p1->next=p0;
                    p0->next=NULL;
                }
            }
            printf("%s 插入成功!
    ", p0->number);
        }
        printf("插入结束!
    ");
        printf("可以继续输入功能编号
    ");
        return head;
    }
    
    void Print(struct student *head)
    {
        struct student * p;
        p=head;
    
        //判断链表是否为空
        if(NULL==head)
        {
            printf("链表为空!
    ");
            return ;
        }
        else
        {
            //循环打印链表中的元素
            //printf("%d 个记录分别为:
    ",n);
            while(p!=NULL)
            {
                printf("%s %s
    ",p->number,p->name);
                //指针指向下一个节点
                p=p->next;
            }
        }
        printf("可以继续输入功能编号
    ");
    }
    
    int main()
    {
        Menu();
        int num;
        struct student *head =NULL;
        struct student *stu;
        tail = NULL;
        while(1)
        {
            scanf("%d", &num);
            Menu();
            if(num == 0)
                break;
            switch(num)
            {
                case 1://fopen("student.txt","r");//在根目录中
                        r = fopen("C:\Users\JONE\Desktop\student.txt", "r");
                        if (r==NULL) puts("null");
                        head = input();
                        fclose(r);
                        break;
                case 2:
                        w = fopen("C:\Users\JONE\Desktop\myfile.txt", "w");
                        if(w==NULL) puts("null");
                        if(head == NULL)
                            head = Add(tail);
                        else
                            tail = Add(tail);
                        fclose(w);
                        break;
                case 3:
                        Serach(head);
                        break;
                case 4:
                        head = Delete(head);
                        break;
                case 5:
                        head = Insert(head);
                        break;
                case 6:
                        Print(head);
                        break;
            }
        }
        return 0;
    }
  • 相关阅读:
    textarea 里设置 style="resize:none"
    linux 脚本
    RabbitMQ、Redis、ZeroMQ、ActiveMQ、Kafka/Jafka对比
    python安装过程
    linux下安装python3
    java实现定时任务 Schedule
    Spring 定时任务之 @Scheduled cron表达式
    docker部署
    设备连接服务器
    springboot实现fileUpLoad
  • 原文地址:https://www.cnblogs.com/ZP-Better/p/4830172.html
Copyright © 2011-2022 走看看