学生成绩管理系统——单链表

内容以借鉴为主,学习方法。本学生管理系统只有一组数据,多组数据时可借鉴。但较复杂,可采用数组等方法。这里不加描述,有时间以后再发。主要完成增删查改排序显示全部学生功能。任有缺陷,没有格式化输入,无登陆注册功能。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define h1 "===============数据如下==============\n"
#define h2 "|姓名 |学号|c语言|英语|高数|总成绩|\n"
#define h3 "=====|===========|=====|========\n"
#define h4 "|%-4s|%-4s|%4d|%4d|%4d|%4d|\n"
#define dataBase p->date.name,p->date.id,p->date.cResults,p->date.englishResults,p->date.mathematicsResults,p->date.total
#define END "------------------------------------\n"

int saveflog=0;
struct Student
{
    char name[10];
    char  id[10];
    int cResults;
    int englishResults;
    int mathematicsResults;
    int total;
};

typedef struct Record
{
    struct Student  date;
    struct Record  *next;
} record,*connect;

void Query(connect pCur) ;
void Alter(connect pCur);
void keep(connect pCur);
void Read();
void Sort(connect pCur);
void Delete(connect pCur) ;
void menu();
void Unfind();
void Wrong();
void Output(record *pp);
void Header();
void Display(connect pCur);
void  Add(connect pCur) ;
void Insert(connect pCur);
void mima ();
void chageMima ();

int main()
{
    connect pCur;
    record *p,*s;
    FILE *fp;
    pCur = (record *)malloc(sizeof(record));
    s=pCur;
    if(!pCur)
    {
        printf("没有申请到空间\n");
    }
    pCur->next=NULL;
    fp=fopen("student","ab+");
    if(fp==NULL)
    {
        printf("无法打开文档\n");
        exit(0);
    }
    while(!feof(fp))
    {
        p=(record *)malloc(sizeof(record));
        if(!p);
        {
            printf("没有申请成功\n");

        }
        if(fread(p,sizeof(record),1,fp)==1)
        {
            p->next=NULL;
            s->next=p;
            s=p;
        }

    }
    fclose(fp);
    printf("\n        ==========>打开文件成功==========\n");
    char ch='z';
    int a;
    while((ch!='m')&&(ch!='s'))
    {
        system("cls");
        printf("************学生成绩管理系统***************\n");
        printf("**                姓名:                           \n");
        printf("**                班级: 软件172                  \n");
        printf("**                学号:         \n");
        printf("请选择进入系统的身份。\n");
        printf("m, 管理员\ns, 学生\n");
        printf("请选择:");
        ch=getchar ();
        if(ch=='m')
        {
            system("cls");
            while(pCur)
            {
                printf("输入任意键继续");
                getchar();
                system("cls");
                menu();
                printf("输入操作指令,0为可进行保存:");
                scanf("%d",&a);

                if(a==0)
                {
                    if(saveflog==1)
                    {
                        getchar();
                        printf("\n==是否要保存==\n");
                        char ch;
                        scanf("%c",&ch);
                        if(ch=='y'||ch=='Y')
                        {
                            keep(pCur);
                        }
                        printf("=====保存成功=====");
                        getchar();
                    }
                }
                switch(a)
                {
                case 1:
                    Add (pCur);
                    break;
                case 2:
                    Alter(pCur);
                    break;
                case 3:
                    Query(pCur);
                    break;
                case 4:
                    Delete(pCur);
                    break;
                case 5:
                    Sort(pCur);
                    break;
                case 6:
                    Insert(pCur);
                    break;
                case 7:
                    Display(pCur);
                    break;
                default :
                    system("cls");
                    printf("\n\n\n\n==========输入任意键返回菜单==========\n");

                    getchar();
                    menu();
                    break;
                }
            }
        }

        else if(ch=='s')
        {
            while(1)
            {
                char m;
                m=0;
                while((m!='a')&&(m!='b'))
                {
                    system("cls");
                    printf("--------------欢迎你来到学生成绩管理系统------------------\n");
                    printf("a,查询成绩              b,学生成绩排名         c,退出系统\n");
                    printf("请你输入命令:");
                    m=getchar ();
                    if(m=='a')
                    {
                        Query(pCur);
                        getchar ();
                    }
                    else
                    {
                        if(m=='b')
                        {
                            Sort(pCur);
                            getchar ();
                        }
                        else
                        {
                            if(m=='c')
                            {

                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}

void menu()
{
    printf("\t***********************************\n");
    printf("\t*        学生信息管理系统       * \n");
    printf("\t************************************\n");
    printf("\t************************************\n");
    printf("\t*    *1.添加信息   *2.修改信息             \n");
    printf("\t*                                          \n");
    printf("\t*    *3.查询信息   *4.删除信息              \n");
    printf("\t*                                           \n");
    printf("\t*    *5.数据排序   *6.插入信息              \n");
    printf("\t*                                           \n");
    printf("\t*    *7.打印数据    *8.教师密码修改\n");
    printf("\t*                                           \n");
    printf("\t*     *0.保存数据返回菜单                                          \n");
    printf("\t************************************* \n");
    printf("\t*************************************\n");
}


void keep(connect pCur)//保存数据
{
    FILE *fp;
    record *p;
    int a=0;
    if((fp=fopen("student","wb"))==NULL)
    {
        printf("\t      打开文件失败...");
        getch();
        system("cls");
        return;
    }
    p=pCur->next;
    while(p)
    {
        if( fwrite(p,sizeof(record),1,fp)==1)
        {
            p=p->next;
            a++;
        }
        else
        {
            break;
        }
    }
    if(a>0)
    {
        printf("\n\t      数据保存成功...");
        getchar();
        system("cls");
    }
    else
    {
        system("cls");
        printf("\n\t      数据保存失败...");
        getchar();

    }
    fclose(fp);
}

void Alter(connect pCur)//信息修改
{
    system("cls");
    printf("\n----------------------------------------------------\n");
    printf("\t      ───修改信息───\n");
    printf("\t        *********************\n");
    printf("\t       *1.按学号修改       \n");
    printf("\t       *                           \n");
    printf("\t        *********************\n");

    record *p=pCur->next;
    char  findmess[20];
    printf("输出学生信息");
    Display(pCur);
    printf("输入要修改的学生学号:");
    scanf("%s",findmess);

    while(p)
    {
        if(strcmp(p->date.id,findmess)==0)
        {
            printf("输入学生的学号为");
            scanf("%s",p->date.id);
            printf("输入学生名字");
            scanf("%s",p->date.name);
            printf("输入新的c语言的成绩");
            scanf("%d",&p->date.cResults);
            printf("输入新的英语的成绩");
            scanf("%d",&p->date.englishResults);
            printf("输入新的高数的成绩");
            scanf("%d",&p->date.mathematicsResults);
            system("cls");
            Display(p);
            printf("\n=====》修改成功《=====\n");
            break;
        }
        p=p->next;
    }
    if(p==NULL)
    {
        getchar();
        printf("没有此学生");
    }
}



void Query(connect pCur)
{
    system("cls");
    printf("----------------------------------------------------\n");
    printf("\t      ───查询信息───\n");
    printf("\t  ┌─────────────┐\n");
    printf("\t  │1.按学号查询                        \n");
    printf("\t  │                                             \n");
    printf("\t  └─────────────┘\n");
    record *p=pCur->next;
    char id[20];
    printf("输入要查询的学生学号:");
    scanf("%s",id);
    while(p)
    {

        if(strcmp(p->date.id,id)==0)
        {
            Header();
            Output(p);
            printf(END);
            getchar();

        }
        p=p->next;
    }

    if(p==NULL)
    {
        getchar();
        printf("无此学生");
    }

}

void Delete(connect pCur)
{
    system("cls");

    printf("----------------------------------------------------\n");
    printf("\t      ───删除信息───\n");
    printf("\t        ********************\n");
    printf("\t        *1.按学号删除\n");
    printf("\t        *******************\n");
    record *p=pCur->next;
    record *pre=pCur,*r=p,*rpre=pre;
    char findmess[20];
    Display(pCur);
    printf("输入要删除的学号");
    scanf("%s",findmess);
   if(p)
    {
        if(strcmp(p->date.id,findmess)==0)
        {
            r=p;
            rpre=pre;

        pre=p;
        p=p->next;
        rpre->next=r->next;
    free(r);
    getchar();
    printf("删除成功\n");
    saveflog=1;
        }
        else
        {
            getchar();
            printf("无此学生");
        }
    }

}

void Sort(connect pCur)
{
    printf("----------------------------------------------------\n");
    printf("\t      ───数据排序───\n");
    printf("\t        ┌──────┐\n");
    printf("\t        │1.按总分排序│\n");
    printf("\t        │            │\n");
    printf("\t        │*************│\n");
    printf("\t        └──────┘\n");
   connect pc;
            record *p,*r,*s;
            int i=0;
            if(pCur->next==NULL)
            {
                system("cls");
                printf("=====无学生记录=====");
                getchar();
                return ;
            }// 判断传入的链表是否为空
            pc = (record *)malloc(sizeof(record));//给pc空间
            if(!pc)
            {
                printf("\n申请空间错误");
                return ;
            }//判断链表是否申请成功
            pc->next=NULL;//完成链表申请
            system("cls"); //进行清屏
            Display(pCur);//显示排序前学生的信息
            p=pCur->next;//将pCur->next的指针给p
            while(p!=NULL)
            {
                s=(record *)malloc(sizeof(record));//新建节点给s空间,用于保存从原链表中取出的节点信息
                if(!s)
                {
                    printf("\n申请空间错误");
                    return ;//返回
                }//判断是否申请成功
                s->date=p->date;//将pCur的数据域给s
                s->next=NULL;//指针域为空
                r=pc;// 用于储存插入单个节点后保持排序的节点
						//Pc为链表的头指针,每次插入从头开始
                while(r->next!=NULL&&r->next->date.total>=p->date.total)
                {
                    r=r->next;
						//指针移动到比p所指总分小的节点位置
                }
                if(r->next==NULL)
                {	//如果pc的所有节点的总分都比p->date.total大时,就将p指的节点加到尾部
                    r->next=s;
                }
                else
                {//否则将该节点插入至第一个总分比它小的节点前面
                    s->next=r->next;
                    r->next=s;
                }
                p=p->next;//原链表的指针下移一个
            }
            pCur->next=pc->next;//pc中储存的是已经排好序的头指针
            p=pCur->next;//排好序的头指针赋给p进行名次的填写
            while(p!=NULL)
            {
                i++;//节点序号
                p->date.total=i;//名次的赋值
                p=p->next;//指针后移
            }
            Display(pCur);


        }


void Insert(connect pCur)
{
    connect p,n,newinsert;
    char id2[20];
    char ch;
    int flog=0;
    n=pCur->next;
    system("cls");
    Display(pCur);
    printf("输入要插入之前的学号:");
    scanf("%s",id2);
    while(pCur)
    {

        flog=0;
        n=pCur->next;
        while(n)
        {
            if(strcmp(n->date.id,id2)==0);
            {
                flog=1;
                break;
            }
            n=n->next;

        }
        if(flog==1)
            break;
        else
        {
            getchar();
            printf("学生学号不存在,输入y,Y继续,输入其他结束程序\n");
            scanf("%c",&ch);
            if(ch=='y'||ch=='Y')
            {
                continue;
            }
            else
            {
                return ;
            }
        }
    }
    printf("输入要插入的学号");
    char id3[20];
    scanf("%s",id3);
    n=pCur->next;
    while(n)
    {
        if(strcmp(n->date.id,id3)==0)
        {
            printf("此学号已存在");
            Header();
            Output(n);
            printf("\n");
            getchar();
            return ;
        }
        n=n->next;
    }
    newinsert = (record *)malloc(sizeof(record));
    if(newinsert==NULL)
    {
        printf("未申请到空间");
        return ;
    }
    strcpy( newinsert->date.id,id3);
    printf("输入学生学号:%s\n",newinsert->date.id);
    printf("输入学生姓名:");
    scanf("%s",newinsert->date.name);
    printf("输入学生c语言成绩:");
    scanf("%d",&newinsert->date.cResults);
    printf("输入学生英语成绩:");
    scanf("%d",&newinsert->date.englishResults);
    printf("输入学生高数成绩:");
    scanf("%d",&newinsert->date.mathematicsResults);
    newinsert->date.total=newinsert->date.cResults+newinsert->date.englishResults+newinsert->date.mathematicsResults;
    newinsert->next=NULL;
    saveflog=1;
    p=pCur->next;
    while(pCur)
    {
        if(strcmp(p->date.id,id2)==0)
        {
            newinsert->next=p->next;
            p->next=newinsert;
            break;
        }
        p=p->next;
    }
    system("cls");
    Display(pCur);

}


void  Add(connect pCur)
{
    record *p,*r,*s;
    char ch;
    int  flog=0;
    char num[20];
    r=pCur;
    s=pCur->next;
    system("cls");
    Display(pCur);
    while(r->next!=NULL)
    {
        r=r->next;
    }

    while(pCur)
    {
        while(pCur)
        {
            printf("输入学号进行对比,没有则继续,有则重新输入,0为返回进行保存");
            printf("\n");
            scanf("%s",num);
            flog=0;
            if(strcmp(num,"0")==0)
            {
                system("cls");
                return ;
            }
            s=pCur->next;
            while(s)
            {
                if(strcmp(s->date.id,num)==0)
                {
                    flog=1;
                    break;
                }
                s=s->next;
            }
            if(flog==1)
            {
                getchar();
                printf("学号重复是否重新输入,重新输入y或Y");
                scanf("%c",&ch);
                if(ch=='y'||ch=='Y')
                {
                    continue;
                }
                else
                {

                    menu();
                }
            }
            else
            {
                break;
            }
        }
        p=(record *)malloc(sizeof(record));
        if(!p)
        {
            printf("未申请到空间");
            return ;
        }
        printf("输入学号:");
        scanf("%s",p->date.id);

        printf("学生姓名:");
        scanf("%s",p->date.name);
        printf("学生c成绩:");
        scanf("%d",&p->date.cResults);
        printf("学生英语成绩:");
        scanf("%d",&p->date.englishResults);
        printf("学生高数成绩:");
        scanf("%d",&p->date.mathematicsResults);
        p->date.total=p->date.cResults+p->date.englishResults+p->date.mathematicsResults;
        p->next=NULL;
        r->next=p;
        r=p;
        saveflog=1;
    }
    return ;

}

void Display(connect pCur)//表格形式显示记录
{
    record *p;
    p=pCur->next;
    if(!p)
    {
        printf("\n***************没有学生被记录***************\n");
        getchar();
        return;
    }
    printf("\n\n");
    Header();
    while(p)
    {
        Output(p);
        p=p->next;
        printf(h3);
    }
    getchar();
}


void Header()
{
    printf(h1);
    printf(h2);
    printf(h3);
}

void Output(record *pp)
{
    record* p;
    p=pp;
    printf(h4,dataBase);
}



void Unfind()
{
    printf("\n=========>未查到此学生信息!<==========\n");
}











猜你喜欢

转载自blog.csdn.net/LIUZHIOJ/article/details/80713525