学生管理系统(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("************学生成绩管理系统****************\n");
    printf("            1-文件读出学生信息\n");
    printf("            2-手动输入学生信息读入到文件\n");
    printf("            3-按学号查询学生信息\n");
    printf("            4-按学号删除学生信息\n");
    printf("            5-按学号从小到大插入学生信息\n");
    printf("            6-浏览显示全部学生成绩\n");
    printf("            0-退出\n");
    printf("输入功能编号\n");
}
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("从文件读出信息完毕\n");
    printf("可以继续输入功能编号\n");
    return head;
}
struct student * Add(struct student * head)
{
    struct student *p1,*p2;
    //开辟一个LEN大小的空间,并让p1,p2指针指向它
    p2=p1=(struct student *)malloc(LEN);

    //创建链表节点并给节点的元素赋值
    printf("添加学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n");
    printf("输入:2333 代表添加结束\n");
    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\n",pp->number, pp->name, pp->sex, pp->classn, pp->score1, pp->score2, pp->score3);
    }
    //将尾节点的指针置为NULL
    printf("添加信息到文件完毕\n");
    printf("可以继续输入功能编号\n");
    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("链表为空!\n");
        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\n",p1->number,p1->name,p1->sex, p1->classn, p1->score1, p1->score2, p1->score3);
    else
    printf("链表中没有要查询的元素.\n");
    printf("可以继续输入功能编号\n");
}

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("链表为空!\n");
        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 节点已删除.\n",number);
    }
    else
    {
        printf("链表中没有要删除的元素.\n");
    }
    printf("可以继续输入功能编号\n");
    return head;
}

struct student *Insert(struct student * head)
{
    struct student *p0;
    struct student *p1;
    struct student *p2;

    p1=head;
    //判断链表是否为空,如果是空链表,就将新节点作为第一个节点
    printf("插入学生编号,姓名,性别,班级,数学分数,英语分数,计算机分数\n");
    printf("输入:1333 代表插入结束\n");
    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 插入成功!\n", p0->number);
    }
    printf("插入结束!\n");
    printf("可以继续输入功能编号\n");
    return head;
}

void Print(struct student *head)
{
    struct student * p;
    p=head;

    //判断链表是否为空
    if(NULL==head)
    {
        printf("链表为空!\n");
        return ;
    }
    else
    {
        //循环打印链表中的元素
        //printf("%d 个记录分别为:\n",n);
        while(p!=NULL)
        {
            printf("%s %s\n",p->number,p->name);
            //指针指向下一个节点
            p=p->next;
        }
    }
    printf("可以继续输入功能编号\n");
}

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;
}

 

posted @ 2015-09-22 20:00  JoneZP  阅读(511)  评论(0编辑  收藏  举报